// 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, Result)>; 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 { Some(T), _None, } #[derive(Debug, PartialEq)] enum LocalResult { _Ok(T), Err(E), } #[derive(Debug, PartialEq)] struct LocalAssertUnwindSafe(T); type LocalType = LocalAssertUnwindSafe<(LocalOption, LocalResult)>; 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, ) ); }