]> git.lizzy.rs Git - rust.git/commitdiff
Ensure assignments don't allow skipping projection checks
authorOliver Scherer <github35764891676564198441@oli-obk.de>
Wed, 21 Nov 2018 09:42:40 +0000 (10:42 +0100)
committerOliver Scherer <github35764891676564198441@oli-obk.de>
Wed, 21 Nov 2018 09:42:40 +0000 (10:42 +0100)
src/librustc_mir/transform/qualify_consts.rs
src/test/ui/consts/projection_qualif.rs [new file with mode: 0644]
src/test/ui/consts/projection_qualif.stderr [new file with mode: 0644]

index 51e590fe292914c78966ba5cff27acf6a46d0ad1..571fe99897058b7558177dbefda512245fc201b6 100644 (file)
@@ -252,7 +252,16 @@ fn assign(&mut self, dest: &Place<'tcx>, location: Location) {
                     // projections are transparent for assignments
                     // we qualify the entire destination at once, even if just a field would have
                     // stricter qualification
-                    Place::Projection(proj) => dest = &proj.base,
+                    Place::Projection(proj) => {
+                        // Catch more errors in the destination. `visit_place` also checks various
+                        // projection rules like union field access and raw pointer deref
+                        self.visit_place(
+                            dest,
+                            PlaceContext::MutatingUse(MutatingUseContext::Store),
+                            location
+                        );
+                        dest = &proj.base;
+                    },
                     Place::Promoted(..) => bug!("promoteds don't exist yet during promotion"),
                     Place::Static(..) => {
                         // Catch more errors in the destination. `visit_place` also checks that we
diff --git a/src/test/ui/consts/projection_qualif.rs b/src/test/ui/consts/projection_qualif.rs
new file mode 100644 (file)
index 0000000..4806fec
--- /dev/null
@@ -0,0 +1,14 @@
+#![feature(const_let)]
+
+use std::cell::Cell;
+
+const FOO: &u32 = {
+    let mut a = 42;
+    {
+        let b: *mut u32 = &mut a; //~ ERROR may only refer to immutable values
+        unsafe { *b = 5; } //~ ERROR dereferencing raw pointers in constants
+    }
+    &{a}
+};
+
+fn main() {}
\ No newline at end of file
diff --git a/src/test/ui/consts/projection_qualif.stderr b/src/test/ui/consts/projection_qualif.stderr
new file mode 100644 (file)
index 0000000..d5252f1
--- /dev/null
@@ -0,0 +1,18 @@
+error[E0017]: references in constants may only refer to immutable values
+  --> $DIR/projection_qualif.rs:8:27
+   |
+LL |         let b: *mut u32 = &mut a; //~ ERROR may only refer to immutable values
+   |                           ^^^^^^ constants require immutable values
+
+error[E0658]: dereferencing raw pointers in constants is unstable (see issue #51911)
+  --> $DIR/projection_qualif.rs:9:18
+   |
+LL |         unsafe { *b = 5; } //~ ERROR dereferencing raw pointers in constants
+   |                  ^^^^^^
+   |
+   = help: add #![feature(const_raw_ptr_deref)] to the crate attributes to enable
+
+error: aborting due to 2 previous errors
+
+Some errors occurred: E0017, E0658.
+For more information about an error, try `rustc --explain E0017`.