about summary refs log tree commit diff
path: root/tests/ui/macros/restricted-shadowing-legacy.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/macros/restricted-shadowing-legacy.rs')
-rw-r--r--tests/ui/macros/restricted-shadowing-legacy.rs289
1 files changed, 289 insertions, 0 deletions
diff --git a/tests/ui/macros/restricted-shadowing-legacy.rs b/tests/ui/macros/restricted-shadowing-legacy.rs
new file mode 100644
index 00000000000..f5cac2dfbfb
--- /dev/null
+++ b/tests/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() {}