about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2015-01-20 13:36:03 +0000
committerbors <bors@rust-lang.org>2015-01-20 13:36:03 +0000
commitffd8cb79a2d3da6629c8f54ef9ea9c29bd92fc9e (patch)
tree56ed1cdc650c7f83ff57182e8ddbf36233e0830b
parent3bf41dafcfb6c979efb4e2438e047e1a54045eec (diff)
parent2d30f2201409ce6b62af09342bb9b1cacb76681b (diff)
downloadrust-ffd8cb79a2d3da6629c8f54ef9ea9c29bd92fc9e.tar.gz
rust-ffd8cb79a2d3da6629c8f54ef9ea9c29bd92fc9e.zip
Auto merge of #21364 - cmr:fix-ttseq-ice, r=alexcrichton
Closes #21350
-rw-r--r--src/libsyntax/ext/tt/macro_rules.rs23
-rw-r--r--src/test/run-pass/issue-21350.rs17
2 files changed, 30 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.
 }
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 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, 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() { }