diff --git a/compiler/rustc_parse/src/parser/expr.rs b/compiler/rustc_parse/src/parser/expr.rs index 2fc8ce98af04d..221da541367a6 100644 --- a/compiler/rustc_parse/src/parser/expr.rs +++ b/compiler/rustc_parse/src/parser/expr.rs @@ -1236,6 +1236,38 @@ impl<'a> Parser<'a> { /// Parse an indexing expression `expr[...]`. fn parse_index_expr(&mut self, lo: Span, base: P) -> PResult<'a, P> { + if self.prev_token.is_ident() + && matches!(self.token.kind, token::OpenDelim(Delimiter::Bracket)) + && self.look_ahead(1, |t| t.is_lit()) + && self.look_ahead(2, |t| matches!(t.kind, token::Semi)) + && self.look_ahead(3, |t| t.is_lit()) + && self.look_ahead(4, |t| matches!(t.kind, token::CloseDelim(Delimiter::Bracket))) + && let token::Ident(symbol, _) = self.prev_token.kind + && self.may_recover() + { + let ident = symbol.as_str().to_owned(); + self.bump(); // [ + if let token::Literal(lit) = self.token.kind { + let lit1 = lit.symbol.as_str().to_owned(); + self.bump(); // lit + let span = self.token.span; + self.bump(); // ; + if let token::Literal(lit) = self.token.kind { + let lit2 = lit.symbol.as_str().to_owned(); + let mut err = self.struct_span_err( + span, + "expected one of `.`, `?`, `]`, or an operator, found `;`", + ); + err.span_label( + span, + "expected one of `.`, `?`, `]`, or an operator", + ); + err.note(format!("`[{}; {}]` would construct an array literal, but not immediately following the identifier `{}`", lit1, lit2, ident)); + return Err(err); + } + } + } + let prev_span = self.prev_token.span; let open_delim_span = self.token.span; self.bump(); // `[` diff --git a/tests/ui/issues/issue-107518.rs b/tests/ui/issues/issue-107518.rs new file mode 100644 index 0000000000000..3bc6e47b22b38 --- /dev/null +++ b/tests/ui/issues/issue-107518.rs @@ -0,0 +1,8 @@ +fn main() { + (a_function_that_takes_an_array[0; 10]); + //~^ ERROR expected one of `.`, `?`, `]`, or an operator, found `;` +} + +fn a_function_that_takes_an_array(arg: [u8; 10]) { + let _ = arg; +} diff --git a/tests/ui/issues/issue-107518.stderr b/tests/ui/issues/issue-107518.stderr new file mode 100644 index 0000000000000..ffc41b34717b0 --- /dev/null +++ b/tests/ui/issues/issue-107518.stderr @@ -0,0 +1,10 @@ +error: expected one of `.`, `?`, `]`, or an operator, found `;` + --> $DIR/issue-107518.rs:2:38 + | +LL | (a_function_that_takes_an_array[0; 10]); + | ^ expected one of `.`, `?`, `]`, or an operator + | + = note: `[0; 10]` would construct an array literal, but not immediately following the identifier `a_function_that_takes_an_array` + +error: aborting due to previous error +