about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAndrew Xu <andrewxuyuan@gmail.com>2018-09-12 12:27:28 +0800
committerAndrew Xu <andrewxuyuan@gmail.com>2018-09-12 12:27:28 +0800
commit3d6c2606a4cbb0f23f31f7dcf3c5e365e7fa402a (patch)
tree743d6de0dc7a97d6f94bef8981ee4e511bc24205
parent8adc69a5a873dd7e840b7d002ae48a4c638ef7ee (diff)
downloadrust-3d6c2606a4cbb0f23f31f7dcf3c5e365e7fa402a.tar.gz
rust-3d6c2606a4cbb0f23f31f7dcf3c5e365e7fa402a.zip
Add a test that tries to modify static memory at compile-time
-rw-r--r--src/test/ui/consts/const-eval/mod-static-with-const-fn.rs37
-rw-r--r--src/test/ui/consts/const-eval/mod-static-with-const-fn.stderr18
2 files changed, 55 insertions, 0 deletions
diff --git a/src/test/ui/consts/const-eval/mod-static-with-const-fn.rs b/src/test/ui/consts/const-eval/mod-static-with-const-fn.rs
new file mode 100644
index 00000000000..d6ffca09e96
--- /dev/null
+++ b/src/test/ui/consts/const-eval/mod-static-with-const-fn.rs
@@ -0,0 +1,37 @@
+// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// New test for #53818: modifying static memory at compile-time is not allowed.
+// The test should never succeed.
+
+#![feature(const_raw_ptr_deref)]
+#![feature(const_let)]
+
+use std::cell::UnsafeCell;
+
+struct Foo(UnsafeCell<u32>);
+
+unsafe impl Send for Foo {}
+unsafe impl Sync for Foo {}
+
+static FOO: Foo = Foo(UnsafeCell::new(42));
+
+static BAR: () = unsafe {
+    *FOO.0.get() = 5;
+    //~^ ERROR calls in statics are limited to constant functions, tuple structs and tuple variants
+
+    // This error is caused by a separate bug that the feature gate error is reported
+    // even though the feature gate "const_let" is active.
+    //~| statements in statics are unstable (see issue #48821)
+};
+
+fn main() {
+    println!("{}", unsafe { *FOO.0.get() });
+}
diff --git a/src/test/ui/consts/const-eval/mod-static-with-const-fn.stderr b/src/test/ui/consts/const-eval/mod-static-with-const-fn.stderr
new file mode 100644
index 00000000000..8eaed1dcab1
--- /dev/null
+++ b/src/test/ui/consts/const-eval/mod-static-with-const-fn.stderr
@@ -0,0 +1,18 @@
+error[E0015]: calls in statics are limited to constant functions, tuple structs and tuple variants
+  --> $DIR/mod-static-with-const-fn.rs:27:6
+   |
+LL |     *FOO.0.get() = 5;
+   |      ^^^^^^^^^^^
+
+error[E0658]: statements in statics are unstable (see issue #48821)
+  --> $DIR/mod-static-with-const-fn.rs:27:5
+   |
+LL |     *FOO.0.get() = 5;
+   |     ^^^^^^^^^^^^^^^^
+   |
+   = help: add #![feature(const_let)] to the crate attributes to enable
+
+error: aborting due to 2 previous errors
+
+Some errors occurred: E0015, E0658.
+For more information about an error, try `rustc --explain E0015`.