From 3e4b7012d0e0ec60b9575ef4735b110cbf6d5ce1 Mon Sep 17 00:00:00 2001 From: "Felix S. Klock II" Date: Tue, 24 Nov 2015 19:46:21 +0100 Subject: Updated future-proofing test, removed outdated test, and added run-pass test for some new functionality. --- .../compile-fail/macro-input-future-proofing.rs | 2 ++ src/test/compile-fail/macro-seq-followed-by-seq.rs | 18 --------------- src/test/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 (limited to 'src/test') 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) ); +} -- cgit 1.4.1-3-g733a5 From c032e0c7a700144e035731ee153c13dde8db8575 Mon Sep 17 00:00:00 2001 From: "Felix S. Klock II" Date: Thu, 7 Jan 2016 00:22:47 +0100 Subject: After RFC amendment 1384, FOLLOW(pat) includes `|`, so update tests accordingly. --- src/test/compile-fail/macro-input-future-proofing.rs | 1 - src/test/run-pass/macro-pat-follow.rs | 10 ++++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) (limited to 'src/test') diff --git a/src/test/compile-fail/macro-input-future-proofing.rs b/src/test/compile-fail/macro-input-future-proofing.rs index 522f1499e4d..fe758a4a631 100644 --- a/src/test/compile-fail/macro-input-future-proofing.rs +++ b/src/test/compile-fail/macro-input-future-proofing.rs @@ -18,7 +18,6 @@ macro_rules! errors_everywhere { ($bl:block < ) => (); ($pa:pat >) => (); //~ ERROR `$pa:pat` is followed by `>`, which is not allowed for `pat` ($pa:pat , ) => (); - ($pa:pat | ) => (); //~ ERROR `$pa:pat` is followed by `|` ($pa:pat $pb:pat $ty:ty ,) => (); //~^ ERROR `$pa:pat` is followed by `$pb:pat`, which is not allowed //~^^ ERROR `$pb:pat` is followed by `$ty:ty`, which is not allowed diff --git a/src/test/run-pass/macro-pat-follow.rs b/src/test/run-pass/macro-pat-follow.rs index 77c6ed4447f..c1abebd5f90 100644 --- a/src/test/run-pass/macro-pat-follow.rs +++ b/src/test/run-pass/macro-pat-follow.rs @@ -24,7 +24,17 @@ macro_rules! pat_if { }} } +macro_rules! pat_bar { + ($p:pat | $p2:pat) => {{ + match Some(1u8) { + $p | $p2 => {}, + _ => {} + } + }} +} + fn main() { pat_in!(Some(_) in 0..10); pat_if!(Some(x) if x > 0); + pat_bar!(Some(1u8) | None); } -- cgit 1.4.1-3-g733a5 From a2960bc7c6108f92a6c8c27418b20af1337208cf Mon Sep 17 00:00:00 2001 From: "Felix S. Klock II" Date: Fri, 8 Jan 2016 00:36:09 +0100 Subject: update test to reflect other sources of brokenness in it under new macro future proofing rules. (We may want to think about what this test was actually testing and figure out a way to test it without running afoul of macro future proofing. I spent some time trying to do this, e.g. by inserting parenthesis in the macro input pattern, but I could not quickly get it working, so I took this tack instead.) --- src/test/compile-fail/issue-30715.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'src/test') diff --git a/src/test/compile-fail/issue-30715.rs b/src/test/compile-fail/issue-30715.rs index 16761905cb9..7ad43954010 100644 --- a/src/test/compile-fail/issue-30715.rs +++ b/src/test/compile-fail/issue-30715.rs @@ -10,7 +10,12 @@ macro_rules! parallel { ( - for $id:ident in $iter:expr { + // If future has `pred`/`moelarry` fragments (where "pred" is + // "like expr, but with `{` in its FOLLOW set"), then could + // use `pred` instead of future-proof erroring here. See also: + // + // https://github.com/rust-lang/rfcs/pull/1384#issuecomment-160165525 + for $id:ident in $iter:expr { //~ WARN `$iter:expr` is followed by `{` $( $inner:expr; )* } ) => {}; -- cgit 1.4.1-3-g733a5