diff --git a/src/libsyntax/ext/tt/macro_rules.rs b/src/libsyntax/ext/tt/macro_rules.rs index fc341e3bd85..270df72eb0e 100644 --- a/src/libsyntax/ext/tt/macro_rules.rs +++ b/src/libsyntax/ext/tt/macro_rules.rs @@ -281,19 +281,22 @@ pub fn compile<'cx>(cx: &'cx mut ExtCtxt, } fn check_lhs_nt_follows(cx: &mut ExtCtxt, lhs: &NamedMatch, sp: Span) { - // lhs is going to be like MatchedNonterminal(NtTT(TtDelimited(...))), where - // the entire lhs is those tts. - // if ever we get box/deref patterns, this could turn into an `if let - // &MatchedNonterminal(NtTT(box TtDelimited(...))) = lhs` - let matcher = match lhs { + // lhs is going to be like MatchedNonterminal(NtTT(TtDelimited(...))), where the entire lhs is + // those tts. Or, it can be a "bare sequence", not wrapped in parens. + match lhs { &MatchedNonterminal(NtTT(ref inner)) => match &**inner { - &TtDelimited(_, ref tts) => tts.tts.as_slice(), - _ => cx.span_bug(sp, "wrong-structured lhs for follow check") + &TtDelimited(_, ref tts) => { + check_matcher(cx, tts.tts.iter(), &Eof); + }, + tt @ &TtSequence(..) => { + check_matcher(cx, Some(tt).into_iter(), &Eof); + }, + _ => cx.span_bug(sp, "wrong-structured lhs for follow check (didn't find \ + a TtDelimited or TtSequence)") }, - _ => cx.span_bug(sp, "wrong-structured lhs for follow check") + _ => cx.span_bug(sp, "wrong-structured lhs for follow check (didn't find a \ + MatchedNonterminal)") }; - - check_matcher(cx, matcher.iter(), &Eof); // we don't abort on errors on rejection, the driver will do that for us // after parsing/expansion. we can report every error in every macro this way. } diff --git a/src/test/run-pass/issue-21350.rs b/src/test/run-pass/issue-21350.rs new file mode 100644 index 00000000000..feafee90372 --- /dev/null +++ b/src/test/run-pass/issue-21350.rs @@ -0,0 +1,17 @@ +// Copyright 2015 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// Make sure that "bare sequences" don't ICE in follow checking + +macro_rules! bare { + $($id:expr),+ => ( $($id)+ ) +} + +fn main() { }