Ensure assignments don't allow skipping projection checks
This commit is contained in:
parent
301ce8b2aa
commit
3c290a5326
3 changed files with 42 additions and 1 deletions
|
|
@ -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
|
||||
|
|
|
|||
14
src/test/ui/consts/projection_qualif.rs
Normal file
14
src/test/ui/consts/projection_qualif.rs
Normal 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() {}
|
||||
18
src/test/ui/consts/projection_qualif.stderr
Normal file
18
src/test/ui/consts/projection_qualif.stderr
Normal 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`.
|
||||
Loading…
Add table
Add a link
Reference in a new issue