@@ -1049,6 +1049,23 @@ impl<'a> Parser<'a> {
1049
1049
let mut seq = self . parse_paren_expr_seq ( ) . map ( |args| {
1050
1050
self . mk_expr ( lo. to ( self . prev_token . span ) , self . mk_call ( fun, args) , AttrVec :: new ( ) )
1051
1051
} ) ;
1052
+ if let Some ( expr) =
1053
+ self . maybe_recover_struct_lit_bad_delims ( lo, open_paren, & mut seq, snapshot)
1054
+ {
1055
+ return expr;
1056
+ }
1057
+ self . recover_seq_parse_error ( token:: Paren , lo, seq)
1058
+ }
1059
+
1060
+ /// If we encounter a parser state that looks like the user has written a `struct` literal with
1061
+ /// parentheses instead of braces, recover the parser state and provide suggestions.
1062
+ fn maybe_recover_struct_lit_bad_delims (
1063
+ & mut self ,
1064
+ lo : Span ,
1065
+ open_paren : Span ,
1066
+ seq : & mut PResult < ' a , P < Expr > > ,
1067
+ snapshot : Option < ( Self , ExprKind ) > ,
1068
+ ) -> Option < P < Expr > > {
1052
1069
match ( seq. as_mut ( ) , snapshot) {
1053
1070
( Err ( ref mut err) , Some ( ( mut snapshot, ExprKind :: Path ( None , path) ) ) ) => {
1054
1071
let name = pprust:: path_to_string ( & path) ;
@@ -1079,15 +1096,15 @@ impl<'a> Parser<'a> {
1079
1096
Applicability :: MaybeIncorrect ,
1080
1097
)
1081
1098
. emit ( ) ;
1082
- return self . mk_expr_err ( span) ;
1099
+ return Some ( self . mk_expr_err ( span) ) ;
1083
1100
}
1084
1101
Ok ( _) => { }
1085
1102
Err ( mut err) => err. emit ( ) ,
1086
1103
}
1087
1104
}
1088
1105
_ => { }
1089
1106
}
1090
- self . recover_seq_parse_error ( token :: Paren , lo , seq )
1107
+ None
1091
1108
}
1092
1109
1093
1110
/// Parse an indexing expression `expr[...]`.
0 commit comments