1 #![feature(rustc_attrs)]
2 
3 macro_rules! stmt_mac {
4     () => {
5         fn b() {}
6     }
7 }
8 
main()9 fn main() {
10     #[rustc_dummy]
11     fn a() {}
12 
13     // Bug: built-in attrs like `rustc_dummy` are not gated on blocks, but other attrs are.
14     #[rustfmt::skip] //~ ERROR attributes on expressions are experimental
15     {
16 
17     }
18 
19     #[rustc_dummy]
20     5;
21 
22     #[rustc_dummy]
23     stmt_mac!();
24 }
25 
26 // Check that cfg works right
27 
28 #[cfg(unset)]
c()29 fn c() {
30     #[rustc_dummy]
31     5;
32 }
33 
34 #[cfg(not(unset))]
j()35 fn j() {
36     #[rustc_dummy]
37     5;
38 }
39 
40 #[cfg_attr(not(unset), cfg(unset))]
d()41 fn d() {
42     #[rustc_dummy]
43     8;
44 }
45 
46 #[cfg_attr(not(unset), cfg(not(unset)))]
i()47 fn i() {
48     #[rustc_dummy]
49     8;
50 }
51 
52 // check that macro expansion and cfg works right
53 
54 macro_rules! item_mac {
55     ($e:ident) => {
56         fn $e() {
57             #[rustc_dummy]
58             42;
59 
60             #[cfg(unset)]
61             fn f() {
62                 #[rustc_dummy]
63                 5;
64             }
65 
66             #[cfg(not(unset))]
67             fn k() {
68                 #[rustc_dummy]
69                 5;
70             }
71 
72             #[cfg_attr(not(unset), cfg(unset))]
73             fn g() {
74                 #[rustc_dummy]
75                 8;
76             }
77 
78             #[cfg_attr(not(unset), cfg(not(unset)))]
79             fn h() {
80                 #[rustc_dummy]
81                 8;
82             }
83 
84         }
85     }
86 }
87 
88 item_mac!(e);
89 
90 // check that the gate visitor works right:
91 
92 extern "C" {
93     #[cfg(unset)]
x(a: [u8; #[rustc_dummy] 5])94     fn x(a: [u8; #[rustc_dummy] 5]);
y(a: [u8; #[rustc_dummy] 5])95     fn y(a: [u8; #[rustc_dummy] 5]); //~ ERROR attributes on expressions are experimental
96 }
97 
98 struct Foo;
99 impl Foo {
100     #[cfg(unset)]
101     const X: u8 = #[rustc_dummy] 5;
102     const Y: u8 = #[rustc_dummy] 5; //~ ERROR attributes on expressions are experimental
103 }
104 
105 trait Bar {
106     #[cfg(unset)]
107     const X: [u8; #[rustc_dummy] 5];
108     const Y: [u8; #[rustc_dummy] 5]; //~ ERROR attributes on expressions are experimental
109 }
110 
111 struct Joyce {
112     #[cfg(unset)]
113     field: [u8; #[rustc_dummy] 5],
114     field2: [u8; #[rustc_dummy] 5] //~ ERROR attributes on expressions are experimental
115 }
116 
117 struct Walky(
118     #[cfg(unset)] [u8; #[rustc_dummy] 5],
119     [u8; #[rustc_dummy] 5] //~ ERROR attributes on expressions are experimental
120 );
121 
122 enum Mike {
123     Happy(
124         #[cfg(unset)] [u8; #[rustc_dummy] 5],
125         [u8; #[rustc_dummy] 5] //~ ERROR attributes on expressions are experimental
126     ),
127     Angry {
128         #[cfg(unset)]
129         field: [u8; #[rustc_dummy] 5],
130         field2: [u8; #[rustc_dummy] 5] //~ ERROR attributes on expressions are experimental
131     }
132 }
133 
pat()134 fn pat() {
135     match 5 {
136         #[cfg(unset)]
137         5 => #[rustc_dummy] (),
138         6 => #[rustc_dummy] (), //~ ERROR attributes on expressions are experimental
139         _ => (),
140     }
141 }
142