Update tests since ? macro op is supported on 2015.
This commit is contained in:
parent
39fbcfb277
commit
1e793c71b5
33
src/test/run-pass/macros/macro-at-most-once-rep-2015.rs
Normal file
33
src/test/run-pass/macros/macro-at-most-once-rep-2015.rs
Normal file
@ -0,0 +1,33 @@
|
||||
// run-pass
|
||||
#![allow(unused_mut)]
|
||||
// The logic for parsing Kleene operators in macros has a special case to disambiguate `?`.
|
||||
// Specifically, `$(pat)?` is the ZeroOrOne operator whereas `$(pat)?+` or `$(pat)?*` are the
|
||||
// ZeroOrMore and OneOrMore operators using `?` as a separator. These tests are intended to
|
||||
// exercise that logic in the macro parser.
|
||||
//
|
||||
// Moreover, we also throw in some tests for using a separator with `?`, which is meaningless but
|
||||
// included for consistency with `+` and `*`.
|
||||
//
|
||||
// This test focuses on non-error cases and making sure the correct number of repetitions happen.
|
||||
|
||||
// edition:2015
|
||||
|
||||
macro_rules! foo {
|
||||
($($a:ident)? ; $num:expr) => { {
|
||||
let mut x = 0;
|
||||
|
||||
$(
|
||||
x += $a;
|
||||
)?
|
||||
|
||||
assert_eq!(x, $num);
|
||||
} }
|
||||
}
|
||||
|
||||
pub fn main() {
|
||||
let a = 1;
|
||||
|
||||
// accept 0 or 1 repetitions
|
||||
foo!( ; 0);
|
||||
foo!(a ; 1);
|
||||
}
|
@ -1,7 +1,7 @@
|
||||
#![allow(unused_macros)]
|
||||
|
||||
macro_rules! assign {
|
||||
(($($a:tt)*) = ($($b:tt))*) => { //~ ERROR expected `*` or `+`
|
||||
(($($a:tt)*) = ($($b:tt))*) => { //~ ERROR expected one of: `*`, `+`, or `?`
|
||||
$($a)* = $($b)*
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
error: expected `*` or `+`
|
||||
error: expected one of: `*`, `+`, or `?`
|
||||
--> $DIR/issue-39388.rs:4:22
|
||||
|
|
||||
LL | (($($a:tt)*) = ($($b:tt))*) => {
|
||||
|
@ -1,13 +0,0 @@
|
||||
// Test behavior of `?` macro _kleene op_ under the 2015 edition. Namely, it doesn't exist.
|
||||
|
||||
// edition:2015
|
||||
|
||||
macro_rules! bar {
|
||||
($(a)?) => {} //~ERROR expected `*` or `+`
|
||||
}
|
||||
|
||||
macro_rules! baz {
|
||||
($(a),?) => {} //~ERROR expected `*` or `+`
|
||||
}
|
||||
|
||||
fn main() {}
|
@ -1,18 +0,0 @@
|
||||
error: expected `*` or `+`
|
||||
--> $DIR/macro-at-most-once-rep-2015-ques-rep.rs:6:10
|
||||
|
|
||||
LL | ($(a)?) => {}
|
||||
| ^
|
||||
|
|
||||
= note: `?` is not a macro repetition operator in the 2015 edition, but is accepted in the 2018 edition
|
||||
|
||||
error: expected `*` or `+`
|
||||
--> $DIR/macro-at-most-once-rep-2015-ques-rep.rs:10:11
|
||||
|
|
||||
LL | ($(a),?) => {}
|
||||
| ^
|
||||
|
|
||||
= note: `?` is not a macro repetition operator in the 2015 edition, but is accepted in the 2018 edition
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
@ -1,28 +0,0 @@
|
||||
// Test behavior of `?` macro _separator_ under the 2015 edition. Namely, `?` can be used as a
|
||||
// separator, but you get a migration warning for the edition.
|
||||
|
||||
// edition:2015
|
||||
// compile-pass
|
||||
|
||||
#![warn(rust_2018_compatibility)]
|
||||
|
||||
macro_rules! bar {
|
||||
($(a)?*) => {} //~WARN using `?` as a separator
|
||||
//~^WARN this was previously accepted
|
||||
}
|
||||
|
||||
macro_rules! baz {
|
||||
($(a)?+) => {} //~WARN using `?` as a separator
|
||||
//~^WARN this was previously accepted
|
||||
}
|
||||
|
||||
fn main() {
|
||||
bar!();
|
||||
bar!(a);
|
||||
bar!(a?a);
|
||||
bar!(a?a?a?a?a);
|
||||
|
||||
baz!(a);
|
||||
baz!(a?a);
|
||||
baz!(a?a?a?a?a);
|
||||
}
|
@ -1,24 +0,0 @@
|
||||
warning: using `?` as a separator is deprecated and will be a hard error in an upcoming edition
|
||||
--> $DIR/macro-at-most-once-rep-2015-ques-sep.rs:10:10
|
||||
|
|
||||
LL | ($(a)?*) => {}
|
||||
| ^
|
||||
|
|
||||
note: lint level defined here
|
||||
--> $DIR/macro-at-most-once-rep-2015-ques-sep.rs:7:9
|
||||
|
|
||||
LL | #![warn(rust_2018_compatibility)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^
|
||||
= note: #[warn(question_mark_macro_sep)] implied by #[warn(rust_2018_compatibility)]
|
||||
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in the 2018 edition!
|
||||
= note: for more information, see issue #48075 <https://github.com/rust-lang/rust/issues/48075>
|
||||
|
||||
warning: using `?` as a separator is deprecated and will be a hard error in an upcoming edition
|
||||
--> $DIR/macro-at-most-once-rep-2015-ques-sep.rs:15:10
|
||||
|
|
||||
LL | ($(a)?+) => {}
|
||||
| ^
|
||||
|
|
||||
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in the 2018 edition!
|
||||
= note: for more information, see issue #48075 <https://github.com/rust-lang/rust/issues/48075>
|
||||
|
41
src/test/ui/macros/macro-at-most-once-rep-2015.rs
Normal file
41
src/test/ui/macros/macro-at-most-once-rep-2015.rs
Normal file
@ -0,0 +1,41 @@
|
||||
// Tests that `?` is a Kleene op and not a macro separator in the 2015 edition.
|
||||
|
||||
// edition:2015
|
||||
|
||||
macro_rules! foo {
|
||||
($(a)?) => {};
|
||||
}
|
||||
|
||||
macro_rules! baz {
|
||||
($(a),?) => {}; //~ERROR the `?` macro repetition operator
|
||||
}
|
||||
|
||||
macro_rules! barplus {
|
||||
($(a)?+) => {}; // ok. matches "a+" and "+"
|
||||
}
|
||||
|
||||
macro_rules! barstar {
|
||||
($(a)?*) => {}; // ok. matches "a*" and "*"
|
||||
}
|
||||
|
||||
pub fn main() {
|
||||
foo!();
|
||||
foo!(a);
|
||||
foo!(a?); //~ ERROR no rules expected the token `?`
|
||||
foo!(a?a); //~ ERROR no rules expected the token `?`
|
||||
foo!(a?a?a); //~ ERROR no rules expected the token `?`
|
||||
|
||||
barplus!(); //~ERROR unexpected end of macro invocation
|
||||
barplus!(a); //~ERROR unexpected end of macro invocation
|
||||
barplus!(a?); //~ ERROR no rules expected the token `?`
|
||||
barplus!(a?a); //~ ERROR no rules expected the token `?`
|
||||
barplus!(a+);
|
||||
barplus!(+);
|
||||
|
||||
barstar!(); //~ERROR unexpected end of macro invocation
|
||||
barstar!(a); //~ERROR unexpected end of macro invocation
|
||||
barstar!(a?); //~ ERROR no rules expected the token `?`
|
||||
barstar!(a?a); //~ ERROR no rules expected the token `?`
|
||||
barstar!(a*);
|
||||
barstar!(*);
|
||||
}
|
107
src/test/ui/macros/macro-at-most-once-rep-2015.stderr
Normal file
107
src/test/ui/macros/macro-at-most-once-rep-2015.stderr
Normal file
@ -0,0 +1,107 @@
|
||||
error: the `?` macro repetition operator does not take a separator
|
||||
--> $DIR/macro-at-most-once-rep-2015.rs:10:10
|
||||
|
|
||||
LL | ($(a),?) => {};
|
||||
| ^
|
||||
|
||||
error: no rules expected the token `?`
|
||||
--> $DIR/macro-at-most-once-rep-2015.rs:24:11
|
||||
|
|
||||
LL | macro_rules! foo {
|
||||
| ---------------- when calling this macro
|
||||
...
|
||||
LL | foo!(a?);
|
||||
| ^ no rules expected this token in macro call
|
||||
|
||||
error: no rules expected the token `?`
|
||||
--> $DIR/macro-at-most-once-rep-2015.rs:25:11
|
||||
|
|
||||
LL | macro_rules! foo {
|
||||
| ---------------- when calling this macro
|
||||
...
|
||||
LL | foo!(a?a);
|
||||
| ^ no rules expected this token in macro call
|
||||
|
||||
error: no rules expected the token `?`
|
||||
--> $DIR/macro-at-most-once-rep-2015.rs:26:11
|
||||
|
|
||||
LL | macro_rules! foo {
|
||||
| ---------------- when calling this macro
|
||||
...
|
||||
LL | foo!(a?a?a);
|
||||
| ^ no rules expected this token in macro call
|
||||
|
||||
error: unexpected end of macro invocation
|
||||
--> $DIR/macro-at-most-once-rep-2015.rs:28:5
|
||||
|
|
||||
LL | macro_rules! barplus {
|
||||
| -------------------- when calling this macro
|
||||
...
|
||||
LL | barplus!();
|
||||
| ^^^^^^^^^^^ missing tokens in macro arguments
|
||||
|
||||
error: unexpected end of macro invocation
|
||||
--> $DIR/macro-at-most-once-rep-2015.rs:29:15
|
||||
|
|
||||
LL | macro_rules! barplus {
|
||||
| -------------------- when calling this macro
|
||||
...
|
||||
LL | barplus!(a);
|
||||
| ^ missing tokens in macro arguments
|
||||
|
||||
error: no rules expected the token `?`
|
||||
--> $DIR/macro-at-most-once-rep-2015.rs:30:15
|
||||
|
|
||||
LL | macro_rules! barplus {
|
||||
| -------------------- when calling this macro
|
||||
...
|
||||
LL | barplus!(a?);
|
||||
| ^ no rules expected this token in macro call
|
||||
|
||||
error: no rules expected the token `?`
|
||||
--> $DIR/macro-at-most-once-rep-2015.rs:31:15
|
||||
|
|
||||
LL | macro_rules! barplus {
|
||||
| -------------------- when calling this macro
|
||||
...
|
||||
LL | barplus!(a?a);
|
||||
| ^ no rules expected this token in macro call
|
||||
|
||||
error: unexpected end of macro invocation
|
||||
--> $DIR/macro-at-most-once-rep-2015.rs:35:5
|
||||
|
|
||||
LL | macro_rules! barstar {
|
||||
| -------------------- when calling this macro
|
||||
...
|
||||
LL | barstar!();
|
||||
| ^^^^^^^^^^^ missing tokens in macro arguments
|
||||
|
||||
error: unexpected end of macro invocation
|
||||
--> $DIR/macro-at-most-once-rep-2015.rs:36:15
|
||||
|
|
||||
LL | macro_rules! barstar {
|
||||
| -------------------- when calling this macro
|
||||
...
|
||||
LL | barstar!(a);
|
||||
| ^ missing tokens in macro arguments
|
||||
|
||||
error: no rules expected the token `?`
|
||||
--> $DIR/macro-at-most-once-rep-2015.rs:37:15
|
||||
|
|
||||
LL | macro_rules! barstar {
|
||||
| -------------------- when calling this macro
|
||||
...
|
||||
LL | barstar!(a?);
|
||||
| ^ no rules expected this token in macro call
|
||||
|
||||
error: no rules expected the token `?`
|
||||
--> $DIR/macro-at-most-once-rep-2015.rs:38:15
|
||||
|
|
||||
LL | macro_rules! barstar {
|
||||
| -------------------- when calling this macro
|
||||
...
|
||||
LL | barstar!(a?a);
|
||||
| ^ no rules expected this token in macro call
|
||||
|
||||
error: aborting due to 12 previous errors
|
||||
|
@ -1,7 +1,7 @@
|
||||
macro_rules! foo {
|
||||
{ $+ } => { //~ ERROR expected identifier, found `+`
|
||||
//~^ ERROR missing fragment specifier
|
||||
$(x)(y) //~ ERROR expected `*` or `+`
|
||||
$(x)(y) //~ ERROR expected one of: `*`, `+`, or `?`
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4,7 +4,7 @@ error: expected identifier, found `+`
|
||||
LL | { $+ } => {
|
||||
| ^
|
||||
|
||||
error: expected `*` or `+`
|
||||
error: expected one of: `*`, `+`, or `?`
|
||||
--> $DIR/issue-33569.rs:4:13
|
||||
|
|
||||
LL | $(x)(y)
|
||||
|
Loading…
x
Reference in New Issue
Block a user