1 // Legend:
2 // `N` - number of combination, from 0 to 4*4*4=64
3 // `Outer < Invoc` means that expansion that produced macro definition `Outer`
4 // is a strict ancestor of expansion that produced macro definition `Inner`.
5 // `>`, `=` and `Unordered` mean "strict descendant", "same" and
6 // "not in ordering relation" for parent expansions.
7 // `+` - possible configuration
8 // `-` - configuration impossible due to properties of partial ordering
9 // `-?` - configuration impossible due to block/scope syntax
10 // `+?` - configuration possible only with legacy scoping
11 
12 //  N | Outer ~ Invoc | Invoc ~ Inner | Outer ~ Inner | Possible |
13 //  1 |       <       |       <       |       <       |    +     |
14 //  2 |       <       |       <       |       =       |    -     |
15 //  3 |       <       |       <       |       >       |    -     |
16 //  4 |       <       |       <       |   Unordered   |    -     |
17 //  5 |       <       |       =       |       <       |    +     |
18 //  6 |       <       |       =       |       =       |    -     |
19 //  7 |       <       |       =       |       >       |    -     |
20 //  8 |       <       |       =       |   Unordered   |    -     |
21 //  9 |       <       |       >       |       <       |    +     |
22 // 10 |       <       |       >       |       =       |    +     |
23 // 11 |       <       |       >       |       >       |    -?    |
24 // 12 |       <       |       >       |   Unordered   |    -?    |
25 // 13 |       <       |   Unordered   |       <       |    +     |
26 // 14 |       <       |   Unordered   |       =       |    -     |
27 // 15 |       <       |   Unordered   |       >       |    -     |
28 // 16 |       <       |   Unordered   |   Unordered   |    -?    |
29 // 17 |       =       |       <       |       <       |    +     |
30 // 18 |       =       |       <       |       =       |    -     |
31 // 19 |       =       |       <       |       >       |    -     |
32 // 20 |       =       |       <       |   Unordered   |    -     |
33 // 21 |       =       |       =       |       <       |    -     |
34 // 22 |       =       |       =       |       =       |    +     |
35 // 23 |       =       |       =       |       >       |    -     |
36 // 24 |       =       |       =       |   Unordered   |    -     |
37 // 25 |       =       |       >       |       <       |    -     |
38 // 26 |       =       |       >       |       =       |    -     |
39 // 27 |       =       |       >       |       >       |    -?    |
40 // 28 |       =       |       >       |   Unordered   |    -     |
41 // 29 |       =       |   Unordered   |       <       |    -     |
42 // 30 |       =       |   Unordered   |       =       |    -     |
43 // 31 |       =       |   Unordered   |       >       |    -     |
44 // 32 |       =       |   Unordered   |   Unordered   |    -?    |
45 // 33 |       >       |       <       |       <       |    -?    |
46 // 34 |       >       |       <       |       =       |    -?    |
47 // 35 |       >       |       <       |       >       |    -?    |
48 // 36 |       >       |       <       |   Unordered   |    +     |
49 // 37 |       >       |       =       |       <       |    -     |
50 // 38 |       >       |       =       |       =       |    -     |
51 // 39 |       >       |       =       |       >       |    +     |
52 // 40 |       >       |       =       |   Unordered   |    -     |
53 // 41 |       >       |       >       |       <       |    -     |
54 // 42 |       >       |       >       |       =       |    -     |
55 // 43 |       >       |       >       |       >       |    -?    |
56 // 44 |       >       |       >       |   Unordered   |    -     |
57 // 45 |       >       |   Unordered   |       <       |    -     |
58 // 46 |       >       |   Unordered   |       =       |    -     |
59 // 47 |       >       |   Unordered   |       >       |    -?    |
60 // 48 |       >       |   Unordered   |   Unordered   |    -?    |
61 // 49 |   Unordered   |       <       |       <       |    -?    |
62 // 50 |   Unordered   |       <       |       =       |    -     |
63 // 51 |   Unordered   |       <       |       >       |    -     |
64 // 52 |   Unordered   |       <       |   Unordered   |    +     |
65 // 53 |   Unordered   |       =       |       <       |    -     |
66 // 54 |   Unordered   |       =       |       =       |    -     |
67 // 55 |   Unordered   |       =       |       >       |    -     |
68 // 56 |   Unordered   |       =       |   Unordered   |    +     |
69 // 57 |   Unordered   |       >       |       <       |    -     |
70 // 58 |   Unordered   |       >       |       =       |    -     |
71 // 59 |   Unordered   |       >       |       >       |    +     |
72 // 60 |   Unordered   |       >       |   Unordered   |    +     |
73 // 61 |   Unordered   |   Unordered   |       <       |    -?    |
74 // 62 |   Unordered   |   Unordered   |       =       |    -?    |
75 // 63 |   Unordered   |   Unordered   |       >       |    -?    |
76 // 64 |   Unordered   |   Unordered   |   Unordered   |    +     |
77 
78 #![feature(decl_macro, rustc_attrs)]
79 
80 struct Right;
81 // struct Wrong; // not defined
82 
83 #[rustc_macro_transparency = "transparent"]
84 macro include() {
85     #[rustc_macro_transparency = "transparent"]
86     macro gen_outer() {
87         macro m() { Wrong }
88     }
89     #[rustc_macro_transparency = "transparent"]
90     macro gen_inner() {
91         macro m() { Right }
92     }
93     #[rustc_macro_transparency = "transparent"]
94     macro gen_invoc() {
95         m!()
96     }
97 
check1()98     fn check1() {
99         macro m() {}
100         {
101             #[rustc_macro_transparency = "transparent"]
102             macro gen_gen_inner_invoc() {
103                 gen_inner!();
104                 m!(); //~ ERROR `m` is ambiguous
105             }
106             gen_gen_inner_invoc!();
107         }
108     }
109 
check5()110     fn check5() {
111         macro m() { Wrong }
112         {
113             #[rustc_macro_transparency = "transparent"]
114             macro gen_inner_invoc() {
115                 macro m() { Right }
116                 m!(); // OK
117             }
118             gen_inner_invoc!();
119         }
120     }
121 
check9()122     fn check9() {
123         macro m() { Wrong }
124         {
125             #[rustc_macro_transparency = "transparent"]
126             macro gen_inner_gen_invoc() {
127                 macro m() { Right }
128                 gen_invoc!(); // OK
129             }
130             gen_inner_gen_invoc!();
131         }
132     }
133 
check10()134     fn check10() {
135         macro m() { Wrong }
136         {
137             macro m() { Right }
138             gen_invoc!(); // OK
139         }
140     }
141 
check13()142     fn check13() {
143         macro m() {}
144         {
145             gen_inner!();
146             #[rustc_macro_transparency = "transparent"]
147             macro gen_invoc() { m!() } //~ ERROR `m` is ambiguous
148             gen_invoc!();
149         }
150     }
151 
check17()152     fn check17() {
153         macro m() {}
154         {
155             gen_inner!();
156             m!(); //~ ERROR `m` is ambiguous
157         }
158     }
159 
check22()160     fn check22() {
161         macro m() { Wrong }
162         {
163             macro m() { Right }
164             m!(); // OK
165         }
166     }
167 
check36()168     fn check36() {
169         gen_outer!();
170         {
171             gen_inner!();
172             m!(); //~ ERROR `m` is ambiguous
173         }
174     }
175 
check39()176     fn check39() {
177         gen_outer!();
178         {
179             macro m() { Right }
180             m!(); // OK
181         }
182     }
183 
check52()184     fn check52() {
185         gen_outer!();
186         {
187             #[rustc_macro_transparency = "transparent"]
188             macro gen_gen_inner_invoc() {
189                 gen_inner!();
190                 m!(); //~ ERROR `m` is ambiguous
191             }
192             gen_gen_inner_invoc!();
193         }
194     }
195 
check56()196     fn check56() {
197         gen_outer!();
198         {
199             #[rustc_macro_transparency = "transparent"]
200             macro gen_inner_invoc() {
201                 macro m() { Right }
202                 m!(); // OK
203             }
204             gen_inner_invoc!();
205         }
206     }
207 
check59()208     fn check59() {
209         gen_outer!();
210         {
211             macro m() { Right }
212             gen_invoc!(); // OK
213         }
214     }
215 
check60()216     fn check60() {
217         gen_outer!();
218         {
219             #[rustc_macro_transparency = "transparent"]
220             macro gen_inner_gen_invoc() {
221                 macro m() { Right }
222                 gen_invoc!(); // OK
223             }
224             gen_inner_gen_invoc!();
225         }
226     }
227 
check64()228     fn check64() {
229         gen_outer!();
230         {
231             gen_inner!();
232             #[rustc_macro_transparency = "transparent"]
233             macro gen_invoc() { m!() } //~ ERROR `m` is ambiguous
234             gen_invoc!();
235         }
236     }
237 }
238 
239 include!();
240 
main()241 fn main() {}
242