// Verifies all possible restrictions for statics values.

#![allow(warnings)]

use std::marker;

struct WithDtor;

impl Drop for WithDtor {
    fn drop(&mut self) {}
}

// This enum will be used to test the following rules:
// 1. Variants are safe for static
// 2. Expr calls are allowed as long as they arguments are safe
// 3. Expr calls with unsafe arguments for statics are rejected
enum SafeEnum {
    Variant1,
    Variant2(isize),
    Variant3(WithDtor),
    Variant4(String),
}

// These should be ok
static STATIC1: SafeEnum = SafeEnum::Variant1;
static STATIC2: SafeEnum = SafeEnum::Variant2(0);
static STATIC3: SafeEnum = SafeEnum::Variant3(WithDtor);

enum UnsafeEnum {
    Variant5,
    Variant6(isize),
}

impl Drop for UnsafeEnum {
    fn drop(&mut self) {}
}

static STATIC4: UnsafeEnum = UnsafeEnum::Variant5;
static STATIC5: UnsafeEnum = UnsafeEnum::Variant6(0);

struct SafeStruct {
    field1: SafeEnum,
    field2: SafeEnum,
}

// Struct fields are safe, hence this static should be safe
static STATIC6: SafeStruct =
    SafeStruct { field1: SafeEnum::Variant1, field2: SafeEnum::Variant2(0) };

static STATIC7: SafeStruct =
    SafeStruct { field1: SafeEnum::Variant1, field2: SafeEnum::Variant3(WithDtor) };

// Test variadic constructor for structs. The base struct should be examined
// as well as every field present in the constructor.
// This example shouldn't fail because all the fields are safe.
static STATIC8: SafeStruct = SafeStruct {
    field1: SafeEnum::Variant1,
    ..SafeStruct { field1: SafeEnum::Variant1, field2: SafeEnum::Variant1 }
};

// This example should fail because field1 in the base struct is not safe
static STATIC9: SafeStruct = SafeStruct {
    field1: SafeEnum::Variant1,
    ..SafeStruct {
        //~^ ERROR destructor of
        field1: SafeEnum::Variant3(WithDtor),
        field2: SafeEnum::Variant1,
    }
};

struct UnsafeStruct;

impl Drop for UnsafeStruct {
    fn drop(&mut self) {}
}

static STATIC10: UnsafeStruct = UnsafeStruct;

struct MyOwned;

static STATIC11: Vec<MyOwned> = vec![MyOwned];
//~^ ERROR allocations are not allowed in statics
//~^^ ERROR cannot call non-const

static mut STATIC12: UnsafeStruct = UnsafeStruct;

static mut STATIC13: SafeStruct =
    SafeStruct { field1: SafeEnum::Variant1, field2: SafeEnum::Variant3(WithDtor) };

static mut STATIC14: SafeStruct = SafeStruct {
    field1: SafeEnum::Variant1,
    field2: SafeEnum::Variant4("str".to_string()), //~ ERROR cannot call non-const method
};

static STATIC15: &'static [Vec<MyOwned>] = &[
    vec![MyOwned], //~ ERROR allocations are not allowed in statics
    //~^ ERROR cannot call non-const
    vec![MyOwned], //~ ERROR allocations are not allowed in statics
                   //~^ ERROR cannot call non-const
];

static STATIC16: (&'static Vec<MyOwned>, &'static Vec<MyOwned>) = (
    &vec![MyOwned], //~ ERROR allocations are not allowed in statics
    //~^ ERROR cannot call non-const
    &vec![MyOwned], //~ ERROR allocations are not allowed in statics
                    //~^ ERROR cannot call non-const
);

static mut STATIC17: SafeEnum = SafeEnum::Variant1;

static STATIC19: Vec<isize> = vec![3];
//~^ ERROR allocations are not allowed in statics
//~^^ ERROR cannot call non-const

pub fn main() {
    let y = {
        static x: Vec<isize> = vec![3]; //~ ERROR allocations are not allowed in statics
        //~^ ERROR cannot call non-const
        x
        //~^ ERROR cannot move out of static
    };
}
