From 3e4b7012d0e0ec60b9575ef4735b110cbf6d5ce1 Mon Sep 17 00:00:00 2001 From: "Felix S. Klock II" Date: Tue, 24 Nov 2015 19:46:21 +0100 Subject: [PATCH] Updated future-proofing test, removed outdated test, and added run-pass test for some new functionality. --- .../macro-input-future-proofing.rs | 2 ++ .../compile-fail/macro-seq-followed-by-seq.rs | 18 ------------- .../run-pass/macro-seq-followed-by-seq.rs | 26 +++++++++++++++++++ 3 files changed, 28 insertions(+), 18 deletions(-) delete mode 100644 src/test/compile-fail/macro-seq-followed-by-seq.rs create mode 100644 src/test/run-pass/macro-seq-followed-by-seq.rs diff --git a/src/test/compile-fail/macro-input-future-proofing.rs b/src/test/compile-fail/macro-input-future-proofing.rs index 15f6d88fd89..522f1499e4d 100644 --- a/src/test/compile-fail/macro-input-future-proofing.rs +++ b/src/test/compile-fail/macro-input-future-proofing.rs @@ -25,6 +25,8 @@ macro_rules! errors_everywhere { ($($ty:ty)* -) => (); //~ ERROR `$ty:ty` is followed by `-` ($($a:ty, $b:ty)* -) => (); //~ ERROR `$b:ty` is followed by `-` ($($ty:ty)-+) => (); //~ ERROR `$ty:ty` is followed by `-`, which is not allowed for `ty` + ( $($a:expr)* $($b:tt)* ) => { }; + //~^ ERROR `$a:expr` is followed by `$b:tt`, which is not allowed for `expr` fragments } fn main() { } diff --git a/src/test/compile-fail/macro-seq-followed-by-seq.rs b/src/test/compile-fail/macro-seq-followed-by-seq.rs deleted file mode 100644 index b4f71343d54..00000000000 --- a/src/test/compile-fail/macro-seq-followed-by-seq.rs +++ /dev/null @@ -1,18 +0,0 @@ -// 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. - -// Check that we cannot have two sequence repetitions in a row. - -macro_rules! foo { - ( $($a:expr)* $($b:tt)* ) => { }; //~ ERROR sequence repetition followed by another sequence - ( $($a:tt)* $($b:tt)* ) => { }; //~ ERROR sequence repetition followed by another sequence -} - -fn main() { } diff --git a/src/test/run-pass/macro-seq-followed-by-seq.rs b/src/test/run-pass/macro-seq-followed-by-seq.rs new file mode 100644 index 00000000000..23c7d2516a2 --- /dev/null +++ b/src/test/run-pass/macro-seq-followed-by-seq.rs @@ -0,0 +1,26 @@ +// Copyright 2016 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. + +// Test of allowing two sequences repetitions in a row, +// functionality added as byproduct of RFC amendment #1384 +// https://github.com/rust-lang/rfcs/pull/1384 + +// Old version of Rust would reject this macro definition, even though +// there are no local ambiguities (the initial `banana` and `orange` +// tokens are enough for the expander to distinguish which case is +// intended). +macro_rules! foo { + ( $(banana $a:ident)* $(orange $b:tt)* ) => { }; +} + +fn main() { + foo!( banana id1 banana id2 + orange hi orange (hello world) ); +}