@@ -244,14 +244,13 @@ struct TokenCursor {
244244
245245#[ derive( Clone ) ]
246246struct TokenCursorFrame {
247- delim : token:: DelimToken ,
248- span : DelimSpan ,
247+ delim_sp : Option < ( DelimToken , DelimSpan ) > ,
249248 tree_cursor : tokenstream:: Cursor ,
250249}
251250
252251impl TokenCursorFrame {
253- fn new ( span : DelimSpan , delim : DelimToken , tts : TokenStream ) -> Self {
254- TokenCursorFrame { delim , span , tree_cursor : tts. into_trees ( ) }
252+ fn new ( delim_sp : Option < ( DelimToken , DelimSpan ) > , tts : TokenStream ) -> Self {
253+ TokenCursorFrame { delim_sp , tree_cursor : tts. into_trees ( ) }
255254 }
256255}
257256
@@ -266,7 +265,7 @@ impl TokenCursor {
266265 loop {
267266 // FIXME: we currently don't return `NoDelim` open/close delims. To fix #67062 we will
268267 // need to, whereupon the `delim != DelimToken::NoDelim` conditions below can be
269- // removed, as well as the loop .
268+ // removed.
270269 if let Some ( ( tree, spacing) ) = self . frame . tree_cursor . next_with_spacing_ref ( ) {
271270 match tree {
272271 & TokenTree :: Token ( ref token) => match ( desugar_doc_comments, token) {
@@ -277,7 +276,7 @@ impl TokenCursor {
277276 } ,
278277 & TokenTree :: Delimited ( sp, delim, ref tts) => {
279278 // Set `open_delim` to true here because we deal with it immediately.
280- let frame = TokenCursorFrame :: new ( sp , delim , tts. clone ( ) ) ;
279+ let frame = TokenCursorFrame :: new ( Some ( ( delim , sp ) ) , tts. clone ( ) ) ;
281280 self . stack . push ( mem:: replace ( & mut self . frame , frame) ) ;
282281 if delim != DelimToken :: NoDelim {
283282 return ( Token :: new ( token:: OpenDelim ( delim) , sp. open ) , Spacing :: Alone ) ;
@@ -286,12 +285,11 @@ impl TokenCursor {
286285 }
287286 } ;
288287 } else if let Some ( frame) = self . stack . pop ( ) {
289- let delim = self . frame . delim ;
290- let span = self . frame . span ;
291- self . frame = frame;
292- if delim != DelimToken :: NoDelim {
288+ if let Some ( ( delim, span) ) = self . frame . delim_sp && delim != DelimToken :: NoDelim {
289+ self . frame = frame;
293290 return ( Token :: new ( token:: CloseDelim ( delim) , span. close ) , Spacing :: Alone ) ;
294291 }
292+ self . frame = frame;
295293 // No close delimiter to return; continue on to the next iteration.
296294 } else {
297295 return ( Token :: new ( token:: Eof , DUMMY_SP ) , Spacing :: Alone ) ;
@@ -330,8 +328,7 @@ impl TokenCursor {
330328 self . stack . push ( mem:: replace (
331329 & mut self . frame ,
332330 TokenCursorFrame :: new (
333- delim_span,
334- token:: NoDelim ,
331+ None ,
335332 if attr_style == AttrStyle :: Inner {
336333 [ TokenTree :: token ( token:: Pound , span) , TokenTree :: token ( token:: Not , span) , body]
337334 . iter ( )
@@ -431,10 +428,6 @@ impl<'a> Parser<'a> {
431428 desugar_doc_comments : bool ,
432429 subparser_name : Option < & ' static str > ,
433430 ) -> Self {
434- // Note: because of the way `TokenCursor::inlined_next` is structured, the `span` and
435- // `delim` arguments here are never used.
436- let start_frame = TokenCursorFrame :: new ( DelimSpan :: dummy ( ) , token:: NoDelim , tokens) ;
437-
438431 let mut parser = Parser {
439432 sess,
440433 token : Token :: dummy ( ) ,
@@ -444,7 +437,7 @@ impl<'a> Parser<'a> {
444437 restrictions : Restrictions :: empty ( ) ,
445438 expected_tokens : Vec :: new ( ) ,
446439 token_cursor : TokenCursor {
447- frame : start_frame ,
440+ frame : TokenCursorFrame :: new ( None , tokens ) ,
448441 stack : Vec :: new ( ) ,
449442 num_next_calls : 0 ,
450443 desugar_doc_comments,
@@ -1025,7 +1018,7 @@ impl<'a> Parser<'a> {
10251018 }
10261019
10271020 let frame = & self . token_cursor . frame ;
1028- if frame. delim != DelimToken :: NoDelim {
1021+ if let Some ( ( delim , span ) ) = frame. delim_sp && delim != DelimToken :: NoDelim {
10291022 let all_normal = ( 0 ..dist) . all ( |i| {
10301023 let token = frame. tree_cursor . look_ahead ( i) ;
10311024 !matches ! ( token, Some ( TokenTree :: Delimited ( _, DelimToken :: NoDelim , _) ) )
@@ -1038,7 +1031,7 @@ impl<'a> Parser<'a> {
10381031 looker ( & Token :: new ( token:: OpenDelim ( * delim) , dspan. open ) )
10391032 }
10401033 } ,
1041- None => looker ( & Token :: new ( token:: CloseDelim ( frame . delim ) , frame . span . close ) ) ,
1034+ None => looker ( & Token :: new ( token:: CloseDelim ( delim) , span. close ) ) ,
10421035 } ;
10431036 }
10441037 }
@@ -1198,8 +1191,7 @@ impl<'a> Parser<'a> {
11981191 // Grab the tokens from this frame.
11991192 let frame = & self . token_cursor . frame ;
12001193 let stream = frame. tree_cursor . stream . clone ( ) ;
1201- let span = frame. span ;
1202- let delim = frame. delim ;
1194+ let ( delim, span) = frame. delim_sp . unwrap ( ) ;
12031195
12041196 // Advance the token cursor through the entire delimited
12051197 // sequence. After getting the `OpenDelim` we are *within* the
0 commit comments