@@ -155,6 +155,7 @@ pub(crate) enum Separator {
155
155
Literal ( tt:: Literal < Span > ) ,
156
156
Ident ( tt:: Ident < Span > ) ,
157
157
Puncts ( ArrayVec < tt:: Punct < Span > , MAX_GLUED_PUNCT_LEN > ) ,
158
+ Lifetime ( tt:: Punct < Span > , tt:: Ident < Span > ) ,
158
159
}
159
160
160
161
// Note that when we compare a Separator, we just care about its textual value.
@@ -170,6 +171,7 @@ impl PartialEq for Separator {
170
171
let b_iter = b. iter ( ) . map ( |b| b. char ) ;
171
172
a_iter. eq ( b_iter)
172
173
}
174
+ ( Lifetime ( _, a) , Lifetime ( _, b) ) => a. sym == b. sym ,
173
175
_ => false ,
174
176
}
175
177
}
@@ -350,10 +352,19 @@ fn parse_repeat(src: &mut TtIter<'_, Span>) -> Result<(Option<Separator>, Repeat
350
352
_ => true ,
351
353
} ;
352
354
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 ) ,
357
368
tt:: Leaf :: Literal ( lit) => separator = Separator :: Literal ( lit. clone ( ) ) ,
358
369
tt:: Leaf :: Punct ( punct) => {
359
370
let repeat_kind = match punct. char {
0 commit comments