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