@@ -155,6 +155,7 @@ pub(crate) enum Separator {
155155 Literal ( tt:: Literal < Span > ) ,
156156 Ident ( tt:: Ident < Span > ) ,
157157 Puncts ( ArrayVec < tt:: Punct < Span > , MAX_GLUED_PUNCT_LEN > ) ,
158+ Lifetime ( tt:: Punct < Span > , tt:: Ident < Span > ) ,
158159}
159160
160161// Note that when we compare a Separator, we just care about its textual value.
@@ -170,6 +171,7 @@ impl PartialEq for Separator {
170171 let b_iter = b. iter ( ) . map ( |b| b. char ) ;
171172 a_iter. eq ( b_iter)
172173 }
174+ ( Lifetime ( _, a) , Lifetime ( _, b) ) => a. sym == b. sym ,
173175 _ => false ,
174176 }
175177 }
@@ -350,10 +352,19 @@ fn parse_repeat(src: &mut TtIter<'_, Span>) -> Result<(Option<Separator>, Repeat
350352 _ => true ,
351353 } ;
352354 match tt {
353- tt:: Leaf :: Ident ( _) | tt:: Leaf :: Literal ( _) if has_sep => {
354- return Err ( ParseError :: InvalidRepeat ) ;
355- }
356- tt:: Leaf :: Ident ( ident) => separator = Separator :: Ident ( ident. clone ( ) ) ,
355+ tt:: Leaf :: Ident ( ident) => match separator {
356+ Separator :: Puncts ( puncts) if puncts. is_empty ( ) => {
357+ separator = Separator :: Ident ( ident. clone ( ) ) ;
358+ }
359+ Separator :: Puncts ( puncts) => match puncts. as_slice ( ) {
360+ [ tt:: Punct { char : '\'' , .. } ] => {
361+ separator = Separator :: Lifetime ( puncts[ 0 ] , ident. clone ( ) ) ;
362+ }
363+ _ => return Err ( ParseError :: InvalidRepeat ) ,
364+ } ,
365+ _ => return Err ( ParseError :: InvalidRepeat ) ,
366+ } ,
367+ tt:: Leaf :: Literal ( _) if has_sep => return Err ( ParseError :: InvalidRepeat ) ,
357368 tt:: Leaf :: Literal ( lit) => separator = Separator :: Literal ( lit. clone ( ) ) ,
358369 tt:: Leaf :: Punct ( punct) => {
359370 let repeat_kind = match punct. char {
0 commit comments