Skip to content

Commit e00993a

Browse files
committed
Add test cases for possible restricted shadowing configurations
Whitelist `#[rustc_transparent_macro]` so it's not interpreted as a potential attribute macro
1 parent d26ae20 commit e00993a

5 files changed

+880
-0
lines changed

src/libsyntax/feature_gate.rs

+4
Original file line numberDiff line numberDiff line change
@@ -966,6 +966,10 @@ pub const BUILTIN_ATTRIBUTES: &'static [(&'static str, AttributeType, AttributeG
966966
"the `#[rustc_test_marker]` attribute \
967967
is used internally to track tests",
968968
cfg_fn!(rustc_attrs))),
969+
("rustc_transparent_macro", Whitelisted, Gated(Stability::Unstable,
970+
"rustc_attrs",
971+
"used internally for testing macro hygiene",
972+
cfg_fn!(rustc_attrs))),
969973

970974
// RFC #2094
971975
("nll", Whitelisted, Gated(Stability::Unstable,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,281 @@
1+
// Legend:
2+
// `+` - possible configuration
3+
// `-` - configuration impossible due to properties of partial ordering
4+
// `-?` - configuration impossible due to block/scope syntax
5+
// `+?` - configuration possible only with legacy scoping
6+
7+
// N | Outer ~ Invoc | Invoc ~ Inner | Outer ~ Inner | Possible |
8+
// 1 | < | < | < | + |
9+
// 2 | < | < | = | - |
10+
// 3 | < | < | > | - |
11+
// 4 | < | < | Unordered | - |
12+
// 5 | < | = | < | + |
13+
// 6 | < | = | = | - |
14+
// 7 | < | = | > | - |
15+
// 8 | < | = | Unordered | - |
16+
// 9 | < | > | < | + |
17+
// 10 | < | > | = | + |
18+
// 11 | < | > | > | -? |
19+
// 12 | < | > | Unordered | -? |
20+
// 13 | < | Unordered | < | + |
21+
// 14 | < | Unordered | = | - |
22+
// 15 | < | Unordered | > | - |
23+
// 16 | < | Unordered | Unordered | -? |
24+
// 17 | = | < | < | + |
25+
// 18 | = | < | = | - |
26+
// 19 | = | < | > | - |
27+
// 20 | = | < | Unordered | - |
28+
// 21 | = | = | < | - |
29+
// 22 | = | = | = | + |
30+
// 23 | = | = | > | - |
31+
// 24 | = | = | Unordered | - |
32+
// 25 | = | > | < | - |
33+
// 26 | = | > | = | - |
34+
// 27 | = | > | > | -? |
35+
// 28 | = | > | Unordered | - |
36+
// 29 | = | Unordered | < | - |
37+
// 30 | = | Unordered | = | - |
38+
// 31 | = | Unordered | > | - |
39+
// 32 | = | Unordered | Unordered | -? |
40+
// 33 | > | < | < | +? |
41+
// 34 | > | < | = | +? |
42+
// 35 | > | < | > | +? |
43+
// 36 | > | < | Unordered | + |
44+
// 37 | > | = | < | - |
45+
// 38 | > | = | = | - |
46+
// 39 | > | = | > | + |
47+
// 40 | > | = | Unordered | - |
48+
// 41 | > | > | < | - |
49+
// 42 | > | > | = | - |
50+
// 43 | > | > | > | -? |
51+
// 44 | > | > | Unordered | - |
52+
// 45 | > | Unordered | < | - |
53+
// 46 | > | Unordered | = | - |
54+
// 47 | > | Unordered | > | -? |
55+
// 48 | > | Unordered | Unordered | -? |
56+
// 49 | Unordered | < | < | -? |
57+
// 50 | Unordered | < | = | - |
58+
// 51 | Unordered | < | > | - |
59+
// 52 | Unordered | < | Unordered | + |
60+
// 53 | Unordered | = | < | - |
61+
// 54 | Unordered | = | = | - |
62+
// 55 | Unordered | = | > | - |
63+
// 56 | Unordered | = | Unordered | + |
64+
// 57 | Unordered | > | < | - |
65+
// 58 | Unordered | > | = | - |
66+
// 59 | Unordered | > | > | + |
67+
// 60 | Unordered | > | Unordered | + |
68+
// 61 | Unordered | Unordered | < | +? |
69+
// 62 | Unordered | Unordered | = | +? |
70+
// 63 | Unordered | Unordered | > | +? |
71+
// 64 | Unordered | Unordered | Unordered | + |
72+
73+
#![feature(decl_macro, rustc_attrs)]
74+
75+
macro_rules! include { () => {
76+
macro_rules! gen_outer { () => {
77+
macro_rules! m { () => {} }
78+
}}
79+
macro_rules! gen_inner { () => {
80+
macro_rules! m { () => {} }
81+
}}
82+
macro_rules! gen_invoc { () => {
83+
m!()
84+
}}
85+
86+
// -----------------------------------------------------------
87+
88+
fn check1() {
89+
macro_rules! m { () => {} }
90+
91+
macro_rules! gen_gen_inner_invoc { () => {
92+
gen_inner!();
93+
m!(); //~ ERROR `m` is ambiguous
94+
}}
95+
gen_gen_inner_invoc!();
96+
}
97+
98+
fn check5() {
99+
macro_rules! m { () => {} }
100+
101+
macro_rules! gen_inner_invoc { () => {
102+
macro_rules! m { () => {} }
103+
m!(); // OK
104+
}}
105+
gen_inner_invoc!();
106+
}
107+
108+
fn check9() {
109+
macro_rules! m { () => {} }
110+
111+
macro_rules! gen_inner_gen_invoc { () => {
112+
macro_rules! m { () => {} }
113+
gen_invoc!(); // OK
114+
}}
115+
gen_inner_gen_invoc!();
116+
}
117+
118+
fn check10() {
119+
macro_rules! m { () => {} }
120+
121+
macro_rules! m { () => {} }
122+
123+
gen_invoc!(); // OK
124+
}
125+
126+
fn check13() {
127+
macro_rules! m { () => {} }
128+
129+
gen_inner!();
130+
131+
macro_rules! gen_invoc { () => { m!() } } //~ ERROR `m` is ambiguous
132+
gen_invoc!();
133+
}
134+
135+
fn check17() {
136+
macro_rules! m { () => {} }
137+
138+
gen_inner!();
139+
140+
m!(); //~ ERROR `m` is ambiguous
141+
}
142+
143+
fn check22() {
144+
macro_rules! m { () => {} }
145+
146+
macro_rules! m { () => {} }
147+
148+
m!(); // OK
149+
}
150+
151+
fn check36() {
152+
gen_outer!();
153+
154+
gen_inner!();
155+
156+
m!(); //~ ERROR `m` is ambiguous
157+
}
158+
159+
fn check39() {
160+
gen_outer!();
161+
162+
macro_rules! m { () => {} }
163+
164+
m!(); // OK
165+
}
166+
167+
fn check52() {
168+
gen_outer!();
169+
170+
macro_rules! gen_gen_inner_invoc { () => {
171+
gen_inner!();
172+
m!(); //~ ERROR `m` is ambiguous
173+
}}
174+
gen_gen_inner_invoc!();
175+
}
176+
177+
fn check56() {
178+
gen_outer!();
179+
180+
macro_rules! gen_inner_invoc { () => {
181+
macro_rules! m { () => {} }
182+
m!(); // OK
183+
}}
184+
gen_inner_invoc!();
185+
}
186+
187+
fn check59() {
188+
gen_outer!();
189+
190+
macro_rules! m { () => {} }
191+
192+
gen_invoc!(); // OK
193+
}
194+
195+
fn check60() {
196+
gen_outer!();
197+
198+
macro_rules! gen_inner_gen_invoc { () => {
199+
macro_rules! m { () => {} }
200+
gen_invoc!(); // OK
201+
}}
202+
gen_inner_gen_invoc!();
203+
}
204+
205+
fn check64() {
206+
gen_outer!();
207+
208+
gen_inner!();
209+
210+
macro_rules! gen_invoc { () => { m!() } } //~ ERROR `m` is ambiguous
211+
gen_invoc!();
212+
}
213+
214+
// -----------------------------------------------------------
215+
// These configurations are only possible with legacy macro scoping
216+
217+
fn check33() {
218+
macro_rules! gen_outer_gen_inner { () => {
219+
macro_rules! m { () => {} }
220+
gen_inner!();
221+
}}
222+
gen_outer_gen_inner!();
223+
224+
m!(); //~ ERROR `m` is ambiguous
225+
}
226+
227+
fn check34() {
228+
macro_rules! gen_outer_inner { () => {
229+
macro_rules! m { () => {} }
230+
macro_rules! m { () => {} }
231+
}}
232+
gen_outer_inner!();
233+
234+
m!(); // OK
235+
}
236+
237+
fn check35() {
238+
macro_rules! gen_gen_outer_inner { () => {
239+
gen_outer!();
240+
macro_rules! m { () => {} }
241+
}}
242+
gen_gen_outer_inner!();
243+
244+
m!(); // OK
245+
}
246+
247+
fn check61() {
248+
macro_rules! gen_outer_gen_inner { () => {
249+
macro_rules! m { () => {} }
250+
gen_inner!();
251+
}}
252+
gen_outer_gen_inner!();
253+
254+
macro_rules! gen_invoc { () => { m!() } } //~ ERROR `m` is ambiguous
255+
gen_invoc!();
256+
}
257+
258+
fn check62() {
259+
macro_rules! gen_outer_inner { () => {
260+
macro_rules! m { () => {} }
261+
macro_rules! m { () => {} }
262+
}}
263+
gen_outer_inner!();
264+
265+
gen_invoc!(); // OK
266+
}
267+
268+
fn check63() {
269+
macro_rules! gen_gen_outer_inner { () => {
270+
gen_outer!();
271+
macro_rules! m { () => {} }
272+
}}
273+
gen_gen_outer_inner!();
274+
275+
gen_invoc!(); // OK
276+
}
277+
}}
278+
279+
include!();
280+
281+
fn main() {}

0 commit comments

Comments
 (0)