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