-
Notifications
You must be signed in to change notification settings - Fork 12.7k
/
const-construct-call.rs
116 lines (97 loc) · 2.8 KB
/
const-construct-call.rs
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
// Test that constructors are considered to be const fns with the required feature.
// run-pass
// revisions: min_const_fn const_fn
#![cfg_attr(const_fn, feature(const_fn))]
#![feature(const_constructor)]
// Ctor(..) is transformed to Ctor { 0: ... } in HAIR 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,
)
);
}