Ensure assignments don't allow skipping projection checks

This commit is contained in:
Oliver Scherer 2018-11-21 10:42:40 +01:00
parent 301ce8b2aa
commit 3c290a5326
3 changed files with 42 additions and 1 deletions

View file

@ -252,7 +252,16 @@ impl<'a, 'tcx> Qualifier<'a, 'tcx, 'tcx> {
// 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

View file

@ -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() {}

View file

@ -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`.