Skip to content

Commit a836d9b

Browse files
committed
Auto merge of #84016 - Aaron1011:new-preexp-tests, r=petrochenkov
Add some proc-macro attribute token handling tests Split out from #82608 r? `@petrochenkov`
2 parents 72c63de + 6c59111 commit a836d9b

10 files changed

+1199
-66
lines changed

src/test/ui/proc-macro/auxiliary/nonterminal-recollect-attr.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use proc_macro::{TokenStream, quote};
1010
#[proc_macro_attribute]
1111
pub fn first_attr(_: TokenStream, input: TokenStream) -> TokenStream {
1212
let recollected: TokenStream = input.into_iter().collect();
13+
println!("First recollected: {:#?}", recollected);
1314
quote! {
1415
#[second_attr]
1516
$recollected
@@ -18,6 +19,7 @@ pub fn first_attr(_: TokenStream, input: TokenStream) -> TokenStream {
1819

1920
#[proc_macro_attribute]
2021
pub fn second_attr(_: TokenStream, input: TokenStream) -> TokenStream {
21-
let _recollected: TokenStream = input.into_iter().collect();
22+
let recollected: TokenStream = input.into_iter().collect();
23+
println!("Second recollected: {:#?}", recollected);
2224
TokenStream::new()
2325
}
+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
// compile-flags: -Z span-debug
2+
// aux-build:test-macros.rs
3+
// check-pass
4+
5+
#![feature(cfg_eval)]
6+
#![feature(custom_inner_attributes)]
7+
#![feature(stmt_expr_attributes)]
8+
#![feature(rustc_attrs)]
9+
10+
#![no_std] // Don't load unnecessary hygiene information from std
11+
extern crate std;
12+
13+
#[macro_use]
14+
extern crate test_macros;
15+
16+
struct Foo<T>(T);
17+
18+
impl Foo<[u8; {
19+
#![cfg_attr(not(FALSE), rustc_dummy(cursed_inner))]
20+
#![allow(unused)]
21+
struct Inner {
22+
field: [u8; {
23+
#![cfg_attr(not(FALSE), rustc_dummy(another_cursed_inner))]
24+
1
25+
}]
26+
}
27+
28+
0
29+
}]> {
30+
#![cfg_eval]
31+
#![print_attr]
32+
#![cfg_attr(not(FALSE), rustc_dummy(evaluated_attr))]
33+
34+
fn bar() {
35+
#[cfg(FALSE)] let a = 1;
36+
}
37+
}
38+
39+
fn main() {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,252 @@
1+
PRINT-ATTR INPUT (DISPLAY): impl Foo <
2+
[u8 ;
3+
{
4+
# ! [rustc_dummy(cursed_inner)] # ! [allow(unused)] struct Inner
5+
{ field : [u8 ; { # ! [rustc_dummy(another_cursed_inner)] 1 }], } 0
6+
}] > { # ! [rustc_dummy(evaluated_attr)] fn bar() { } }
7+
PRINT-ATTR INPUT (DEBUG): TokenStream [
8+
Ident {
9+
ident: "impl",
10+
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
11+
},
12+
Ident {
13+
ident: "Foo",
14+
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
15+
},
16+
Punct {
17+
ch: '<',
18+
spacing: Alone,
19+
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
20+
},
21+
Group {
22+
delimiter: Bracket,
23+
stream: TokenStream [
24+
Ident {
25+
ident: "u8",
26+
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
27+
},
28+
Punct {
29+
ch: ';',
30+
spacing: Alone,
31+
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
32+
},
33+
Group {
34+
delimiter: Brace,
35+
stream: TokenStream [
36+
Punct {
37+
ch: '#',
38+
spacing: Joint,
39+
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
40+
},
41+
Punct {
42+
ch: '!',
43+
spacing: Alone,
44+
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
45+
},
46+
Group {
47+
delimiter: Bracket,
48+
stream: TokenStream [
49+
Ident {
50+
ident: "rustc_dummy",
51+
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
52+
},
53+
Group {
54+
delimiter: Parenthesis,
55+
stream: TokenStream [
56+
Ident {
57+
ident: "cursed_inner",
58+
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
59+
},
60+
],
61+
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
62+
},
63+
],
64+
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
65+
},
66+
Punct {
67+
ch: '#',
68+
spacing: Joint,
69+
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
70+
},
71+
Punct {
72+
ch: '!',
73+
spacing: Alone,
74+
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
75+
},
76+
Group {
77+
delimiter: Bracket,
78+
stream: TokenStream [
79+
Ident {
80+
ident: "allow",
81+
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
82+
},
83+
Group {
84+
delimiter: Parenthesis,
85+
stream: TokenStream [
86+
Ident {
87+
ident: "unused",
88+
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
89+
},
90+
],
91+
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
92+
},
93+
],
94+
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
95+
},
96+
Ident {
97+
ident: "struct",
98+
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
99+
},
100+
Ident {
101+
ident: "Inner",
102+
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
103+
},
104+
Group {
105+
delimiter: Brace,
106+
stream: TokenStream [
107+
Ident {
108+
ident: "field",
109+
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
110+
},
111+
Punct {
112+
ch: ':',
113+
spacing: Alone,
114+
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
115+
},
116+
Group {
117+
delimiter: Bracket,
118+
stream: TokenStream [
119+
Ident {
120+
ident: "u8",
121+
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
122+
},
123+
Punct {
124+
ch: ';',
125+
spacing: Alone,
126+
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
127+
},
128+
Group {
129+
delimiter: Brace,
130+
stream: TokenStream [
131+
Punct {
132+
ch: '#',
133+
spacing: Joint,
134+
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
135+
},
136+
Punct {
137+
ch: '!',
138+
spacing: Alone,
139+
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
140+
},
141+
Group {
142+
delimiter: Bracket,
143+
stream: TokenStream [
144+
Ident {
145+
ident: "rustc_dummy",
146+
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
147+
},
148+
Group {
149+
delimiter: Parenthesis,
150+
stream: TokenStream [
151+
Ident {
152+
ident: "another_cursed_inner",
153+
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
154+
},
155+
],
156+
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
157+
},
158+
],
159+
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
160+
},
161+
Literal {
162+
kind: Integer,
163+
symbol: "1",
164+
suffix: None,
165+
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
166+
},
167+
],
168+
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
169+
},
170+
],
171+
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
172+
},
173+
Punct {
174+
ch: ',',
175+
spacing: Alone,
176+
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
177+
},
178+
],
179+
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
180+
},
181+
Literal {
182+
kind: Integer,
183+
symbol: "0",
184+
suffix: None,
185+
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
186+
},
187+
],
188+
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
189+
},
190+
],
191+
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
192+
},
193+
Punct {
194+
ch: '>',
195+
spacing: Alone,
196+
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
197+
},
198+
Group {
199+
delimiter: Brace,
200+
stream: TokenStream [
201+
Punct {
202+
ch: '#',
203+
spacing: Joint,
204+
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
205+
},
206+
Punct {
207+
ch: '!',
208+
spacing: Alone,
209+
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
210+
},
211+
Group {
212+
delimiter: Bracket,
213+
stream: TokenStream [
214+
Ident {
215+
ident: "rustc_dummy",
216+
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
217+
},
218+
Group {
219+
delimiter: Parenthesis,
220+
stream: TokenStream [
221+
Ident {
222+
ident: "evaluated_attr",
223+
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
224+
},
225+
],
226+
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
227+
},
228+
],
229+
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
230+
},
231+
Ident {
232+
ident: "fn",
233+
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
234+
},
235+
Ident {
236+
ident: "bar",
237+
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
238+
},
239+
Group {
240+
delimiter: Parenthesis,
241+
stream: TokenStream [],
242+
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
243+
},
244+
Group {
245+
delimiter: Brace,
246+
stream: TokenStream [],
247+
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
248+
},
249+
],
250+
span: $DIR/cfg-eval-inner.rs:18:1: 37:2 (#0),
251+
},
252+
]

src/test/ui/proc-macro/cfg-eval.rs

+7-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
#![feature(cfg_eval)]
66
#![feature(proc_macro_hygiene)]
77
#![feature(stmt_expr_attributes)]
8-
8+
#![feature(rustc_attrs)]
99
#![no_std] // Don't load unnecessary hygiene information from std
1010
extern crate std;
1111

@@ -28,5 +28,10 @@ struct S1 {
2828
struct S2 {}
2929

3030
fn main() {
31-
let _ = #[cfg_eval] #[print_attr](#[cfg(FALSE)] 0, #[cfg(all(/*true*/))] 1);
31+
// Subtle - we need a trailing comma after the '1' - otherwise, `#[cfg_eval]` will
32+
// turn this into `(#[cfg(all())] 1)`, which is a parenthesized expression, not a tuple
33+
// expression. `#[cfg]` is not supported inside parenthesized expressions, so this will
34+
// produce an error when attribute collection runs.
35+
let _ = #[cfg_eval] #[print_attr] #[cfg_attr(not(FALSE), rustc_dummy)]
36+
(#[cfg(FALSE)] 0, #[cfg(all(/*true*/))] 1,);
3237
}

0 commit comments

Comments
 (0)