@@ -1258,8 +1258,11 @@ impl<'a> Parser<'a> {
1258
1258
1259
1259
/// Parse an indexing expression `expr[...]`.
1260
1260
fn parse_index_expr ( & mut self , lo : Span , base : P < Expr > ) -> PResult < ' a , P < Expr > > {
1261
+ let prev_span = self . prev_token . span ;
1262
+ let open_delim_span = self . token . span ;
1261
1263
self . bump ( ) ; // `[`
1262
1264
let index = self . parse_expr ( ) ?;
1265
+ self . suggest_missing_semicolon_before_array ( prev_span, open_delim_span) ?;
1263
1266
self . expect ( & token:: CloseDelim ( Delimiter :: Bracket ) ) ?;
1264
1267
Ok ( self . mk_expr ( lo. to ( self . prev_token . span ) , self . mk_index ( base, index) , AttrVec :: new ( ) ) )
1265
1268
}
@@ -2056,6 +2059,45 @@ impl<'a> Parser<'a> {
2056
2059
}
2057
2060
}
2058
2061
2062
+ fn suggest_missing_semicolon_before_array (
2063
+ & self ,
2064
+ prev_span : Span ,
2065
+ open_delim_span : Span ,
2066
+ ) -> PResult < ' a , ( ) > {
2067
+ if self . token . kind == token:: Comma {
2068
+ let mut snapshot = self . create_snapshot_for_diagnostic ( ) ;
2069
+ snapshot. bump ( ) ;
2070
+ match snapshot. parse_seq_to_before_end (
2071
+ & token:: CloseDelim ( Delimiter :: Bracket ) ,
2072
+ SeqSep :: trailing_allowed ( token:: Comma ) ,
2073
+ |p| p. parse_expr ( ) ,
2074
+ ) {
2075
+ Ok ( _)
2076
+ // When the close delim is `)`, `token.kind` is expected to be `token::CloseDelim(Delimiter::Parenthesis)`,
2077
+ // but the actual `token.kind` is `token::CloseDelim(Delimiter::Bracket)`.
2078
+ // This is because the `token.kind` of the close delim is treated as the same as
2079
+ // that of the open delim in `TokenTreesReader::parse_token_tree`, even if the delimiters of them are different.
2080
+ // Therefore, `token.kind` should not be compared here.
2081
+ if snapshot
2082
+ . span_to_snippet ( snapshot. token . span )
2083
+ . map_or ( false , |snippet| snippet == "]" ) =>
2084
+ {
2085
+ let mut err = self . struct_span_err ( open_delim_span, "expected `;`, found `[`" ) ;
2086
+ err. span_suggestion_verbose (
2087
+ prev_span. shrink_to_hi ( ) ,
2088
+ "consider adding `;` here" ,
2089
+ ';' ,
2090
+ Applicability :: MaybeIncorrect ,
2091
+ ) ;
2092
+ return Err ( err) ;
2093
+ }
2094
+ Ok ( _) => ( ) ,
2095
+ Err ( err) => err. cancel ( ) ,
2096
+ }
2097
+ }
2098
+ Ok ( ( ) )
2099
+ }
2100
+
2059
2101
/// Parses a block or unsafe block.
2060
2102
pub ( super ) fn parse_block_expr (
2061
2103
& mut self ,
0 commit comments