about summary refs log tree commit diff
path: root/tests/ui/structs/default-field-values/failures.rs
blob: 4461302e841d0adbeaabc84d82eb21ac47648834 (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
 #![feature(default_field_values)]

#[derive(Debug)]
pub struct S;

#[derive(Debug, Default)]
pub struct Foo {
    pub bar: S = S,
    pub baz: i32 = 42 + 3,
}

#[derive(Debug, Default)]
pub struct Bar {
    pub bar: S, //~ ERROR the trait bound `S: Default` is not satisfied
    pub baz: i32 = 42 + 3,
}

#[derive(Default)]
pub struct Qux<const C: i32> {
    bar: S = Self::S,
    baz: i32 = foo(),
    bat: i32 = <Qux<{ C }> as T>::K,
    bay: i32 = C,
}

pub struct Rak(i32 = 42); //~ ERROR default fields are not supported in tuple structs

impl<const C: i32> Qux<C> {
    const S: S = S;
}

trait T {
    const K: i32;
}

impl<const C: i32> T for Qux<C> {
    const K: i32 = 2;
}

const fn foo() -> i32 {
    42
}

#[derive(Debug, Default)]
enum E {
    #[default]
    Variant {} //~ ERROR the `#[default]` attribute may only be used on unit enum variants
}

fn main () {
    let _ = Foo { .. }; // ok
    let _ = Foo::default(); // ok
    let _ = Bar { .. }; //~ ERROR missing field
    let _ = Bar { baz: 0, .. }; //~ ERROR missing field
    let _ = Bar::default(); // silenced
    let _ = Bar { bar: S, .. }; // ok
    let _ = Qux::<4> { .. };
    let _ = Rak(..); //~ ERROR E0308
    //~^ you might have meant to use `..` to skip providing
    let _ = Rak(0, ..); //~ ERROR E0061
    //~^ you might have meant to use `..` to skip providing
    let _ = Rak(.., 0); //~ ERROR E0061
    //~^ you might have meant to use `..` to skip providing
    let _ = Rak { .. }; // ok
}