summaryrefslogtreecommitdiffstats
path: root/src/test/ui/check-static-values-constraints.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/ui/check-static-values-constraints.rs')
-rw-r--r--src/test/ui/check-static-values-constraints.rs113
1 files changed, 113 insertions, 0 deletions
diff --git a/src/test/ui/check-static-values-constraints.rs b/src/test/ui/check-static-values-constraints.rs
new file mode 100644
index 000000000..eb4ecd8ba
--- /dev/null
+++ b/src/test/ui/check-static-values-constraints.rs
@@ -0,0 +1,113 @@
+// 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<MyOwned> = 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<MyOwned>] = &[
+ box MyOwned, //~ ERROR allocations are not allowed in statics
+ box MyOwned, //~ ERROR allocations are not allowed in statics
+];
+
+static STATIC16: (&'static Box<MyOwned>, &'static Box<MyOwned>) = (
+ &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<isize> =
+ box 3;
+//~^ ERROR allocations are not allowed in statics
+
+pub fn main() {
+ let y = { static x: Box<isize> = box 3; x };
+ //~^ ERROR allocations are not allowed in statics
+ //~| ERROR cannot move out of static item
+}