@@ -442,23 +442,38 @@ fn make_token_stream(
442
442
}
443
443
token_and_spacing = iter. next ( ) ;
444
444
}
445
- let mut final_buf = stack. pop ( ) . expect ( "Missing final buf!" ) ;
446
- if break_last_token {
447
- let last_token = final_buf . inner . pop ( ) . unwrap ( ) ;
448
- if let AttrTokenTree :: Token ( last_token , spacing ) = last_token {
449
- let unglued_first = last_token . kind . break_two_token_op ( ) . unwrap ( ) . 0 ;
450
-
451
- // An 'unglued' token is always two ASCII characters
452
- let mut first_span = last_token . span . shrink_to_lo ( ) ;
453
- first_span = first_span . with_hi ( first_span . lo ( ) + rustc_span :: BytePos ( 1 ) ) ;
454
-
455
- final_buf
445
+ while let Some ( FrameData { open_delim_sp , mut inner } ) = stack. pop ( ) {
446
+ // A former macro expansion could give us malformed tokens.
447
+ // In that case, manually close all open delimitors so downstream users
448
+ // don't ICE on them.
449
+ if let Some ( ( delim , open_sp ) ) = open_delim_sp {
450
+ let dspan = DelimSpan :: from_pair ( open_sp , rustc_span :: DUMMY_SP ) ;
451
+ let stream = AttrTokenStream :: new ( inner ) ;
452
+ let delimited = AttrTokenTree :: Delimited ( dspan , delim , stream ) ;
453
+ stack
454
+ . last_mut ( )
455
+ . unwrap_or_else ( || panic ! ( "Bottom token frame is missing for recovered token" ) )
456
456
. inner
457
- . push ( AttrTokenTree :: Token ( Token :: new ( unglued_first , first_span ) , spacing ) ) ;
457
+ . push ( delimited ) ;
458
458
} else {
459
- panic ! ( "Unexpected last token {:?}" , last_token)
459
+ if break_last_token {
460
+ let last_token = inner. pop ( ) . unwrap ( ) ;
461
+ if let AttrTokenTree :: Token ( last_token, spacing) = last_token {
462
+ let unglued_first = last_token. kind . break_two_token_op ( ) . unwrap ( ) . 0 ;
463
+
464
+ // An 'unglued' token is always two ASCII characters
465
+ let mut first_span = last_token. span . shrink_to_lo ( ) ;
466
+ first_span = first_span. with_hi ( first_span. lo ( ) + rustc_span:: BytePos ( 1 ) ) ;
467
+
468
+ inner
469
+ . push ( AttrTokenTree :: Token ( Token :: new ( unglued_first, first_span) , spacing) ) ;
470
+ } else {
471
+ panic ! ( "Unexpected last token {:?}" , last_token)
472
+ }
473
+ }
474
+ assert ! ( stack. is_empty( ) , "Stack should be empty: stack={:?}" , stack) ;
475
+ return AttrTokenStream :: new ( inner) ;
460
476
}
461
477
}
462
- assert ! ( stack. is_empty( ) , "Stack should be empty: final_buf={:?} stack={:?}" , final_buf, stack) ;
463
- AttrTokenStream :: new ( final_buf. inner )
478
+ panic ! ( "Missing final buf!" )
464
479
}
0 commit comments