@@ -778,13 +778,12 @@ impl<'a> Parser<'a> {
778778
779779 macro_rules! parse_lit {
780780 ( ) => {
781- match self . parse_lit ( ) {
782- Ok ( literal) => {
781+ match self . parse_opt_lit ( ) {
782+ Some ( literal) => {
783783 hi = self . prev_span;
784784 ex = ExprKind :: Lit ( literal) ;
785785 }
786- Err ( mut err) => {
787- err. cancel( ) ;
786+ None => {
788787 return Err ( self . expected_expression_found( ) ) ;
789788 }
790789 }
@@ -1074,11 +1073,20 @@ impl<'a> Parser<'a> {
10741073 self . maybe_recover_from_bad_qpath ( expr, true )
10751074 }
10761075
1077- /// Matches `lit = true | false | token_lit`.
10781076 pub ( super ) fn parse_lit ( & mut self ) -> PResult < ' a , Lit > {
1077+ self . parse_opt_lit ( ) . ok_or_else ( || {
1078+ let msg = format ! ( "unexpected token: {}" , self . this_token_descr( ) ) ;
1079+ self . span_fatal ( self . token . span , & msg)
1080+ } )
1081+ }
1082+
1083+ /// Matches `lit = true | false | token_lit`.
1084+ /// Returns `None` if the next token is not a literal.
1085+ pub ( super ) fn parse_opt_lit ( & mut self ) -> Option < Lit > {
10791086 let mut recovered = None ;
10801087 if self . token == token:: Dot {
1081- // Attempt to recover `.4` as `0.4`.
1088+ // Attempt to recover `.4` as `0.4`. We don't currently have any syntax where
1089+ // dot would follow an optional literal, so we do this unconditionally.
10821090 recovered = self . look_ahead ( 1 , |next_token| {
10831091 if let token:: Literal ( token:: Lit { kind : token:: Integer , symbol, suffix } )
10841092 = next_token. kind {
@@ -1107,11 +1115,10 @@ impl<'a> Parser<'a> {
11071115 match Lit :: from_token ( token) {
11081116 Ok ( lit) => {
11091117 self . bump ( ) ;
1110- Ok ( lit)
1118+ Some ( lit)
11111119 }
11121120 Err ( LitError :: NotLiteral ) => {
1113- let msg = format ! ( "unexpected token: {}" , self . this_token_descr( ) ) ;
1114- Err ( self . span_fatal ( token. span , & msg) )
1121+ None
11151122 }
11161123 Err ( err) => {
11171124 let span = token. span ;
@@ -1120,18 +1127,18 @@ impl<'a> Parser<'a> {
11201127 _ => unreachable ! ( ) ,
11211128 } ;
11221129 self . bump ( ) ;
1123- self . error_literal_from_token ( err, lit, span) ;
1130+ self . report_lit_error ( err, lit, span) ;
11241131 // Pack possible quotes and prefixes from the original literal into
11251132 // the error literal's symbol so they can be pretty-printed faithfully.
11261133 let suffixless_lit = token:: Lit :: new ( lit. kind , lit. symbol , None ) ;
11271134 let symbol = Symbol :: intern ( & suffixless_lit. to_string ( ) ) ;
11281135 let lit = token:: Lit :: new ( token:: Err , symbol, lit. suffix ) ;
1129- Lit :: from_lit_token ( lit, span) . map_err ( |_| unreachable ! ( ) )
1136+ Some ( Lit :: from_lit_token ( lit, span) . unwrap_or_else ( |_| unreachable ! ( ) ) )
11301137 }
11311138 }
11321139 }
11331140
1134- fn error_literal_from_token ( & self , err : LitError , lit : token:: Lit , span : Span ) {
1141+ fn report_lit_error ( & self , err : LitError , lit : token:: Lit , span : Span ) {
11351142 // Checks if `s` looks like i32 or u1234 etc.
11361143 fn looks_like_width_suffix ( first_chars : & [ char ] , s : & str ) -> bool {
11371144 s. len ( ) > 1
0 commit comments