// ignore-tidy-linelength
// Test various things that we do not want to promote.
#![allow(unconditional_panic)]

use std::cell::Cell;
use std::convert::identity;
use std::mem::ManuallyDrop;

// We do not promote mutable references.
static mut TEST1: &mut [i32] = identity(&mut [1, 2, 3]); //~ ERROR temporary value dropped while borrowed

static mut TEST2: &'static mut [i32] = {
    let x = &mut [1,2,3]; //~ ERROR temporary value dropped while borrowed
    x
};

// We do not promote fn calls in `fn`, including `const fn`.
pub const fn promote_cal(b: bool) -> i32 {
    const fn foo() { [()][42] }

    if b {
        let _x: &'static () = &foo(); //~ ERROR temporary value dropped while borrowed
    }
    13
}

// We do not promote union field accesses in `fn`.
union U { x: i32, y: i32 }
pub const fn promote_union() {
    let _x: &'static i32 = &unsafe { U { x: 0 }.x }; //~ ERROR temporary value dropped while borrowed
}

// We do not promote union field accesses in `const`, either.
const TEST_UNION: () = {
    let _x: &'static i32 = &unsafe { U { x: 0 }.x }; //~ ERROR temporary value dropped while borrowed
};

// In a `const`, we do not promote things with interior mutability. Not even if we "project it away".
const TEST_INTERIOR_MUT: () = {
    // The "0." case is already ruled out by not permitting any interior mutability in `const`.
    let _val: &'static _ = &(Cell::new(1), 2).1; //~ ERROR temporary value dropped while borrowed
};

// This gets accepted by the "outer scope" rule, not promotion.
const TEST_DROP_OUTER_SCOPE: &String = &String::new();
// To demonstrate that, we can rewrite it as follows. If this was promotion it would still work.
const TEST_DROP_NOT_PROMOTE: &String = {
    let x = &String::new(); //~ ERROR destructor of `String` cannot be evaluated at compile-time
    // The "dropped while borrowed" error seems to be suppressed, but the key point is that this
    // fails to compile.
    x
};


// We do not promote function calls in `const` initializers in dead code.
const fn mk_panic() -> u32 { panic!() }
const fn mk_false() -> bool { false }
const Y: () = {
    if mk_false() {
        let _x: &'static u32 = &mk_panic(); //~ ERROR temporary value dropped while borrowed
    }
};

fn main() {
    // We must not promote things with interior mutability. Not even if we "project it away".
    let _val: &'static _ = &(Cell::new(1), 2).0; //~ ERROR temporary value dropped while borrowed
    let _val: &'static _ = &(Cell::new(1), 2).1; //~ ERROR temporary value dropped while borrowed

    // No promotion of fallible operations.
    let _val: &'static _ = &(1/0); //~ ERROR temporary value dropped while borrowed
    let _val: &'static _ = &(1/(1-1)); //~ ERROR temporary value dropped while borrowed
    let _val: &'static _ = &((1+1)/(1-1)); //~ ERROR temporary value dropped while borrowed
    let _val: &'static _ = &(i32::MIN/-1); //~ ERROR temporary value dropped while borrowed
    let _val: &'static _ = &(i32::MIN/(0-1)); //~ ERROR temporary value dropped while borrowed
    let _val: &'static _ = &(-128i8/-1); //~ ERROR temporary value dropped while borrowed
    let _val: &'static _ = &(1%0); //~ ERROR temporary value dropped while borrowed
    let _val: &'static _ = &(1%(1-1)); //~ ERROR temporary value dropped while borrowed
    let _val: &'static _ = &([1,2,3][4]+1); //~ ERROR temporary value dropped while borrowed

    // No promotion of temporaries that need to be dropped.
    const TEST_DROP: String = String::new();
    let _val: &'static _ = &TEST_DROP;
    //~^ ERROR temporary value dropped while borrowed
    let _val: &'static _ = &&TEST_DROP;
    //~^ ERROR temporary value dropped while borrowed
    //~| ERROR temporary value dropped while borrowed
    let _val: &'static _ = &(&TEST_DROP,);
    //~^ ERROR temporary value dropped while borrowed
    //~| ERROR temporary value dropped while borrowed
    let _val: &'static _ = &[&TEST_DROP; 1];
    //~^ ERROR temporary value dropped while borrowed
    //~| ERROR temporary value dropped while borrowed

    // Make sure there is no value-based reasoning for unions.
    union UnionWithCell {
        f1: i32,
        f2: ManuallyDrop<Cell<i32>>,
    }
    let x: &'static _ = &UnionWithCell { f1: 0 };
    //~^ ERROR temporary value dropped while borrowed
}
