From 2d30f2201409ce6b62af09342bb9b1cacb76681b Mon Sep 17 00:00:00 2001 From: Corey Richardson Date: Sun, 18 Jan 2015 10:19:47 -0500 Subject: syntax: allow bare sequences in lhs for follow checking Closes #21350 --- src/libsyntax/ext/tt/macro_rules.rs | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) (limited to 'src/libsyntax') 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. } -- cgit 1.4.1-3-g733a5