Skip to content

Commit eac7c8e

Browse files
jseyfriedbrson
authored andcommitted
Fix #39390 on beta.
1 parent a0a352d commit eac7c8e

File tree

2 files changed

+25
-11
lines changed

2 files changed

+25
-11
lines changed

src/libsyntax/parse/parser.rs

+20-9
Original file line numberDiff line numberDiff line change
@@ -300,16 +300,27 @@ impl<'a> Parser<'a> {
300300
fn next_tok(&mut self) -> TokenAndSpan {
301301
loop {
302302
let tok = if let Some((tts, i)) = self.tts.pop() {
303-
let tt = tts.get_tt(i);
304-
if i + 1 < tts.len() {
305-
self.tts.push((tts, i + 1));
306-
}
307-
// FIXME(jseyfried): remove after fixing #39390 in #39419.
308-
if self.quote_depth > 0 {
309-
if let TokenTree::Sequence(sp, _) = tt {
310-
self.span_err(sp, "attempted to repeat an expression containing no \
311-
syntax variables matched as repeating at this depth");
303+
let (tt, is_last) = if let &TokenTree::Sequence(span, ref seq) = &tts {
304+
if i == 0 {
305+
(TokenTree::Token(span, token::Dollar), false)
306+
} else if i == 1 {
307+
(TokenTree::Token(span, token::OpenDelim(token::Paren)), false)
308+
} else if i < tts.len() + 2 {
309+
(tts.get_tt(i - 2), false)
310+
} else if i == tts.len() + 2 {
311+
(TokenTree::Token(span, token::CloseDelim(token::Paren)), false)
312+
} else if i == tts.len() + 3 && seq.separator.is_some() {
313+
(TokenTree::Token(span, seq.separator.clone().unwrap()), false)
314+
} else if seq.op == tokenstream::KleeneOp::ZeroOrMore {
315+
(TokenTree::Token(span, token::BinOp(token::Star)), true)
316+
} else {
317+
(TokenTree::Token(span, token::BinOp(token::Plus)), true)
312318
}
319+
} else {
320+
(tts.get_tt(i), i + 1 == tts.len())
321+
};
322+
if !is_last {
323+
self.tts.push((tts, i + 1));
313324
}
314325
match tt {
315326
TokenTree::Token(sp, tok) => TokenAndSpan { tok: tok, sp: sp },

src/test/compile-fail/issue-39709.rs renamed to src/test/run-pass/issue-39709.rs

+5-2
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,11 @@
88
// option. This file may not be copied, modified, or distributed
99
// except according to those terms.
1010

11+
macro_rules! id { ($($t:tt)*) => { $($t)* } }
12+
1113
fn main() {
1214
println!("{}", { macro_rules! x { ($()*) => {} } 33 });
13-
//~^ ERROR no syntax variables matched as repeating at this depth
15+
id!(macro_rules! m { ($($i:ident),*) => { ($($i),*) } });
16+
let (foo, bar) = (0, 0);
17+
assert_eq!(m!(foo, bar), (0, 0));
1418
}
15-

0 commit comments

Comments
 (0)