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