diff options
| author | bors <bors@rust-lang.org> | 2018-09-09 21:00:55 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2018-09-09 21:00:55 +0000 |
| commit | 2d4e34ca8bb1369f7e0eea4cb50e6faa0827a6e5 (patch) | |
| tree | 9e250b17aba2c7174bea5e7d7fb1a598da7e0ff2 /src/test | |
| parent | f50b7758f4dc85dc1c5e38258adaa94213ac6ed1 (diff) | |
| parent | 2dce3779bbc0353ff9fb544774417a851027fcab (diff) | |
| download | rust-2d4e34ca8bb1369f7e0eea4cb50e6faa0827a6e5.tar.gz rust-2d4e34ca8bb1369f7e0eea4cb50e6faa0827a6e5.zip | |
Auto merge of #53778 - petrochenkov:shadrelax2, r=nikomatsakis
resolve: Relax shadowing restrictions on macro-expanded macros Previously any macro-expanded macros weren't allowed to shadow macros from outer scopes. Now only "more macro-expanded" macros cannot shadow "less macro-expanded" macros. See comments to `fn may_appear_after` and added tests for more details and examples. The functional changes are a21f6f588fc28c97533130ae44a6957b579ab58c and 46dd365ce9ca0a6b8653849b80267763c542842a, other commits are refactorings.
Diffstat (limited to 'src/test')
21 files changed, 975 insertions, 42 deletions
diff --git a/src/test/ui/error-codes/E0659.stderr b/src/test/ui/error-codes/E0659.stderr index 06176085b38..f168b7797ca 100644 --- a/src/test/ui/error-codes/E0659.stderr +++ b/src/test/ui/error-codes/E0659.stderr @@ -1,8 +1,8 @@ error[E0659]: `foo` is ambiguous - --> $DIR/E0659.rs:25:5 + --> $DIR/E0659.rs:25:15 | LL | collider::foo(); //~ ERROR E0659 - | ^^^^^^^^^^^^^ + | ^^^ ambiguous name | note: `foo` could refer to the name imported here --> $DIR/E0659.rs:20:13 diff --git a/src/test/ui/imports/duplicate.stderr b/src/test/ui/imports/duplicate.stderr index 452e3e1e200..9cdd7aa88f1 100644 --- a/src/test/ui/imports/duplicate.stderr +++ b/src/test/ui/imports/duplicate.stderr @@ -13,10 +13,10 @@ LL | use a::foo as other_foo; //~ ERROR the name `foo` is defined multiple t | ^^^^^^^^^^^^^^^^^^^ error[E0659]: `foo` is ambiguous - --> $DIR/duplicate.rs:56:9 + --> $DIR/duplicate.rs:56:15 | LL | use self::foo::bar; //~ ERROR `foo` is ambiguous - | ^^^^^^^^^^^^^^ + | ^^^ ambiguous name | note: `foo` could refer to the name imported here --> $DIR/duplicate.rs:53:9 @@ -31,10 +31,10 @@ LL | use self::m2::*; = note: consider adding an explicit import of `foo` to disambiguate error[E0659]: `foo` is ambiguous - --> $DIR/duplicate.rs:45:5 + --> $DIR/duplicate.rs:45:8 | LL | f::foo(); //~ ERROR `foo` is ambiguous - | ^^^^^^ + | ^^^ ambiguous name | note: `foo` could refer to the name imported here --> $DIR/duplicate.rs:34:13 @@ -49,10 +49,10 @@ LL | pub use b::*; = note: consider adding an explicit import of `foo` to disambiguate error[E0659]: `foo` is ambiguous - --> $DIR/duplicate.rs:46:5 + --> $DIR/duplicate.rs:46:8 | LL | g::foo(); //~ ERROR `foo` is ambiguous - | ^^^^^^ + | ^^^ ambiguous name | note: `foo` could refer to the name imported here --> $DIR/duplicate.rs:39:13 @@ -70,7 +70,7 @@ error[E0659]: `foo` is ambiguous --> $DIR/duplicate.rs:59:9 | LL | foo::bar(); //~ ERROR `foo` is ambiguous - | ^^^^^^^^ + | ^^^ ambiguous name | note: `foo` could refer to the name imported here --> $DIR/duplicate.rs:53:9 diff --git a/src/test/ui/imports/glob-shadowing.stderr b/src/test/ui/imports/glob-shadowing.stderr index 7f61cd6c76d..33a2963fa29 100644 --- a/src/test/ui/imports/glob-shadowing.stderr +++ b/src/test/ui/imports/glob-shadowing.stderr @@ -2,7 +2,7 @@ error[E0659]: `env` is ambiguous --> $DIR/glob-shadowing.rs:21:17 | LL | let x = env!("PATH"); //~ ERROR `env` is ambiguous - | ^^^ + | ^^^ ambiguous name | note: `env` could refer to the name imported here --> $DIR/glob-shadowing.rs:19:9 @@ -16,7 +16,7 @@ error[E0659]: `env` is ambiguous --> $DIR/glob-shadowing.rs:29:21 | LL | let x = env!("PATH"); //~ ERROR `env` is ambiguous - | ^^^ + | ^^^ ambiguous name | note: `env` could refer to the name imported here --> $DIR/glob-shadowing.rs:27:13 @@ -30,7 +30,7 @@ error[E0659]: `fenv` is ambiguous --> $DIR/glob-shadowing.rs:39:21 | LL | let x = fenv!(); //~ ERROR `fenv` is ambiguous - | ^^^^ + | ^^^^ ambiguous name | note: `fenv` could refer to the name imported here --> $DIR/glob-shadowing.rs:37:13 diff --git a/src/test/ui/imports/issue-53269.stderr b/src/test/ui/imports/issue-53269.stderr index 0036d71107a..e125983151d 100644 --- a/src/test/ui/imports/issue-53269.stderr +++ b/src/test/ui/imports/issue-53269.stderr @@ -8,7 +8,7 @@ error[E0659]: `mac` is ambiguous --> $DIR/issue-53269.rs:18:5 | LL | mac!(); //~ ERROR `mac` is ambiguous - | ^^^ + | ^^^ ambiguous name | note: `mac` could refer to the name defined here --> $DIR/issue-53269.rs:13:1 diff --git a/src/test/ui/imports/local-modularized-tricky-fail-1.rs b/src/test/ui/imports/local-modularized-tricky-fail-1.rs index 445344732f7..fb05b95a96d 100644 --- a/src/test/ui/imports/local-modularized-tricky-fail-1.rs +++ b/src/test/ui/imports/local-modularized-tricky-fail-1.rs @@ -43,7 +43,6 @@ mod inner2 { fn main() { panic!(); //~ ERROR `panic` is ambiguous - //~^ ERROR `panic` is ambiguous } mod inner3 { diff --git a/src/test/ui/imports/local-modularized-tricky-fail-1.stderr b/src/test/ui/imports/local-modularized-tricky-fail-1.stderr index e9a81e7ae4c..cce1fd30f1d 100644 --- a/src/test/ui/imports/local-modularized-tricky-fail-1.stderr +++ b/src/test/ui/imports/local-modularized-tricky-fail-1.stderr @@ -2,7 +2,7 @@ error[E0659]: `exported` is ambiguous --> $DIR/local-modularized-tricky-fail-1.rs:38:1 | LL | exported!(); //~ ERROR `exported` is ambiguous - | ^^^^^^^^ + | ^^^^^^^^ ambiguous name | note: `exported` could refer to the name defined here --> $DIR/local-modularized-tricky-fail-1.rs:15:5 @@ -22,10 +22,10 @@ LL | use inner1::*; = note: macro-expanded macros do not shadow error[E0659]: `include` is ambiguous - --> $DIR/local-modularized-tricky-fail-1.rs:57:1 + --> $DIR/local-modularized-tricky-fail-1.rs:56:1 | LL | include!(); //~ ERROR `include` is ambiguous - | ^^^^^^^ + | ^^^^^^^ ambiguous name | note: `include` could refer to the name defined here --> $DIR/local-modularized-tricky-fail-1.rs:27:5 @@ -44,7 +44,7 @@ error[E0659]: `panic` is ambiguous --> $DIR/local-modularized-tricky-fail-1.rs:45:5 | LL | panic!(); //~ ERROR `panic` is ambiguous - | ^^^^^ + | ^^^^^ ambiguous name | note: `panic` could refer to the name defined here --> $DIR/local-modularized-tricky-fail-1.rs:21:5 @@ -60,10 +60,10 @@ LL | define_panic!(); = note: macro-expanded macros do not shadow error[E0659]: `panic` is ambiguous - --> $DIR/local-modularized-tricky-fail-1.rs:45:5 + --> <panic macros>:1:13 | -LL | panic!(); //~ ERROR `panic` is ambiguous - | ^^^^^^^^^ +LL | ( ) => ( { panic ! ( "explicit panic" ) } ) ; ( $ msg : expr ) => ( + | ^^^^^ ambiguous name | note: `panic` could refer to the name defined here --> $DIR/local-modularized-tricky-fail-1.rs:21:5 @@ -77,7 +77,6 @@ LL | define_panic!(); | ---------------- in this macro invocation = note: `panic` is also a builtin macro = note: macro-expanded macros do not shadow - = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) error: aborting due to 4 previous errors diff --git a/src/test/ui/imports/macro-paths.stderr b/src/test/ui/imports/macro-paths.stderr index 08f45e1a575..a612c64c2f4 100644 --- a/src/test/ui/imports/macro-paths.stderr +++ b/src/test/ui/imports/macro-paths.stderr @@ -2,7 +2,7 @@ error[E0659]: `bar` is ambiguous --> $DIR/macro-paths.rs:23:5 | LL | bar::m! { //~ ERROR ambiguous - | ^^^^^^ + | ^^^ ambiguous name | note: `bar` could refer to the name defined here --> $DIR/macro-paths.rs:24:9 @@ -20,7 +20,7 @@ error[E0659]: `baz` is ambiguous --> $DIR/macro-paths.rs:33:5 | LL | baz::m! { //~ ERROR ambiguous - | ^^^^^^ + | ^^^ ambiguous name | note: `baz` could refer to the name defined here --> $DIR/macro-paths.rs:34:9 diff --git a/src/test/ui/imports/macros.stderr b/src/test/ui/imports/macros.stderr index 2c0c4642067..c54101fc6e6 100644 --- a/src/test/ui/imports/macros.stderr +++ b/src/test/ui/imports/macros.stderr @@ -2,7 +2,7 @@ error[E0659]: `m` is ambiguous --> $DIR/macros.rs:48:5 | LL | m!(); //~ ERROR ambiguous - | ^ + | ^ ambiguous name | note: `m` could refer to the name defined here --> $DIR/macros.rs:46:5 @@ -19,7 +19,7 @@ error[E0659]: `m` is ambiguous --> $DIR/macros.rs:26:5 | LL | m! { //~ ERROR ambiguous - | ^ + | ^ ambiguous name | note: `m` could refer to the name imported here --> $DIR/macros.rs:27:13 @@ -37,7 +37,7 @@ error[E0659]: `m` is ambiguous --> $DIR/macros.rs:39:9 | LL | m! { //~ ERROR ambiguous - | ^ + | ^ ambiguous name | note: `m` could refer to the name imported here --> $DIR/macros.rs:40:17 diff --git a/src/test/ui/imports/rfc-1560-warning-cycle.stderr b/src/test/ui/imports/rfc-1560-warning-cycle.stderr index 5a01680fc19..91af3a4b6ac 100644 --- a/src/test/ui/imports/rfc-1560-warning-cycle.stderr +++ b/src/test/ui/imports/rfc-1560-warning-cycle.stderr @@ -2,7 +2,7 @@ error[E0659]: `Foo` is ambiguous --> $DIR/rfc-1560-warning-cycle.rs:19:17 | LL | fn f(_: Foo) {} //~ ERROR `Foo` is ambiguous - | ^^^ + | ^^^ ambiguous name | note: `Foo` could refer to the name imported here --> $DIR/rfc-1560-warning-cycle.rs:17:13 diff --git a/src/test/ui/imports/shadow_builtin_macros.stderr b/src/test/ui/imports/shadow_builtin_macros.stderr index 5c7f15b6fe2..e554bbb4f31 100644 --- a/src/test/ui/imports/shadow_builtin_macros.stderr +++ b/src/test/ui/imports/shadow_builtin_macros.stderr @@ -2,7 +2,7 @@ error[E0659]: `panic` is ambiguous --> $DIR/shadow_builtin_macros.rs:43:5 | LL | panic!(); //~ ERROR `panic` is ambiguous - | ^^^^^ + | ^^^^^ ambiguous name | note: `panic` could refer to the name defined here --> $DIR/shadow_builtin_macros.rs:40:9 @@ -19,7 +19,7 @@ error[E0659]: `panic` is ambiguous --> $DIR/shadow_builtin_macros.rs:25:14 | LL | fn f() { panic!(); } //~ ERROR ambiguous - | ^^^^^ + | ^^^^^ ambiguous name | note: `panic` could refer to the name imported here --> $DIR/shadow_builtin_macros.rs:24:9 @@ -33,7 +33,7 @@ error[E0659]: `panic` is ambiguous --> $DIR/shadow_builtin_macros.rs:30:14 | LL | fn f() { panic!(); } //~ ERROR ambiguous - | ^^^^^ + | ^^^^^ ambiguous name | note: `panic` could refer to the name imported here --> $DIR/shadow_builtin_macros.rs:29:26 @@ -47,7 +47,7 @@ error[E0659]: `n` is ambiguous --> $DIR/shadow_builtin_macros.rs:59:5 | LL | n!(); //~ ERROR ambiguous - | ^ + | ^ ambiguous name | note: `n` could refer to the name imported here --> $DIR/shadow_builtin_macros.rs:58:9 diff --git a/src/test/ui/macros/auxiliary/macro-in-other-crate.rs b/src/test/ui/macros/auxiliary/macro-in-other-crate.rs index c787cedc2d0..7f716c5012e 100644 --- a/src/test/ui/macros/auxiliary/macro-in-other-crate.rs +++ b/src/test/ui/macros/auxiliary/macro-in-other-crate.rs @@ -17,3 +17,8 @@ macro_rules! mac { macro_rules! inline { () => () } + +#[macro_export] +macro_rules! from_prelude { + () => () +} diff --git a/src/test/ui/macros/macro-path-prelude-shadowing.stderr b/src/test/ui/macros/macro-path-prelude-shadowing.stderr index c0892f97376..607d3e100aa 100644 --- a/src/test/ui/macros/macro-path-prelude-shadowing.stderr +++ b/src/test/ui/macros/macro-path-prelude-shadowing.stderr @@ -2,7 +2,7 @@ error[E0659]: `std` is ambiguous --> $DIR/macro-path-prelude-shadowing.rs:39:9 | LL | std::panic!(); //~ ERROR `std` is ambiguous - | ^^^^^^^^^^ + | ^^^ ambiguous name | note: `std` could refer to the name imported here --> $DIR/macro-path-prelude-shadowing.rs:37:9 diff --git a/src/test/ui/macros/macro-shadowing-relaxed.rs b/src/test/ui/macros/macro-shadowing-relaxed.rs new file mode 100644 index 00000000000..8d5b03b098f --- /dev/null +++ b/src/test/ui/macros/macro-shadowing-relaxed.rs @@ -0,0 +1,35 @@ +// 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 <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. + +// compile-pass +// aux-build:macro-in-other-crate.rs + +#![feature(decl_macro)] + +macro_rules! my_include {() => { + // Outer + macro m() {} + #[macro_use(from_prelude)] extern crate macro_in_other_crate; + + fn inner() { + // Inner + macro m() {} + macro_rules! from_prelude { () => {} } + + // OK, both `m` and `from_prelude` are macro-expanded, + // but no more macro-expanded than their counterpart from outer scope. + m!(); + from_prelude!(); + } +}} + +my_include!(); + +fn main() {} diff --git a/src/test/ui/macros/macro-shadowing.rs b/src/test/ui/macros/macro-shadowing.rs index 61abaf8a2dd..bf0a7fa21d3 100644 --- a/src/test/ui/macros/macro-shadowing.rs +++ b/src/test/ui/macros/macro-shadowing.rs @@ -17,14 +17,14 @@ macro_rules! macro_one { () => {} } #[macro_use(macro_two)] extern crate two_macros; macro_rules! m1 { () => { - macro_rules! foo { () => {} } //~ ERROR `foo` is already in scope + macro_rules! foo { () => {} } #[macro_use] //~ ERROR `macro_two` is already in scope extern crate two_macros as __; }} m1!(); -foo!(); +foo!(); //~ ERROR `foo` is ambiguous macro_rules! m2 { () => { macro_rules! foo { () => {} } diff --git a/src/test/ui/macros/macro-shadowing.stderr b/src/test/ui/macros/macro-shadowing.stderr index 28f09509a62..d996f3a7041 100644 --- a/src/test/ui/macros/macro-shadowing.stderr +++ b/src/test/ui/macros/macro-shadowing.stderr @@ -9,16 +9,27 @@ LL | m1!(); | = note: macro-expanded `#[macro_use]`s may not shadow existing macros (see RFC 1560) -error: `foo` is already in scope +error[E0659]: `foo` is ambiguous + --> $DIR/macro-shadowing.rs:27:1 + | +LL | foo!(); //~ ERROR `foo` is ambiguous + | ^^^ ambiguous name + | +note: `foo` could refer to the name defined here --> $DIR/macro-shadowing.rs:20:5 | -LL | macro_rules! foo { () => {} } //~ ERROR `foo` is already in scope +LL | macro_rules! foo { () => {} } | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ... LL | m1!(); | ------ in this macro invocation +note: `foo` could also refer to the name defined here + --> $DIR/macro-shadowing.rs:15:1 | - = note: macro-expanded `macro_rules!`s may not shadow existing macros (see RFC 1560) +LL | macro_rules! foo { () => {} } + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + = note: macro-expanded macros do not shadow error: aborting due to 2 previous errors +For more information about this error, try `rustc --explain E0659`. diff --git a/src/test/ui/macros/restricted-shadowing-legacy.rs b/src/test/ui/macros/restricted-shadowing-legacy.rs new file mode 100644 index 00000000000..f5cac2dfbfb --- /dev/null +++ b/src/test/ui/macros/restricted-shadowing-legacy.rs @@ -0,0 +1,289 @@ +// Legend: +// `N` - number of combination, from 0 to 4*4*4=64 +// `Outer < Invoc` means that expansion that produced macro definition `Outer` +// is a strict ancestor of expansion that produced macro definition `Inner`. +// `>`, `=` and `Unordered` mean "strict descendant", "same" and +// "not in ordering relation" for parent expansions. +// `+` - possible configuration +// `-` - configuration impossible due to properties of partial ordering +// `-?` - configuration impossible due to block/scope syntax +// `+?` - configuration possible only with legacy scoping + +// N | Outer ~ Invoc | Invoc ~ Inner | Outer ~ Inner | Possible | +// 1 | < | < | < | + | +// 2 | < | < | = | - | +// 3 | < | < | > | - | +// 4 | < | < | Unordered | - | +// 5 | < | = | < | + | +// 6 | < | = | = | - | +// 7 | < | = | > | - | +// 8 | < | = | Unordered | - | +// 9 | < | > | < | + | +// 10 | < | > | = | + | +// 11 | < | > | > | -? | +// 12 | < | > | Unordered | -? | +// 13 | < | Unordered | < | + | +// 14 | < | Unordered | = | - | +// 15 | < | Unordered | > | - | +// 16 | < | Unordered | Unordered | -? | +// 17 | = | < | < | + | +// 18 | = | < | = | - | +// 19 | = | < | > | - | +// 20 | = | < | Unordered | - | +// 21 | = | = | < | - | +// 22 | = | = | = | + | +// 23 | = | = | > | - | +// 24 | = | = | Unordered | - | +// 25 | = | > | < | - | +// 26 | = | > | = | - | +// 27 | = | > | > | -? | +// 28 | = | > | Unordered | - | +// 29 | = | Unordered | < | - | +// 30 | = | Unordered | = | - | +// 31 | = | Unordered | > | - | +// 32 | = | Unordered | Unordered | -? | +// 33 | > | < | < | +? | +// 34 | > | < | = | +? | +// 35 | > | < | > | +? | +// 36 | > | < | Unordered | + | +// 37 | > | = | < | - | +// 38 | > | = | = | - | +// 39 | > | = | > | + | +// 40 | > | = | Unordered | - | +// 41 | > | > | < | - | +// 42 | > | > | = | - | +// 43 | > | > | > | -? | +// 44 | > | > | Unordered | - | +// 45 | > | Unordered | < | - | +// 46 | > | Unordered | = | - | +// 47 | > | Unordered | > | -? | +// 48 | > | Unordered | Unordered | -? | +// 49 | Unordered | < | < | -? | +// 50 | Unordered | < | = | - | +// 51 | Unordered | < | > | - | +// 52 | Unordered | < | Unordered | + | +// 53 | Unordered | = | < | - | +// 54 | Unordered | = | = | - | +// 55 | Unordered | = | > | - | +// 56 | Unordered | = | Unordered | + | +// 57 | Unordered | > | < | - | +// 58 | Unordered | > | = | - | +// 59 | Unordered | > | > | + | +// 60 | Unordered | > | Unordered | + | +// 61 | Unordered | Unordered | < | +? | +// 62 | Unordered | Unordered | = | +? | +// 63 | Unordered | Unordered | > | +? | +// 64 | Unordered | Unordered | Unordered | + | + +#![feature(decl_macro, rustc_attrs)] + +struct Right; +// struct Wrong; // not defined + +macro_rules! include { () => { + macro_rules! gen_outer { () => { + macro_rules! m { () => { Wrong } } + }} + macro_rules! gen_inner { () => { + macro_rules! m { () => { Right } } + }} + macro_rules! gen_invoc { () => { + m!() + }} + + // ----------------------------------------------------------- + + fn check1() { + macro_rules! m { () => {} } + + macro_rules! gen_gen_inner_invoc { () => { + gen_inner!(); + m!(); //~ ERROR `m` is ambiguous + }} + gen_gen_inner_invoc!(); + } + + fn check5() { + macro_rules! m { () => { Wrong } } + + macro_rules! gen_inner_invoc { () => { + macro_rules! m { () => { Right } } + m!(); // OK + }} + gen_inner_invoc!(); + } + + fn check9() { + macro_rules! m { () => { Wrong } } + + macro_rules! gen_inner_gen_invoc { () => { + macro_rules! m { () => { Right } } + gen_invoc!(); // OK + }} + gen_inner_gen_invoc!(); + } + + fn check10() { + macro_rules! m { () => { Wrong } } + + macro_rules! m { () => { Right } } + + gen_invoc!(); // OK + } + + fn check13() { + macro_rules! m { () => {} } + + gen_inner!(); + + macro_rules! gen_invoc { () => { m!() } } //~ ERROR `m` is ambiguous + gen_invoc!(); + } + + fn check17() { + macro_rules! m { () => {} } + + gen_inner!(); + + m!(); //~ ERROR `m` is ambiguous + } + + fn check22() { + macro_rules! m { () => { Wrong } } + + macro_rules! m { () => { Right } } + + m!(); // OK + } + + fn check36() { + gen_outer!(); + + gen_inner!(); + + m!(); //~ ERROR `m` is ambiguous + } + + fn check39() { + gen_outer!(); + + macro_rules! m { () => { Right } } + + m!(); // OK + } + + fn check52() { + gen_outer!(); + + macro_rules! gen_gen_inner_invoc { () => { + gen_inner!(); + m!(); //~ ERROR `m` is ambiguous + }} + gen_gen_inner_invoc!(); + } + + fn check56() { + gen_outer!(); + + macro_rules! gen_inner_invoc { () => { + macro_rules! m { () => { Right } } + m!(); // OK + }} + gen_inner_invoc!(); + } + + fn check59() { + gen_outer!(); + + macro_rules! m { () => { Right } } + + gen_invoc!(); // OK + } + + fn check60() { + gen_outer!(); + + macro_rules! gen_inner_gen_invoc { () => { + macro_rules! m { () => { Right } } + gen_invoc!(); // OK + }} + gen_inner_gen_invoc!(); + } + + fn check64() { + gen_outer!(); + + gen_inner!(); + + macro_rules! gen_invoc { () => { m!() } } //~ ERROR `m` is ambiguous + gen_invoc!(); + } + + // ----------------------------------------------------------- + // These configurations are only possible with legacy macro scoping + + fn check33() { + macro_rules! gen_outer_gen_inner { () => { + macro_rules! m { () => {} } + gen_inner!(); + }} + gen_outer_gen_inner!(); + + m!(); //~ ERROR `m` is ambiguous + } + + fn check34() { + macro_rules! gen_outer_inner { () => { + macro_rules! m { () => { Wrong } } + macro_rules! m { () => { Right } } + }} + gen_outer_inner!(); + + m!(); // OK + } + + fn check35() { + macro_rules! gen_gen_outer_inner { () => { + gen_outer!(); + macro_rules! m { () => { Right } } + }} + gen_gen_outer_inner!(); + + m!(); // OK + } + + fn check61() { + macro_rules! gen_outer_gen_inner { () => { + macro_rules! m { () => {} } + gen_inner!(); + }} + gen_outer_gen_inner!(); + + macro_rules! gen_invoc { () => { m!() } } //~ ERROR `m` is ambiguous + gen_invoc!(); + } + + fn check62() { + macro_rules! gen_outer_inner { () => { + macro_rules! m { () => { Wrong } } + macro_rules! m { () => { Right } } + }} + gen_outer_inner!(); + + gen_invoc!(); // OK + } + + fn check63() { + macro_rules! gen_gen_outer_inner { () => { + gen_outer!(); + macro_rules! m { () => { Right } } + }} + gen_gen_outer_inner!(); + + gen_invoc!(); // OK + } +}} + +include!(); + +fn main() {} diff --git a/src/test/ui/macros/restricted-shadowing-legacy.stderr b/src/test/ui/macros/restricted-shadowing-legacy.stderr new file mode 100644 index 00000000000..9e0d40c44b6 --- /dev/null +++ b/src/test/ui/macros/restricted-shadowing-legacy.stderr @@ -0,0 +1,195 @@ +error[E0659]: `m` is ambiguous + --> $DIR/restricted-shadowing-legacy.rs:101:13 + | +LL | m!(); //~ ERROR `m` is ambiguous + | ^ ambiguous name + | +note: `m` could refer to the name defined here + --> $DIR/restricted-shadowing-legacy.rs:88:9 + | +LL | macro_rules! m { () => { Right } } + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +... +LL | include!(); + | ----------- in this macro invocation +note: `m` could also refer to the name defined here + --> $DIR/restricted-shadowing-legacy.rs:97:9 + | +LL | macro_rules! m { () => {} } + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ +... +LL | include!(); + | ----------- in this macro invocation + = note: macro-expanded macros do not shadow + +error[E0659]: `m` is ambiguous + --> $DIR/restricted-shadowing-legacy.rs:139:42 + | +LL | macro_rules! gen_invoc { () => { m!() } } //~ ERROR `m` is ambiguous + | ^ ambiguous name + | +note: `m` could refer to the name defined here + --> $DIR/restricted-shadowing-legacy.rs:88:9 + | +LL | macro_rules! m { () => { Right } } + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +... +LL | include!(); + | ----------- in this macro invocation +note: `m` could also refer to the name defined here + --> $DIR/restricted-shadowing-legacy.rs:135:9 + | +LL | macro_rules! m { () => {} } + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ +... +LL | include!(); + | ----------- in this macro invocation + = note: macro-expanded macros do not shadow + +error[E0659]: `m` is ambiguous + --> $DIR/restricted-shadowing-legacy.rs:148:9 + | +LL | m!(); //~ ERROR `m` is ambiguous + | ^ ambiguous name + | +note: `m` could refer to the name defined here + --> $DIR/restricted-shadowing-legacy.rs:88:9 + | +LL | macro_rules! m { () => { Right } } + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +... +LL | include!(); + | ----------- in this macro invocation +note: `m` could also refer to the name defined here + --> $DIR/restricted-shadowing-legacy.rs:144:9 + | +LL | macro_rules! m { () => {} } + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ +... +LL | include!(); + | ----------- in this macro invocation + = note: macro-expanded macros do not shadow + +error[E0659]: `m` is ambiguous + --> $DIR/restricted-shadowing-legacy.rs:164:9 + | +LL | m!(); //~ ERROR `m` is ambiguous + | ^ ambiguous name + | +note: `m` could refer to the name defined here + --> $DIR/restricted-shadowing-legacy.rs:88:9 + | +LL | macro_rules! m { () => { Right } } + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +... +LL | include!(); + | ----------- in this macro invocation +note: `m` could also refer to the name defined here + --> $DIR/restricted-shadowing-legacy.rs:85:9 + | +LL | macro_rules! m { () => { Wrong } } + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +... +LL | include!(); + | ----------- in this macro invocation + = note: macro-expanded macros do not shadow + +error[E0659]: `m` is ambiguous + --> $DIR/restricted-shadowing-legacy.rs:180:13 + | +LL | m!(); //~ ERROR `m` is ambiguous + | ^ ambiguous name + | +note: `m` could refer to the name defined here + --> $DIR/restricted-shadowing-legacy.rs:88:9 + | +LL | macro_rules! m { () => { Right } } + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +... +LL | include!(); + | ----------- in this macro invocation +note: `m` could also refer to the name defined here + --> $DIR/restricted-shadowing-legacy.rs:85:9 + | +LL | macro_rules! m { () => { Wrong } } + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +... +LL | include!(); + | ----------- in this macro invocation + = note: macro-expanded macros do not shadow + +error[E0659]: `m` is ambiguous + --> $DIR/restricted-shadowing-legacy.rs:218:42 + | +LL | macro_rules! gen_invoc { () => { m!() } } //~ ERROR `m` is ambiguous + | ^ ambiguous name + | +note: `m` could refer to the name defined here + --> $DIR/restricted-shadowing-legacy.rs:88:9 + | +LL | macro_rules! m { () => { Right } } + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +... +LL | include!(); + | ----------- in this macro invocation +note: `m` could also refer to the name defined here + --> $DIR/restricted-shadowing-legacy.rs:85:9 + | +LL | macro_rules! m { () => { Wrong } } + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +... +LL | include!(); + | ----------- in this macro invocation + = note: macro-expanded macros do not shadow + +error[E0659]: `m` is ambiguous + --> $DIR/restricted-shadowing-legacy.rs:232:9 + | +LL | m!(); //~ ERROR `m` is ambiguous + | ^ ambiguous name + | +note: `m` could refer to the name defined here + --> $DIR/restricted-shadowing-legacy.rs:88:9 + | +LL | macro_rules! m { () => { Right } } + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +... +LL | include!(); + | ----------- in this macro invocation +note: `m` could also refer to the name defined here + --> $DIR/restricted-shadowing-legacy.rs:227:13 + | +LL | macro_rules! m { () => {} } + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ +... +LL | include!(); + | ----------- in this macro invocation + = note: macro-expanded macros do not shadow + +error[E0659]: `m` is ambiguous + --> $DIR/restricted-shadowing-legacy.rs:262:42 + | +LL | macro_rules! gen_invoc { () => { m!() } } //~ ERROR `m` is ambiguous + | ^ ambiguous name + | +note: `m` could refer to the name defined here + --> $DIR/restricted-shadowing-legacy.rs:88:9 + | +LL | macro_rules! m { () => { Right } } + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +... +LL | include!(); + | ----------- in this macro invocation +note: `m` could also refer to the name defined here + --> $DIR/restricted-shadowing-legacy.rs:257:13 + | +LL | macro_rules! m { () => {} } + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ +... +LL | include!(); + | ----------- in this macro invocation + = note: macro-expanded macros do not shadow + +error: aborting due to 8 previous errors + +For more information about this error, try `rustc --explain E0659`. diff --git a/src/test/ui/macros/restricted-shadowing-modern.rs b/src/test/ui/macros/restricted-shadowing-modern.rs new file mode 100644 index 00000000000..448f623c220 --- /dev/null +++ b/src/test/ui/macros/restricted-shadowing-modern.rs @@ -0,0 +1,243 @@ +// Legend: +// `N` - number of combination, from 0 to 4*4*4=64 +// `Outer < Invoc` means that expansion that produced macro definition `Outer` +// is a strict ancestor of expansion that produced macro definition `Inner`. +// `>`, `=` and `Unordered` mean "strict descendant", "same" and +// "not in ordering relation" for parent expansions. +// `+` - possible configuration +// `-` - configuration impossible due to properties of partial ordering +// `-?` - configuration impossible due to block/scope syntax +// `+?` - configuration possible only with legacy scoping + +// N | Outer ~ Invoc | Invoc ~ Inner | Outer ~ Inner | Possible | +// 1 | < | < | < | + | +// 2 | < | < | = | - | +// 3 | < | < | > | - | +// 4 | < | < | Unordered | - | +// 5 | < | = | < | + | +// 6 | < | = | = | - | +// 7 | < | = | > | - | +// 8 | < | = | Unordered | - | +// 9 | < | > | < | + | +// 10 | < | > | = | + | +// 11 | < | > | > | -? | +// 12 | < | > | Unordered | -? | +// 13 | < | Unordered | < | + | +// 14 | < | Unordered | = | - | +// 15 | < | Unordered | > | - | +// 16 | < | Unordered | Unordered | -? | +// 17 | = | < | < | + | +// 18 | = | < | = | - | +// 19 | = | < | > | - | +// 20 | = | < | Unordered | - | +// 21 | = | = | < | - | +// 22 | = | = | = | + | +// 23 | = | = | > | - | +// 24 | = | = | Unordered | - | +// 25 | = | > | < | - | +// 26 | = | > | = | - | +// 27 | = | > | > | -? | +// 28 | = | > | Unordered | - | +// 29 | = | Unordered | < | - | +// 30 | = | Unordered | = | - | +// 31 | = | Unordered | > | - | +// 32 | = | Unordered | Unordered | -? | +// 33 | > | < | < | -? | +// 34 | > | < | = | -? | +// 35 | > | < | > | -? | +// 36 | > | < | Unordered | + | +// 37 | > | = | < | - | +// 38 | > | = | = | - | +// 39 | > | = | > | + | +// 40 | > | = | Unordered | - | +// 41 | > | > | < | - | +// 42 | > | > | = | - | +// 43 | > | > | > | -? | +// 44 | > | > | Unordered | - | +// 45 | > | Unordered | < | - | +// 46 | > | Unordered | = | - | +// 47 | > | Unordered | > | -? | +// 48 | > | Unordered | Unordered | -? | +// 49 | Unordered | < | < | -? | +// 50 | Unordered | < | = | - | +// 51 | Unordered | < | > | - | +// 52 | Unordered | < | Unordered | + | +// 53 | Unordered | = | < | - | +// 54 | Unordered | = | = | - | +// 55 | Unordered | = | > | - | +// 56 | Unordered | = | Unordered | + | +// 57 | Unordered | > | < | - | +// 58 | Unordered | > | = | - | +// 59 | Unordered | > | > | + | +// 60 | Unordered | > | Unordered | + | +// 61 | Unordered | Unordered | < | -? | +// 62 | Unordered | Unordered | = | -? | +// 63 | Unordered | Unordered | > | -? | +// 64 | Unordered | Unordered | Unordered | + | + +#![feature(decl_macro, rustc_attrs)] + +struct Right; +// struct Wrong; // not defined + +#[rustc_transparent_macro] +macro include() { + #[rustc_transparent_macro] + macro gen_outer() { + macro m() { Wrong } + } + #[rustc_transparent_macro] + macro gen_inner() { + macro m() { Right } + } + #[rustc_transparent_macro] + macro gen_invoc() { + m!() + } + + // ----------------------------------------------------------- + + fn check1() { + macro m() {} + { + #[rustc_transparent_macro] + macro gen_gen_inner_invoc() { + gen_inner!(); + m!(); //~ ERROR `m` is ambiguous + } + gen_gen_inner_invoc!(); + } + } + + fn check5() { + macro m() { Wrong } + { + #[rustc_transparent_macro] + macro gen_inner_invoc() { + macro m() { Right } + m!(); // OK + } + gen_inner_invoc!(); + } + } + + fn check9() { + macro m() { Wrong } + { + #[rustc_transparent_macro] + macro gen_inner_gen_invoc() { + macro m() { Right } + gen_invoc!(); // OK + } + gen_inner_gen_invoc!(); + } + } + + fn check10() { + macro m() { Wrong } + { + macro m() { Right } + gen_invoc!(); // OK + } + } + + fn check13() { + macro m() {} + { + gen_inner!(); + #[rustc_transparent_macro] + macro gen_invoc() { m!() } //~ ERROR `m` is ambiguous + gen_invoc!(); + } + } + + fn check17() { + macro m() {} + { + gen_inner!(); + m!(); //~ ERROR `m` is ambiguous + } + } + + fn check22() { + macro m() { Wrong } + { + macro m() { Right } + m!(); // OK + } + } + + fn check36() { + gen_outer!(); + { + gen_inner!(); + m!(); //~ ERROR `m` is ambiguous + } + } + + fn check39() { + gen_outer!(); + { + macro m() { Right } + m!(); // OK + } + } + + fn check52() { + gen_outer!(); + { + #[rustc_transparent_macro] + macro gen_gen_inner_invoc() { + gen_inner!(); + m!(); //~ ERROR `m` is ambiguous + } + gen_gen_inner_invoc!(); + } + } + + fn check56() { + gen_outer!(); + { + #[rustc_transparent_macro] + macro gen_inner_invoc() { + macro m() { Right } + m!(); // OK + } + gen_inner_invoc!(); + } + } + + fn check59() { + gen_outer!(); + { + macro m() { Right } + gen_invoc!(); // OK + } + } + + fn check60() { + gen_outer!(); + { + #[rustc_transparent_macro] + macro gen_inner_gen_invoc() { + macro m() { Right } + gen_invoc!(); // OK + } + gen_inner_gen_invoc!(); + } + } + + fn check64() { + gen_outer!(); + { + gen_inner!(); + #[rustc_transparent_macro] + macro gen_invoc() { m!() } //~ ERROR `m` is ambiguous + gen_invoc!(); + } + } +} + +include!(); + +fn main() {} diff --git a/src/test/ui/macros/restricted-shadowing-modern.stderr b/src/test/ui/macros/restricted-shadowing-modern.stderr new file mode 100644 index 00000000000..0462438be78 --- /dev/null +++ b/src/test/ui/macros/restricted-shadowing-modern.stderr @@ -0,0 +1,147 @@ +error[E0659]: `m` is ambiguous + --> $DIR/restricted-shadowing-modern.rs:106:17 + | +LL | m!(); //~ ERROR `m` is ambiguous + | ^ ambiguous name + | +note: `m` could refer to the name defined here + --> $DIR/restricted-shadowing-modern.rs:91:9 + | +LL | macro m() { Right } + | ^^^^^^^^^^^^^^^^^^^ +... +LL | include!(); + | ----------- in this macro invocation +note: `m` could also refer to the name defined here + --> $DIR/restricted-shadowing-modern.rs:101:9 + | +LL | macro m() {} + | ^^^^^^^^^^^^ +... +LL | include!(); + | ----------- in this macro invocation + = note: macro-expanded macros do not shadow + +error[E0659]: `m` is ambiguous + --> $DIR/restricted-shadowing-modern.rs:149:33 + | +LL | macro gen_invoc() { m!() } //~ ERROR `m` is ambiguous + | ^ ambiguous name + | +note: `m` could refer to the name defined here + --> $DIR/restricted-shadowing-modern.rs:91:9 + | +LL | macro m() { Right } + | ^^^^^^^^^^^^^^^^^^^ +... +LL | include!(); + | ----------- in this macro invocation +note: `m` could also refer to the name defined here + --> $DIR/restricted-shadowing-modern.rs:145:9 + | +LL | macro m() {} + | ^^^^^^^^^^^^ +... +LL | include!(); + | ----------- in this macro invocation + = note: macro-expanded macros do not shadow + +error[E0659]: `m` is ambiguous + --> $DIR/restricted-shadowing-modern.rs:158:13 + | +LL | m!(); //~ ERROR `m` is ambiguous + | ^ ambiguous name + | +note: `m` could refer to the name defined here + --> $DIR/restricted-shadowing-modern.rs:91:9 + | +LL | macro m() { Right } + | ^^^^^^^^^^^^^^^^^^^ +... +LL | include!(); + | ----------- in this macro invocation +note: `m` could also refer to the name defined here + --> $DIR/restricted-shadowing-modern.rs:155:9 + | +LL | macro m() {} + | ^^^^^^^^^^^^ +... +LL | include!(); + | ----------- in this macro invocation + = note: macro-expanded macros do not shadow + +error[E0659]: `m` is ambiguous + --> $DIR/restricted-shadowing-modern.rs:174:13 + | +LL | m!(); //~ ERROR `m` is ambiguous + | ^ ambiguous name + | +note: `m` could refer to the name defined here + --> $DIR/restricted-shadowing-modern.rs:91:9 + | +LL | macro m() { Right } + | ^^^^^^^^^^^^^^^^^^^ +... +LL | include!(); + | ----------- in this macro invocation +note: `m` could also refer to the name defined here + --> $DIR/restricted-shadowing-modern.rs:87:9 + | +LL | macro m() { Wrong } + | ^^^^^^^^^^^^^^^^^^^ +... +LL | include!(); + | ----------- in this macro invocation + = note: macro-expanded macros do not shadow + +error[E0659]: `m` is ambiguous + --> $DIR/restricted-shadowing-modern.rs:192:17 + | +LL | m!(); //~ ERROR `m` is ambiguous + | ^ ambiguous name + | +note: `m` could refer to the name defined here + --> $DIR/restricted-shadowing-modern.rs:91:9 + | +LL | macro m() { Right } + | ^^^^^^^^^^^^^^^^^^^ +... +LL | include!(); + | ----------- in this macro invocation +note: `m` could also refer to the name defined here + --> $DIR/restricted-shadowing-modern.rs:87:9 + | +LL | macro m() { Wrong } + | ^^^^^^^^^^^^^^^^^^^ +... +LL | include!(); + | ----------- in this macro invocation + = note: macro-expanded macros do not shadow + +error[E0659]: `m` is ambiguous + --> $DIR/restricted-shadowing-modern.rs:235:33 + | +LL | macro gen_invoc() { m!() } //~ ERROR `m` is ambiguous + | ^ ambiguous name + | +note: `m` could refer to the name defined here + --> $DIR/restricted-shadowing-modern.rs:91:9 + | +LL | macro m() { Right } + | ^^^^^^^^^^^^^^^^^^^ +... +LL | include!(); + | ----------- in this macro invocation +note: `m` could also refer to the name defined here + --> $DIR/restricted-shadowing-modern.rs:87:9 + | +LL | macro m() { Wrong } + | ^^^^^^^^^^^^^^^^^^^ +... +LL | include!(); + | ----------- in this macro invocation + = note: macro-expanded macros do not shadow + +error: aborting due to 6 previous errors + +For more information about this error, try `rustc --explain E0659`. diff --git a/src/test/ui/out-of-order-shadowing.rs b/src/test/ui/out-of-order-shadowing.rs index 1fafaf85112..977b475b113 100644 --- a/src/test/ui/out-of-order-shadowing.rs +++ b/src/test/ui/out-of-order-shadowing.rs @@ -9,11 +9,10 @@ // except according to those terms. // aux-build:define_macro.rs -// error-pattern: `bar` is already in scope macro_rules! bar { () => {} } define_macro!(bar); -bar!(); +bar!(); //~ ERROR `bar` is ambiguous macro_rules! m { () => { #[macro_use] extern crate define_macro; } } m!(); diff --git a/src/test/ui/out-of-order-shadowing.stderr b/src/test/ui/out-of-order-shadowing.stderr index 78e32e23ff6..d96a802cb3f 100644 --- a/src/test/ui/out-of-order-shadowing.stderr +++ b/src/test/ui/out-of-order-shadowing.stderr @@ -1,11 +1,22 @@ -error: `bar` is already in scope +error[E0659]: `bar` is ambiguous --> $DIR/out-of-order-shadowing.rs:15:1 | +LL | bar!(); //~ ERROR `bar` is ambiguous + | ^^^ ambiguous name + | +note: `bar` could refer to the name defined here + --> $DIR/out-of-order-shadowing.rs:14:1 + | LL | define_macro!(bar); | ^^^^^^^^^^^^^^^^^^^ +note: `bar` could also refer to the name defined here + --> $DIR/out-of-order-shadowing.rs:13:1 | - = note: macro-expanded `macro_rules!`s may not shadow existing macros (see RFC 1560) +LL | macro_rules! bar { () => {} } + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + = note: macro-expanded macros do not shadow = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) error: aborting due to previous error +For more information about this error, try `rustc --explain E0659`. |
