Skip to content

Commit

Permalink
Rollup merge of #90168 - tmiasko:const-qualif-storage, r=matthewjasper
Browse files Browse the repository at this point in the history
Reset qualifs when a storage of a local ends

Reset qualifs when a storage of a local ends to ensure that the local qualifs
are affected by the state from previous loop iterations only if the local is
kept alive.

The change should be forward compatible with a stricter handling of indirect
assignments, since storage dead invalidates all existing pointers to the local.
  • Loading branch information
matthiaskrgr authored Oct 23, 2021
2 parents 2b874f0 + e4aeeca commit 74a0c49
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 1 deletion.
11 changes: 10 additions & 1 deletion compiler/rustc_const_eval/src/transform/check_consts/resolver.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

use rustc_index::bit_set::BitSet;
use rustc_middle::mir::visit::Visitor;
use rustc_middle::mir::{self, BasicBlock, Local, Location};
use rustc_middle::mir::{self, BasicBlock, Local, Location, Statement, StatementKind};

use std::marker::PhantomData;

Expand Down Expand Up @@ -120,6 +120,15 @@ where
self.super_assign(place, rvalue, location);
}

fn visit_statement(&mut self, statement: &Statement<'tcx>, location: Location) {
match statement.kind {
StatementKind::StorageDead(local) => {
self.qualifs_per_local.remove(local);
}
_ => self.super_statement(statement, location),
}
}

fn visit_terminator(&mut self, terminator: &mir::Terminator<'tcx>, location: Location) {
// The effect of assignment to the return place in `TerminatorKind::Call` is not applied
// here; that occurs in `apply_call_return_effect`.
Expand Down
20 changes: 20 additions & 0 deletions src/test/ui/consts/promoted-storage.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
// Check that storage statements reset local qualification.
// check-pass
use std::cell::Cell;

const C: Option<Cell<u32>> = {
let mut c = None;
let mut i = 0;
while i == 0 {
let mut x = None;
c = x;
x = Some(Cell::new(0));
let _ = x;
i += 1;
}
c
};

fn main() {
let _: &'static _ = &C;
}

0 comments on commit 74a0c49

Please sign in to comment.