@@ -274,11 +274,6 @@ pub(super) fn transcribe<'a>(
274274 // without wrapping them into groups.
275275 maybe_use_metavar_location ( psess, & stack, sp, tt, & mut marker)
276276 }
277- MatchedSingle ( ParseNtResult :: Ident ( ident, is_raw) ) => {
278- marker. visit_span ( & mut sp) ;
279- let kind = token:: NtIdent ( * ident, * is_raw) ;
280- TokenTree :: token_alone ( kind, sp)
281- }
282277 MatchedSingle ( ParseNtResult :: Lifetime ( ident) ) => {
283278 marker. visit_span ( & mut sp) ;
284279 let kind = token:: NtLifetime ( * ident) ;
@@ -395,9 +390,22 @@ fn maybe_use_metavar_location(
395390 return orig_tt. clone ( ) ;
396391 }
397392
398- let insert = |mspans : & mut FxHashMap < _ , _ > , s, ms| match mspans. try_insert ( s, ms) {
393+ let insert = |mspans : & mut FxHashMap < _ , _ > , s, ms : Span | match mspans. try_insert ( s, ms) {
399394 Ok ( _) => true ,
400- Err ( err) => * err. entry . get ( ) == ms, // Tried to insert the same span, still success
395+ Err ( mut err) => {
396+ let old_ms = * err. entry . get ( ) ;
397+ if ms == old_ms {
398+ // Tried to insert the same span, still success.
399+ return true ;
400+ }
401+ if !ms. eq_ctxt ( old_ms) && ms. ctxt ( ) . outer_expn_data ( ) . call_site . eq_ctxt ( old_ms) {
402+ // This looks like a variable passed to an inner (possibly recursive) macro call.
403+ // The innermost metavar span is the most useful, so override.
404+ err. entry . insert ( ms) ;
405+ return true ;
406+ }
407+ false
408+ }
401409 } ;
402410 marker. visit_span ( & mut metavar_span) ;
403411 let no_collision = match orig_tt {
@@ -411,16 +419,19 @@ fn maybe_use_metavar_location(
411419 } ) ,
412420 } ;
413421 if no_collision || psess. source_map ( ) . is_imported ( metavar_span) {
422+ if let TokenTree :: Token ( token, _) = orig_tt {
423+ return TokenTree :: Token ( token. clone ( ) , Spacing :: Alone ) ;
424+ }
414425 return orig_tt. clone ( ) ;
415426 }
416427
417428 // Setting metavar spans for the heuristic spans gives better opportunities for combining them
418429 // with neighboring spans even despite their different syntactic contexts.
419430 match orig_tt {
420- TokenTree :: Token ( Token { kind, span } , spacing ) => {
431+ TokenTree :: Token ( Token { kind, span } , _spacing ) => {
421432 let span = metavar_span. with_ctxt ( span. ctxt ( ) ) ;
422433 with_metavar_spans ( |mspans| insert ( mspans, span, metavar_span) ) ;
423- TokenTree :: Token ( Token { kind : kind. clone ( ) , span } , * spacing )
434+ TokenTree :: Token ( Token { kind : kind. clone ( ) , span } , Spacing :: Alone )
424435 }
425436 TokenTree :: Delimited ( dspan, dspacing, delimiter, tts) => {
426437 let open = metavar_span. with_ctxt ( dspan. open . ctxt ( ) ) ;
@@ -735,12 +746,6 @@ fn extract_ident<'a>(
735746 interp : & FxHashMap < MacroRulesNormalizedIdent , NamedMatch > ,
736747) -> PResult < ' a , String > {
737748 if let NamedMatch :: MatchedSingle ( pnr) = matched_from_ident ( dcx, ident, interp) ? {
738- if let ParseNtResult :: Ident ( nt_ident, is_raw) = pnr {
739- if let IdentIsRaw :: Yes = is_raw {
740- return Err ( dcx. struct_span_err ( ident. span , RAW_IDENT_ERR ) ) ;
741- }
742- return Ok ( nt_ident. to_string ( ) ) ;
743- }
744749 if let ParseNtResult :: Tt ( TokenTree :: Token (
745750 Token { kind : TokenKind :: Ident ( token_ident, is_raw) , .. } ,
746751 _,
0 commit comments