@@ -652,9 +652,11 @@ impl<'a> Parser<'a> {
652652 } else {
653653 let token_str = Parser :: token_to_string ( t) ;
654654 let this_token_str = self . this_token_to_string ( ) ;
655- Err ( self . fatal ( & format ! ( "expected `{}`, found `{}`" ,
656- token_str,
657- this_token_str) ) )
655+ let mut err = self . fatal ( & format ! ( "expected `{}`, found `{}`" ,
656+ token_str,
657+ this_token_str) ) ;
658+ err. span_label ( self . span , format ! ( "expected `{}`" , token_str) ) ;
659+ Err ( err)
658660 }
659661 } else {
660662 self . expect_one_of ( unsafe { slice:: from_raw_parts ( t, 1 ) } , & [ ] )
@@ -1172,7 +1174,7 @@ impl<'a> Parser<'a> {
11721174 sep : SeqSep ,
11731175 f : F )
11741176 -> PResult < ' a , Vec < T > > where
1175- F : FnMut ( & mut Parser < ' a > ) -> PResult < ' a , T > ,
1177+ F : FnMut ( & mut Parser < ' a > ) -> PResult < ' a , T > ,
11761178 {
11771179 self . expect ( bra) ?;
11781180 let result = self . parse_seq_to_before_end ( ket, sep, f) ?;
@@ -1190,7 +1192,7 @@ impl<'a> Parser<'a> {
11901192 sep : SeqSep ,
11911193 f : F )
11921194 -> PResult < ' a , Spanned < Vec < T > > > where
1193- F : FnMut ( & mut Parser < ' a > ) -> PResult < ' a , T > ,
1195+ F : FnMut ( & mut Parser < ' a > ) -> PResult < ' a , T > ,
11941196 {
11951197 let lo = self . span ;
11961198 self . expect ( bra) ?;
@@ -3212,7 +3214,23 @@ impl<'a> Parser<'a> {
32123214 err. span_label ( sp, "expected if condition here" ) ;
32133215 return Err ( err)
32143216 }
3215- let thn = self . parse_block ( ) ?;
3217+ let not_block = self . token != token:: OpenDelim ( token:: Brace ) ;
3218+ let fat_arrow_sp = if self . token == token:: FatArrow {
3219+ Some ( self . span )
3220+ } else {
3221+ None
3222+ } ;
3223+ let thn = self . parse_block ( ) . map_err ( |mut err| {
3224+ if let Some ( sp) = fat_arrow_sp {
3225+ // if cond => expr
3226+ err. span_suggestion ( sp,
3227+ "only necessary in match arms, not before if blocks" ,
3228+ "" . to_string ( ) ) ;
3229+ } else if not_block {
3230+ err. span_label ( lo, "this `if` statement has a condition, but no block" ) ;
3231+ }
3232+ err
3233+ } ) ?;
32163234 let mut els: Option < P < Expr > > = None ;
32173235 let mut hi = thn. span ;
32183236 if self . eat_keyword ( keywords:: Else ) {
@@ -3629,8 +3647,9 @@ impl<'a> Parser<'a> {
36293647 self . bump ( ) ;
36303648 if self . token != token:: CloseDelim ( token:: Brace ) {
36313649 let token_str = self . this_token_to_string ( ) ;
3632- return Err ( self . fatal ( & format ! ( "expected `{}`, found `{}`" , "}" ,
3633- token_str) ) )
3650+ let mut err = self . fatal ( & format ! ( "expected `{}`, found `{}`" , "}" , token_str) ) ;
3651+ err. span_label ( self . span , "expected `}`" ) ;
3652+ return Err ( err) ;
36343653 }
36353654 etc = true ;
36363655 break ;
0 commit comments