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,
)
);
}
|