summaryrefslogtreecommitdiffstats
path: root/src/test/ui/consts/promotion.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/ui/consts/promotion.rs')
-rw-r--r--src/test/ui/consts/promotion.rs45
1 files changed, 45 insertions, 0 deletions
diff --git a/src/test/ui/consts/promotion.rs b/src/test/ui/consts/promotion.rs
new file mode 100644
index 000000000..e379e3aea
--- /dev/null
+++ b/src/test/ui/consts/promotion.rs
@@ -0,0 +1,45 @@
+// revisions: noopt opt opt_with_overflow_checks
+//[noopt]compile-flags: -C opt-level=0
+//[opt]compile-flags: -O
+//[opt_with_overflow_checks]compile-flags: -C overflow-checks=on -O
+
+// build-pass
+
+const fn assert_static<T>(_: &'static T) {}
+
+#[allow(unconditional_panic)]
+const fn fail() -> i32 {
+ 1/0
+}
+const C: i32 = {
+ // Promoted that fails to evaluate in dead code -- this must work
+ // (for backwards compatibility reasons).
+ if false {
+ assert_static(&fail());
+ }
+ 42
+};
+
+fn main() {
+ assert_static(&["a", "b", "c"]);
+ assert_static(&["d", "e", "f"]);
+ assert_eq!(C, 42);
+
+ // make sure that these do not cause trouble despite overflowing
+ assert_static(&(0-1));
+ assert_static(&-i32::MIN);
+
+ // div-by-non-0 is okay
+ assert_static(&(1/1));
+ assert_static(&(1%1));
+
+ // in-bounds array access is okay
+ assert_static(&([1,2,3][0] + 1));
+ assert_static(&[[1,2][1]]);
+
+ // Top-level projections are not part of the promoted, so no error here.
+ if false {
+ #[allow(unconditional_panic)]
+ assert_static(&[1,2,3][4]);
+ }
+}