Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Extend tests/ui/macros/nonterminal-matching.rs.
To involve `macro_rules!` macros, and also a mix of fragment specifiers,
some of which feature the forwaring limitation and some of which don't.
  • Loading branch information
nnethercote committed Jun 25, 2024
commit bca5cd3a9dccc166e936b21eb86e6a58d3f4b84e
30 changes: 30 additions & 0 deletions tests/ui/macros/nonterminal-matching.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,34 @@ simple_nonterminal!(a, 'a, (x, y, z)); // OK

complex_nonterminal!(enum E {});

// `ident`, `lifetime`, and `tt` all work. Other fragments do not. See
// https://doc.rust-lang.org/nightly/reference/macros-by-example.html#forwarding-a-matched-fragment
macro_rules! foo {
(ident $x:ident) => { bar!(ident $x); };
(lifetime $x:lifetime) => { bar!(lifetime $x); };
(tt $x:tt) => { bar!(tt $x); };
(expr $x:expr) => { bar!(expr $x); }; //~ ERROR: no rules expected the token `3`
(literal $x:literal) => { bar!(literal $x); }; //~ ERROR: no rules expected the token `4`
(path $x:path) => { bar!(path $x); }; //~ ERROR: no rules expected the token `a::b::c`
(stmt $x:stmt) => { bar!(stmt $x); }; //~ ERROR: no rules expected the token `let abc = 0`
}

macro_rules! bar {
(ident abc) => {};
(lifetime 'abc) => {};
(tt 2) => {};
(expr 3) => {};
(literal 4) => {};
(path a::b::c) => {};
(stmt let abc = 0) => {};
}

foo!(ident abc);
foo!(lifetime 'abc);
foo!(tt 2);
foo!(expr 3);
foo!(literal 4);
foo!(path a::b::c);
foo!(stmt let abc = 0);

fn main() {}
90 changes: 89 additions & 1 deletion tests/ui/macros/nonterminal-matching.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -23,5 +23,93 @@ LL | complex_nonterminal!(enum E {});
= help: try using `:tt` instead in the macro definition
= note: this error originates in the macro `complex_nonterminal` (in Nightly builds, run with -Z macro-backtrace for more info)

error: aborting due to 1 previous error
error: no rules expected the token `3`
--> $DIR/nonterminal-matching.rs:32:35
|
LL | (expr $x:expr) => { bar!(expr $x); };
| ^^ no rules expected this token in macro call
...
LL | macro_rules! bar {
| ---------------- when calling this macro
...
LL | foo!(expr 3);
| ------------ in this macro invocation
|
note: while trying to match `3`
--> $DIR/nonterminal-matching.rs:42:11
|
LL | (expr 3) => {};
| ^
= note: captured metavariables except for `:tt`, `:ident` and `:lifetime` cannot be compared to other tokens
= note: see <https://doc.rust-lang.org/nightly/reference/macros-by-example.html#forwarding-a-matched-fragment> for more information
= help: try using `:tt` instead in the macro definition
= note: this error originates in the macro `foo` (in Nightly builds, run with -Z macro-backtrace for more info)

error: no rules expected the token `4`
--> $DIR/nonterminal-matching.rs:33:44
|
LL | (literal $x:literal) => { bar!(literal $x); };
| ^^ no rules expected this token in macro call
...
LL | macro_rules! bar {
| ---------------- when calling this macro
...
LL | foo!(literal 4);
| --------------- in this macro invocation
|
note: while trying to match `4`
--> $DIR/nonterminal-matching.rs:43:14
|
LL | (literal 4) => {};
| ^
= note: captured metavariables except for `:tt`, `:ident` and `:lifetime` cannot be compared to other tokens
= note: see <https://doc.rust-lang.org/nightly/reference/macros-by-example.html#forwarding-a-matched-fragment> for more information
= help: try using `:tt` instead in the macro definition
= note: this error originates in the macro `foo` (in Nightly builds, run with -Z macro-backtrace for more info)

error: no rules expected the token `a::b::c`
--> $DIR/nonterminal-matching.rs:34:35
|
LL | (path $x:path) => { bar!(path $x); };
| ^^ no rules expected this token in macro call
...
LL | macro_rules! bar {
| ---------------- when calling this macro
...
LL | foo!(path a::b::c);
| ------------------ in this macro invocation
|
note: while trying to match `a`
--> $DIR/nonterminal-matching.rs:44:11
|
LL | (path a::b::c) => {};
| ^
= note: captured metavariables except for `:tt`, `:ident` and `:lifetime` cannot be compared to other tokens
= note: see <https://doc.rust-lang.org/nightly/reference/macros-by-example.html#forwarding-a-matched-fragment> for more information
= help: try using `:tt` instead in the macro definition
= note: this error originates in the macro `foo` (in Nightly builds, run with -Z macro-backtrace for more info)

error: no rules expected the token `let abc = 0`
--> $DIR/nonterminal-matching.rs:35:35
|
LL | (stmt $x:stmt) => { bar!(stmt $x); };
| ^^ no rules expected this token in macro call
...
LL | macro_rules! bar {
| ---------------- when calling this macro
...
LL | foo!(stmt let abc = 0);
| ---------------------- in this macro invocation
|
note: while trying to match `let`
--> $DIR/nonterminal-matching.rs:45:11
|
LL | (stmt let abc = 0) => {};
| ^^^
= note: captured metavariables except for `:tt`, `:ident` and `:lifetime` cannot be compared to other tokens
= note: see <https://doc.rust-lang.org/nightly/reference/macros-by-example.html#forwarding-a-matched-fragment> for more information
= help: try using `:tt` instead in the macro definition
= note: this error originates in the macro `foo` (in Nightly builds, run with -Z macro-backtrace for more info)

error: aborting due to 5 previous errors