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