summaryrefslogtreecommitdiffstats
path: root/src/test/ui/consts/const_constructor/const-construct-call.rs
blob: cb735d7b305dc2b5ce769677cfb90a7e781cfecd (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
// Test that constructors are considered to be const fns

// run-pass

// Ctor(..) is transformed to Ctor { 0: ... } in THIR lowering, so directly
// calling constructors doesn't require them to be const.

type ExternalType = std::panic::AssertUnwindSafe<(Option<i32>, Result<i32, bool>)>;

const fn call_external_constructors_in_local_vars() -> ExternalType {
    let f = Some;
    let g = Err;
    let h = std::panic::AssertUnwindSafe;
    let x = f(5);
    let y = g(false);
    let z = h((x, y));
    z
}

const CALL_EXTERNAL_CONSTRUCTORS_IN_LOCAL_VARS: ExternalType = {
    let f = Some;
    let g = Err;
    let h = std::panic::AssertUnwindSafe;
    let x = f(5);
    let y = g(false);
    let z = h((x, y));
    z
};

const fn call_external_constructors_in_temps() -> ExternalType {
    let x = { Some }(5);
    let y = (*&Err)(false);
    let z = [std::panic::AssertUnwindSafe][0]((x, y));
    z
}

const CALL_EXTERNAL_CONSTRUCTORS_IN_TEMPS: ExternalType = {
    let x = { Some }(5);
    let y = (*&Err)(false);
    let z = [std::panic::AssertUnwindSafe][0]((x, y));
    z
};

#[derive(Debug, PartialEq)]
enum LocalOption<T> {
    Some(T),
    _None,
}

#[derive(Debug, PartialEq)]
enum LocalResult<T, E> {
    _Ok(T),
    Err(E),
}

#[derive(Debug, PartialEq)]
struct LocalAssertUnwindSafe<T>(T);

type LocalType = LocalAssertUnwindSafe<(LocalOption<i32>, LocalResult<i32, bool>)>;

const fn call_local_constructors_in_local_vars() -> LocalType {
    let f = LocalOption::Some;
    let g = LocalResult::Err;
    let h = LocalAssertUnwindSafe;
    let x = f(5);
    let y = g(false);
    let z = h((x, y));
    z
}

const CALL_LOCAL_CONSTRUCTORS_IN_LOCAL_VARS: LocalType = {
    let f = LocalOption::Some;
    let g = LocalResult::Err;
    let h = LocalAssertUnwindSafe;
    let x = f(5);
    let y = g(false);
    let z = h((x, y));
    z
};

const fn call_local_constructors_in_temps() -> LocalType {
    let x = { LocalOption::Some }(5);
    let y = (*&LocalResult::Err)(false);
    let z = [LocalAssertUnwindSafe][0]((x, y));
    z
}

const CALL_LOCAL_CONSTRUCTORS_IN_TEMPS: LocalType = {
    let x = { LocalOption::Some }(5);
    let y = (*&LocalResult::Err)(false);
    let z = [LocalAssertUnwindSafe][0]((x, y));
    z
};

fn main() {
    assert_eq!(
        (
            call_external_constructors_in_local_vars().0,
            call_external_constructors_in_temps().0,
            call_local_constructors_in_local_vars(),
            call_local_constructors_in_temps(),
        ),
        (
            CALL_EXTERNAL_CONSTRUCTORS_IN_LOCAL_VARS.0,
            CALL_EXTERNAL_CONSTRUCTORS_IN_TEMPS.0,
            CALL_LOCAL_CONSTRUCTORS_IN_LOCAL_VARS,
            CALL_LOCAL_CONSTRUCTORS_IN_TEMPS,
        )
    );
}