@@ -1487,7 +1487,10 @@ impl<'a> Parser<'a> {
14871487 }
14881488 _ => {
14891489 let token_str = self . this_token_to_string ( ) ;
1490- return Err ( self . fatal ( & format ! ( "expected `;` or `{{`, found `{}`" , token_str) ) ) ;
1490+ let mut err = self . fatal ( & format ! ( "expected `;` or `{{`, found `{}`" ,
1491+ token_str) ) ;
1492+ err. span_label ( self . span , "expected `;` or `{`" ) ;
1493+ return Err ( err) ;
14911494 }
14921495 } ;
14931496 ( ident, ast:: TraitItemKind :: Method ( sig, body) , generics)
@@ -2218,7 +2221,12 @@ impl<'a> Parser<'a> {
22182221 TokenTree :: Delimited ( _, delimited) => Ok ( ( delim, delimited. stream ( ) . into ( ) ) ) ,
22192222 _ => unreachable ! ( ) ,
22202223 } ,
2221- _ => Err ( self . fatal ( "expected open delimiter" ) ) ,
2224+ _ => {
2225+ let msg = "expected open delimiter" ;
2226+ let mut err = self . fatal ( msg) ;
2227+ err. span_label ( self . span , msg) ;
2228+ Err ( err)
2229+ }
22222230 }
22232231 }
22242232
@@ -2351,7 +2359,10 @@ impl<'a> Parser<'a> {
23512359 if self . eat_keyword ( keywords:: Loop ) {
23522360 return self . parse_loop_expr ( Some ( label) , lo, attrs)
23532361 }
2354- return Err ( self . fatal ( "expected `while`, `for`, or `loop` after a label" ) )
2362+ let msg = "expected `while`, `for`, or `loop` after a label" ;
2363+ let mut err = self . fatal ( msg) ;
2364+ err. span_label ( self . span , msg) ;
2365+ return Err ( err) ;
23552366 }
23562367 if self . eat_keyword ( keywords:: Loop ) {
23572368 let lo = self . prev_span ;
@@ -2410,6 +2421,7 @@ impl<'a> Parser<'a> {
24102421 // Catch this syntax error here, instead of in `parse_ident`, so
24112422 // that we can explicitly mention that let is not to be used as an expression
24122423 let mut db = self . fatal ( "expected expression, found statement (`let`)" ) ;
2424+ db. span_label ( self . span , "expected expression" ) ;
24132425 db. note ( "variable declaration using `let` is a statement" ) ;
24142426 return Err ( db) ;
24152427 } else if self . token . is_path_start ( ) {
@@ -2445,7 +2457,9 @@ impl<'a> Parser<'a> {
24452457 self . cancel ( & mut err) ;
24462458 let msg = format ! ( "expected expression, found {}" ,
24472459 self . this_token_descr( ) ) ;
2448- return Err ( self . fatal ( & msg) ) ;
2460+ let mut err = self . fatal ( & msg) ;
2461+ err. span_label ( self . span , "expected expression" ) ;
2462+ return Err ( err) ;
24492463 }
24502464 }
24512465 }
@@ -2735,7 +2749,9 @@ impl<'a> Parser<'a> {
27352749 self . look_ahead ( 1 , |t| t. is_ident ( ) ) => {
27362750 self . bump ( ) ;
27372751 let name = match self . token { token:: Ident ( ident) => ident, _ => unreachable ! ( ) } ;
2738- self . fatal ( & format ! ( "unknown macro variable `{}`" , name) ) . emit ( ) ;
2752+ let mut err = self . fatal ( & format ! ( "unknown macro variable `{}`" , name) ) ;
2753+ err. span_label ( self . span , "unknown macro variable" ) ;
2754+ err. emit ( ) ;
27392755 return
27402756 }
27412757 token:: Interpolated ( ref nt) => {
@@ -3760,7 +3776,10 @@ impl<'a> Parser<'a> {
37603776 self . expect_and ( ) ?;
37613777 let mutbl = self . parse_mutability ( ) ;
37623778 if let token:: Lifetime ( ident) = self . token {
3763- return Err ( self . fatal ( & format ! ( "unexpected lifetime `{}` in pattern" , ident) ) ) ;
3779+ let mut err = self . fatal ( & format ! ( "unexpected lifetime `{}` in pattern" ,
3780+ ident) ) ;
3781+ err. span_label ( self . span , "unexpected lifetime" ) ;
3782+ return Err ( err) ;
37643783 }
37653784 let subpat = self . parse_pat ( ) ?;
37663785 pat = PatKind :: Ref ( subpat, mutbl) ;
@@ -3843,7 +3862,10 @@ impl<'a> Parser<'a> {
38433862 }
38443863 token:: OpenDelim ( token:: Brace ) => {
38453864 if qself. is_some ( ) {
3846- return Err ( self . fatal ( "unexpected `{` after qualified path" ) ) ;
3865+ let msg = "unexpected `{` after qualified path" ;
3866+ let mut err = self . fatal ( msg) ;
3867+ err. span_label ( self . span , msg) ;
3868+ return Err ( err) ;
38473869 }
38483870 // Parse struct pattern
38493871 self . bump ( ) ;
@@ -3857,7 +3879,10 @@ impl<'a> Parser<'a> {
38573879 }
38583880 token:: OpenDelim ( token:: Paren ) => {
38593881 if qself. is_some ( ) {
3860- return Err ( self . fatal ( "unexpected `(` after qualified path" ) ) ;
3882+ let msg = "unexpected `(` after qualified path" ;
3883+ let mut err = self . fatal ( msg) ;
3884+ err. span_label ( self . span , msg) ;
3885+ return Err ( err) ;
38613886 }
38623887 // Parse tuple struct or enum pattern
38633888 self . bump ( ) ;
@@ -3889,7 +3914,9 @@ impl<'a> Parser<'a> {
38893914 Err ( mut err) => {
38903915 self . cancel ( & mut err) ;
38913916 let msg = format ! ( "expected pattern, found {}" , self . this_token_descr( ) ) ;
3892- return Err ( self . fatal ( & msg) ) ;
3917+ let mut err = self . fatal ( & msg) ;
3918+ err. span_label ( self . span , "expected pattern" ) ;
3919+ return Err ( err) ;
38933920 }
38943921 }
38953922 }
@@ -4289,9 +4316,11 @@ impl<'a> Parser<'a> {
42894316 ""
42904317 } ;
42914318 let tok_str = self . this_token_to_string ( ) ;
4292- return Err ( self . fatal ( & format ! ( "expected {}`(` or `{{`, found `{}`" ,
4293- ident_str,
4294- tok_str) ) )
4319+ let mut err = self . fatal ( & format ! ( "expected {}`(` or `{{`, found `{}`" ,
4320+ ident_str,
4321+ tok_str) ) ;
4322+ err. span_label ( self . span , format ! ( "expected {}`(` or `{{`" , ident_str) ) ;
4323+ return Err ( err)
42954324 } ,
42964325 } ;
42974326
@@ -5598,8 +5627,12 @@ impl<'a> Parser<'a> {
55985627 body
55995628 } else {
56005629 let token_str = self . this_token_to_string ( ) ;
5601- return Err ( self . fatal ( & format ! ( "expected `where`, `{{`, `(`, or `;` after struct \
5602- name, found `{}`", token_str) ) )
5630+ let mut err = self . fatal ( & format ! (
5631+ "expected `where`, `{{`, `(`, or `;` after struct name, found `{}`" ,
5632+ token_str
5633+ ) ) ;
5634+ err. span_label ( self . span , "expected `where`, `{`, `(`, or `;` after struct name" ) ;
5635+ return Err ( err) ;
56035636 } ;
56045637
56055638 Ok ( ( class_name, ItemKind :: Struct ( vdata, generics) , None ) )
@@ -5618,8 +5651,10 @@ impl<'a> Parser<'a> {
56185651 VariantData :: Struct ( self . parse_record_struct_body ( ) ?, ast:: DUMMY_NODE_ID )
56195652 } else {
56205653 let token_str = self . this_token_to_string ( ) ;
5621- return Err ( self . fatal ( & format ! ( "expected `where` or `{{` after union \
5622- name, found `{}`", token_str) ) )
5654+ let mut err = self . fatal ( & format ! (
5655+ "expected `where` or `{{` after union name, found `{}`" , token_str) ) ;
5656+ err. span_label ( self . span , "expected `where` or `{` after union name" ) ;
5657+ return Err ( err) ;
56235658 } ;
56245659
56255660 Ok ( ( class_name, ItemKind :: Union ( vdata, generics) , None ) )
@@ -5666,9 +5701,10 @@ impl<'a> Parser<'a> {
56665701 self . eat ( & token:: CloseDelim ( token:: Brace ) ) ;
56675702 } else {
56685703 let token_str = self . this_token_to_string ( ) ;
5669- return Err ( self . fatal ( & format ! ( "expected `where`, or `{{` after struct \
5670- name, found `{}`",
5671- token_str) ) ) ;
5704+ let mut err = self . fatal ( & format ! (
5705+ "expected `where`, or `{{` after struct name, found `{}`" , token_str) ) ;
5706+ err. span_label ( self . span , "expected `where`, or `{` after struct name" ) ;
5707+ return Err ( err) ;
56725708 }
56735709
56745710 Ok ( fields)
@@ -5841,9 +5877,11 @@ impl<'a> Parser<'a> {
58415877 if !self . eat ( term) {
58425878 let token_str = self . this_token_to_string ( ) ;
58435879 let mut err = self . fatal ( & format ! ( "expected item, found `{}`" , token_str) ) ;
5844- let msg = "consider removing this semicolon" ;
58455880 if token_str == ";" {
5881+ let msg = "consider removing this semicolon" ;
58465882 err. span_suggestion_short ( self . span , msg, "" . to_string ( ) ) ;
5883+ } else {
5884+ err. span_label ( self . span , "expected item" ) ;
58475885 }
58485886 return Err ( err) ;
58495887 }
@@ -7000,7 +7038,12 @@ impl<'a> Parser<'a> {
70007038 self . expect_no_suffix ( sp, "string literal" , suf) ;
70017039 Ok ( ( s, style) )
70027040 }
7003- _ => Err ( self . fatal ( "expected string literal" ) )
7041+ _ => {
7042+ let msg = "expected string literal" ;
7043+ let mut err = self . fatal ( msg) ;
7044+ err. span_label ( self . span , msg) ;
7045+ Err ( err)
7046+ }
70047047 }
70057048 }
70067049}
0 commit comments