summaryrefslogtreecommitdiffstats
path: root/tests/ui/macros/macros-nonfatal-errors.rs
blob: ab14c35893d0a74d759e8ad1085eae2cea73c045 (plain)
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>>;
};