@@ -993,7 +993,21 @@ impl<'a> Parser<'a> {
993
993
( span. shrink_to_hi ( ) , format ! ( "`{}`" , snippet) )
994
994
}
995
995
( token:: CloseDelim ( Delimiter :: Invisible ( InvisibleOrigin :: MetaVar ( _) ) ) , _) => {
996
- // Don't need to report an error in this case.
996
+ // No need to report an error. This case will only occur when parsing a pasted
997
+ // metavariable, and we should have emitted an error when parsing the macro call in
998
+ // the first place. E.g. in this code:
999
+ // ```
1000
+ // macro_rules! m { ($e:expr) => { $e }; }
1001
+ //
1002
+ // fn main() {
1003
+ // let f = 1;
1004
+ // m!(f.);
1005
+ // }
1006
+ // ```
1007
+ // we'll get an error "unexpected token: `)` when parsing the `m!(f.)`, so we don't
1008
+ // want to issue a second error when parsing the expansion `«f.»` (where `«`/`»`
1009
+ // represent the invisible delimiters).
1010
+ self . dcx ( ) . span_delayed_bug ( span, "bad dot expr in metavariable" ) ;
997
1011
return ;
998
1012
}
999
1013
_ => ( span, actual) ,
@@ -2086,7 +2100,7 @@ impl<'a> Parser<'a> {
2086
2100
. or_else ( |( ) | self . handle_missing_lit ( Parser :: mk_meta_item_lit_char) )
2087
2101
}
2088
2102
2089
- fn recover_after_dot ( & mut self ) -> Option < Token > {
2103
+ fn recover_after_dot ( & mut self ) {
2090
2104
let mut recovered = None ;
2091
2105
if self . token == token:: Dot {
2092
2106
// Attempt to recover `.4` as `0.4`. We don't currently have any syntax where
@@ -2121,12 +2135,14 @@ impl<'a> Parser<'a> {
2121
2135
}
2122
2136
}
2123
2137
2124
- recovered
2138
+ if let Some ( recovered) = recovered {
2139
+ self . token = recovered;
2140
+ }
2125
2141
}
2126
2142
2127
2143
/// Keep this in sync with `Token::can_begin_literal_maybe_minus` and
2128
2144
/// `Lit::from_token` (excluding unary negation).
2129
- pub fn eat_token_lit ( & mut self ) -> Option < token:: Lit > {
2145
+ fn eat_token_lit ( & mut self ) -> Option < token:: Lit > {
2130
2146
match self . token . uninterpolate ( ) . kind {
2131
2147
token:: Ident ( name, IdentIsRaw :: No ) if name. is_bool_lit ( ) => {
2132
2148
self . bump ( ) ;
@@ -2165,34 +2181,28 @@ impl<'a> Parser<'a> {
2165
2181
/// Matches `lit = true | false | token_lit`.
2166
2182
/// Returns `None` if the next token is not a literal.
2167
2183
fn parse_opt_token_lit ( & mut self ) -> Option < ( token:: Lit , Span ) > {
2168
- match self . recover_after_dot ( ) {
2169
- Some ( recovered) => self . token = recovered,
2170
- None => { }
2171
- }
2184
+ self . recover_after_dot ( ) ;
2172
2185
let span = self . token . span ;
2173
2186
self . eat_token_lit ( ) . map ( |token_lit| ( token_lit, span) )
2174
2187
}
2175
2188
2176
2189
/// Matches `lit = true | false | token_lit`.
2177
2190
/// Returns `None` if the next token is not a literal.
2178
2191
fn parse_opt_meta_item_lit ( & mut self ) -> Option < MetaItemLit > {
2179
- match self . recover_after_dot ( ) {
2180
- Some ( recovered) => self . token = recovered,
2181
- None => { }
2182
- }
2192
+ self . recover_after_dot ( ) ;
2183
2193
let span = self . token . span ;
2184
- let span2 = self . uninterpolated_token_span ( ) ;
2194
+ let uninterpolated_span = self . uninterpolated_token_span ( ) ;
2185
2195
self . eat_token_lit ( ) . map ( |token_lit| {
2186
2196
match MetaItemLit :: from_token_lit ( token_lit, span) {
2187
2197
Ok ( lit) => lit,
2188
2198
Err ( err) => {
2189
- let guar = report_lit_error ( & self . psess , err, token_lit, span2 ) ;
2199
+ let guar = report_lit_error ( & self . psess , err, token_lit, uninterpolated_span ) ;
2190
2200
// Pack possible quotes and prefixes from the original literal into
2191
2201
// the error literal's symbol so they can be pretty-printed faithfully.
2192
2202
let suffixless_lit = token:: Lit :: new ( token_lit. kind , token_lit. symbol , None ) ;
2193
2203
let symbol = Symbol :: intern ( & suffixless_lit. to_string ( ) ) ;
2194
2204
let token_lit = token:: Lit :: new ( token:: Err ( guar) , symbol, token_lit. suffix ) ;
2195
- MetaItemLit :: from_token_lit ( token_lit, span2 ) . unwrap_or_else ( |_| unreachable ! ( ) )
2205
+ MetaItemLit :: from_token_lit ( token_lit, uninterpolated_span ) . unwrap ( )
2196
2206
}
2197
2207
}
2198
2208
} )
0 commit comments