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