1
Fork 0

improve errors for incomplete functions in struct definitions

This commit is contained in:
Takayuki Maeda 2022-09-27 17:20:55 +09:00
parent 57ee5cf5a9
commit d7b6bd8f13
5 changed files with 42 additions and 16 deletions

View file

@ -1753,18 +1753,24 @@ impl<'a> Parser<'a> {
}; };
// We use `parse_fn` to get a span for the function // We use `parse_fn` to get a span for the function
let fn_parse_mode = FnParseMode { req_name: |_| true, req_body: true }; let fn_parse_mode = FnParseMode { req_name: |_| true, req_body: true };
if let Err(mut db) = match self.parse_fn(&mut AttrVec::new(), fn_parse_mode, lo, &inherited_vis) {
self.parse_fn(&mut AttrVec::new(), fn_parse_mode, lo, &inherited_vis) Ok(_) => {
{ let mut err = self.struct_span_err(
db.delay_as_bug(); lo.to(self.prev_token.span),
&format!("functions are not allowed in {adt_ty} definitions"),
);
err.help(
"unlike in C++, Java, and C#, functions are declared in `impl` blocks",
);
err.help("see https://doc.rust-lang.org/book/ch05-03-method-syntax.html for more information");
err
}
Err(err) => {
err.cancel();
self.restore_snapshot(snapshot);
self.expected_ident_found()
}
} }
let mut err = self.struct_span_err(
lo.to(self.prev_token.span),
&format!("functions are not allowed in {adt_ty} definitions"),
);
err.help("unlike in C++, Java, and C#, functions are declared in `impl` blocks");
err.help("see https://doc.rust-lang.org/book/ch05-03-method-syntax.html for more information");
err
} else if self.eat_keyword(kw::Struct) { } else if self.eat_keyword(kw::Struct) {
match self.parse_item_struct() { match self.parse_item_struct() {
Ok((ident, _)) => { Ok((ident, _)) => {

View file

@ -3,7 +3,7 @@
struct Baz { struct Baz {
inner : dyn fn () inner : dyn fn ()
//~^ ERROR expected `,`, or `}`, found keyword `fn` //~^ ERROR expected `,`, or `}`, found keyword `fn`
//~| ERROR functions are not allowed in struct definitions //~| ERROR expected identifier, found keyword `fn`
//~| ERROR cannot find type `dyn` in this scope //~| ERROR cannot find type `dyn` in this scope
} }

View file

@ -4,16 +4,18 @@ error: expected `,`, or `}`, found keyword `fn`
LL | inner : dyn fn () LL | inner : dyn fn ()
| ^ help: try adding a comma: `,` | ^ help: try adding a comma: `,`
error: functions are not allowed in struct definitions error: expected identifier, found keyword `fn`
--> $DIR/fn-field-parse-error-ice.rs:4:17 --> $DIR/fn-field-parse-error-ice.rs:4:17
| |
LL | struct Baz { LL | struct Baz {
| --- while parsing this struct | --- while parsing this struct
LL | inner : dyn fn () LL | inner : dyn fn ()
| ^^ | ^^ expected identifier, found keyword
| |
= help: unlike in C++, Java, and C#, functions are declared in `impl` blocks help: escape `fn` to use it as an identifier
= help: see https://doc.rust-lang.org/book/ch05-03-method-syntax.html for more information |
LL | inner : dyn r#fn ()
| ++
error[E0412]: cannot find type `dyn` in this scope error[E0412]: cannot find type `dyn` in this scope
--> $DIR/fn-field-parse-error-ice.rs:4:13 --> $DIR/fn-field-parse-error-ice.rs:4:13

View file

@ -0,0 +1,5 @@
fn main() {}
struct S {
fn //~ ERROR expected identifier, found keyword `fn`
}

View file

@ -0,0 +1,13 @@
error: expected identifier, found keyword `fn`
--> $DIR/incomplete-fn-in-struct-definition.rs:4:5
|
LL | fn
| ^^ expected identifier, found keyword
|
help: escape `fn` to use it as an identifier
|
LL | r#fn
| ++
error: aborting due to previous error