@@ -1236,6 +1236,38 @@ impl<'a> Parser<'a> {
1236
1236
1237
1237
/// Parse an indexing expression `expr[...]`.
1238
1238
fn parse_index_expr ( & mut self , lo : Span , base : P < Expr > ) -> PResult < ' a , P < Expr > > {
1239
+ if self . prev_token . is_ident ( )
1240
+ && matches ! ( self . token. kind, token:: OpenDelim ( Delimiter :: Bracket ) )
1241
+ && self . look_ahead ( 1 , |t| t. is_lit ( ) )
1242
+ && self . look_ahead ( 2 , |t| matches ! ( t. kind, token:: Semi ) )
1243
+ && self . look_ahead ( 3 , |t| t. is_lit ( ) )
1244
+ && self . look_ahead ( 4 , |t| matches ! ( t. kind, token:: CloseDelim ( Delimiter :: Bracket ) ) )
1245
+ && let token:: Ident ( symbol, _) = self . prev_token . kind
1246
+ && self . may_recover ( )
1247
+ {
1248
+ let ident = symbol. as_str ( ) . to_owned ( ) ;
1249
+ self . bump ( ) ; // [
1250
+ if let token:: Literal ( lit) = self . token . kind {
1251
+ let lit1 = lit. symbol . as_str ( ) . to_owned ( ) ;
1252
+ self . bump ( ) ; // lit
1253
+ let span = self . token . span ;
1254
+ self . bump ( ) ; // ;
1255
+ if let token:: Literal ( lit) = self . token . kind {
1256
+ let lit2 = lit. symbol . as_str ( ) . to_owned ( ) ;
1257
+ let mut err = self . struct_span_err (
1258
+ span,
1259
+ "expected one of `.`, `?`, `]`, or an operator, found `;`" ,
1260
+ ) ;
1261
+ err. span_label (
1262
+ span,
1263
+ "expected one of `.`, `?`, `]`, or an operator" ,
1264
+ ) ;
1265
+ err. note ( format ! ( "`[{}; {}]` would construct an array literal, but not immediately following the identifier `{}`" , lit1, lit2, ident) ) ;
1266
+ return Err ( err) ;
1267
+ }
1268
+ }
1269
+ }
1270
+
1239
1271
let prev_span = self . prev_token . span ;
1240
1272
let open_delim_span = self . token . span ;
1241
1273
self . bump ( ) ; // `[`
0 commit comments