// Verifies all possible restrictions for statics values. #![allow(warnings)] #![feature(box_syntax)] 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{field1: SafeEnum::Variant3(WithDtor), //~^ ERROR destructors cannot be evaluated at compile-time field2: SafeEnum::Variant1}}; struct UnsafeStruct; impl Drop for UnsafeStruct { fn drop(&mut self) {} } static STATIC10: UnsafeStruct = UnsafeStruct; struct MyOwned; static STATIC11: Box = box MyOwned; //~^ ERROR allocations are not allowed in statics 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 fn }; static STATIC15: &'static [Box] = &[ box MyOwned, //~ ERROR allocations are not allowed in statics box MyOwned, //~ ERROR allocations are not allowed in statics ]; static STATIC16: (&'static Box, &'static Box) = ( &box MyOwned, //~ ERROR allocations are not allowed in statics &box MyOwned, //~ ERROR allocations are not allowed in statics ); static mut STATIC17: SafeEnum = SafeEnum::Variant1; static STATIC19: Box = box 3; //~^ ERROR allocations are not allowed in statics pub fn main() { let y = { static x: Box = box 3; x }; //~^ ERROR allocations are not allowed in statics //~| ERROR cannot move out of static item }