1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
|
// normalize-stderr-test: "existed:.*\(" -> "existed: $$FILE_NOT_FOUND_MSG ("
// test that errors in a (selection) of macros don't kill compilation
// immediately, so that we get more errors listed at a time.
#![feature(trace_macros, concat_idents)]
#![feature(stmt_expr_attributes)]
use std::arch::asm;
#[derive(Default)]
struct DefaultInnerAttrStruct {
#[default] //~ ERROR the `#[default]` attribute may only be used on unit enum variants
foo: (),
}
#[derive(Default)]
struct DefaultInnerAttrTupleStruct(#[default] ());
//~^ ERROR the `#[default]` attribute may only be used on unit enum variants
#[derive(Default)]
#[default] //~ ERROR the `#[default]` attribute may only be used on unit enum variants
struct DefaultOuterAttrStruct {}
#[derive(Default)]
#[default] //~ ERROR the `#[default]` attribute may only be used on unit enum variants
enum DefaultOuterAttrEnum {
#[default]
Foo,
}
#[rustfmt::skip] // needs some work to handle this case
#[repr(u8)]
#[derive(Default)]
enum AttrOnInnerExpression {
Foo = #[default] 0, //~ ERROR the `#[default]` attribute may only be used on unit enum variants
Bar([u8; #[default] 1]), //~ ERROR the `#[default]` attribute may only be used on unit enum variants
#[default]
Baz,
}
#[derive(Default)] //~ ERROR no default declared
enum NoDeclaredDefault {
Foo,
Bar,
}
#[derive(Default)] //~ ERROR multiple declared defaults
enum MultipleDefaults {
#[default]
Foo,
#[default]
Bar,
#[default]
Baz,
}
#[derive(Default)]
enum ExtraDeriveTokens {
#[default = 1] //~ ERROR `#[default]` attribute does not accept a value
Foo,
}
#[derive(Default)]
enum TwoDefaultAttrs {
#[default]
#[default]
Foo, //~ERROR multiple `#[default]` attributes
Bar,
}
#[derive(Default)]
enum ManyDefaultAttrs {
#[default]
#[default]
#[default]
#[default]
Foo, //~ERROR multiple `#[default]` attributes
Bar,
}
#[derive(Default)]
enum DefaultHasFields {
#[default]
Foo {}, //~ ERROR the `#[default]` attribute may only be used on unit enum variants
Bar,
}
#[derive(Default)]
enum NonExhaustiveDefault {
#[default]
#[non_exhaustive]
Foo, //~ ERROR default variant must be exhaustive
Bar,
}
fn main() {
asm!(invalid); //~ ERROR
llvm_asm!(invalid); //~ ERROR
concat_idents!("not", "idents"); //~ ERROR
option_env!(invalid); //~ ERROR
env!(invalid); //~ ERROR
env!(foo, abr, baz); //~ ERROR
env!("RUST_HOPEFULLY_THIS_DOESNT_EXIST"); //~ ERROR
format!(invalid); //~ ERROR
include!(invalid); //~ ERROR
include_str!(invalid); //~ ERROR
include_str!("i'd be quite surprised if a file with this name existed"); //~ ERROR
include_bytes!(invalid); //~ ERROR
include_bytes!("i'd be quite surprised if a file with this name existed"); //~ ERROR
trace_macros!(invalid); //~ ERROR
}
/// Check that `#[derive(Default)]` does use a `T : Default` bound when the
/// `#[default]` variant is `#[non_exhaustive]` (should this end up allowed).
const _: () = {
#[derive(Default)]
enum NonExhaustiveDefaultGeneric<T> {
#[default]
#[non_exhaustive]
Foo, //~ ERROR default variant must be exhaustive
Bar(T),
}
fn assert_impls_default<T: Default>() {}
enum NotDefault {}
// Note: the `derive(Default)` currently bails early enough for trait-checking
// not to happen. Should it bail late enough, or even pass, make sure to
// assert that the following line fails.
let _ = assert_impls_default::<NonExhaustiveDefaultGeneric<NotDefault>>;
};
|