about summary refs log tree commit diff
path: root/src/libsyntax
diff options
context:
space:
mode:
authorCorey Richardson <corey@octayn.net>2015-01-18 10:19:47 -0500
committerCorey Richardson <corey@octayn.net>2015-01-18 10:19:47 -0500
commit2d30f2201409ce6b62af09342bb9b1cacb76681b (patch)
tree13928a3e397ab845409ceb32c4a48bae334b693d /src/libsyntax
parentdcaeb6aa23ecba2dc2af870668a9239136d20fa3 (diff)
downloadrust-2d30f2201409ce6b62af09342bb9b1cacb76681b.tar.gz
rust-2d30f2201409ce6b62af09342bb9b1cacb76681b.zip
syntax: allow bare sequences in lhs for follow checking
Closes #21350
Diffstat (limited to 'src/libsyntax')
-rw-r--r--src/libsyntax/ext/tt/macro_rules.rs23
1 files changed, 13 insertions, 10 deletions
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.
 }