Tweak "expected ident" parse error to avoid talking about doc comments
When encountering a doc comment without an identifier after, we'd unconditionally state "this doc comment doesn't document anything", swallowing the *actual* error which is that the thing *after* the doc comment wasn't expected. Added a check that the found token is something that "conceptually" closes the previous item before emitting that error, otherwise just complain about the missing identifier. In both of the following cases, the syntax error follows a doc comment: ``` error: expected identifier, found keyword `Self` --> $DIR/doc-before-bad-variant.rs:4:5 | LL | enum TestEnum { | -------- while parsing this enum ... LL | Self, | ^^^^ expected identifier, found keyword | = help: enum variants can be `Variant`, `Variant = <integer>`, `Variant(Type, ..., TypeN)` or `Variant { fields: Types }` ``` ``` error: expected identifier, found `<` --> $DIR/doc-before-syntax-error.rs:2:1 | LL | <> | ^ expected identifier ``` Fix #71982.
This commit is contained in:
parent
d88ffcdb8b
commit
a090e76dab
5 changed files with 38 additions and 7 deletions
|
@ -301,13 +301,6 @@ impl<'a> Parser<'a> {
|
|||
&mut self,
|
||||
recover: bool,
|
||||
) -> PResult<'a, (Ident, IdentIsRaw)> {
|
||||
if let TokenKind::DocComment(..) = self.prev_token.kind {
|
||||
return Err(self.dcx().create_err(DocCommentDoesNotDocumentAnything {
|
||||
span: self.prev_token.span,
|
||||
missing_comma: None,
|
||||
}));
|
||||
}
|
||||
|
||||
let valid_follow = &[
|
||||
TokenKind::Eq,
|
||||
TokenKind::Colon,
|
||||
|
@ -319,6 +312,15 @@ impl<'a> Parser<'a> {
|
|||
TokenKind::CloseDelim(Delimiter::Brace),
|
||||
TokenKind::CloseDelim(Delimiter::Parenthesis),
|
||||
];
|
||||
if let TokenKind::DocComment(..) = self.prev_token.kind
|
||||
&& valid_follow.contains(&self.token.kind)
|
||||
{
|
||||
let err = self.dcx().create_err(DocCommentDoesNotDocumentAnything {
|
||||
span: self.prev_token.span,
|
||||
missing_comma: None,
|
||||
});
|
||||
return Err(err);
|
||||
}
|
||||
|
||||
let mut recovered_ident = None;
|
||||
// we take this here so that the correct original token is retained in
|
||||
|
|
6
tests/ui/parser/doc-before-bad-variant.rs
Normal file
6
tests/ui/parser/doc-before-bad-variant.rs
Normal file
|
@ -0,0 +1,6 @@
|
|||
enum TestEnum {
|
||||
Works,
|
||||
/// Some documentation
|
||||
Self, //~ ERROR expected identifier, found keyword `Self`
|
||||
//~^ HELP enum variants can be
|
||||
}
|
13
tests/ui/parser/doc-before-bad-variant.stderr
Normal file
13
tests/ui/parser/doc-before-bad-variant.stderr
Normal file
|
@ -0,0 +1,13 @@
|
|||
error: expected identifier, found keyword `Self`
|
||||
--> $DIR/doc-before-bad-variant.rs:4:5
|
||||
|
|
||||
LL | enum TestEnum {
|
||||
| -------- while parsing this enum
|
||||
...
|
||||
LL | Self,
|
||||
| ^^^^ expected identifier, found keyword
|
||||
|
|
||||
= help: enum variants can be `Variant`, `Variant = <integer>`, `Variant(Type, ..., TypeN)` or `Variant { fields: Types }`
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
2
tests/ui/parser/doc-before-syntax-error.rs
Normal file
2
tests/ui/parser/doc-before-syntax-error.rs
Normal file
|
@ -0,0 +1,2 @@
|
|||
/// Some documentation
|
||||
<> //~ ERROR expected identifier
|
8
tests/ui/parser/doc-before-syntax-error.stderr
Normal file
8
tests/ui/parser/doc-before-syntax-error.stderr
Normal file
|
@ -0,0 +1,8 @@
|
|||
error: expected identifier, found `<`
|
||||
--> $DIR/doc-before-syntax-error.rs:2:1
|
||||
|
|
||||
LL | <>
|
||||
| ^ expected identifier
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue