// 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
--- /dev/null
+#![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
--- /dev/null
+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`.