Remove MIR borrowck hack for old match scopes
This commit is contained in:
parent
f506aea1fa
commit
0f507246e7
1 changed files with 8 additions and 31 deletions
|
|
@ -11,8 +11,7 @@ use super::MoveDataParamEnv;
|
|||
|
||||
use crate::util::elaborate_drops::DropFlagState;
|
||||
|
||||
use super::move_paths::{HasMoveData, MoveData, MovePathIndex, InitIndex};
|
||||
use super::move_paths::{LookupResult, InitKind};
|
||||
use super::move_paths::{HasMoveData, MoveData, MovePathIndex, InitIndex, InitKind};
|
||||
use super::{BitDenotation, BlockSets, InitialFlow};
|
||||
|
||||
use super::drop_flag_effects_for_function_entry;
|
||||
|
|
@ -470,35 +469,13 @@ impl<'a, 'gcx, 'tcx> BitDenotation<'tcx> for EverInitializedPlaces<'a, 'gcx, 'tc
|
|||
sets.gen_all(&init_loc_map[location]);
|
||||
|
||||
match stmt.kind {
|
||||
mir::StatementKind::StorageDead(local) |
|
||||
mir::StatementKind::StorageLive(local) => {
|
||||
// End inits for StorageDead and StorageLive, so that an immutable
|
||||
// variable can be reinitialized on the next iteration of the loop.
|
||||
//
|
||||
// FIXME(#46525): We *need* to do this for StorageLive as well as
|
||||
// StorageDead, because lifetimes of match bindings with guards are
|
||||
// weird - i.e., this code
|
||||
//
|
||||
// ```
|
||||
// fn main() {
|
||||
// match 0 {
|
||||
// a | a
|
||||
// if { println!("a={}", a); false } => {}
|
||||
// _ => {}
|
||||
// }
|
||||
// }
|
||||
// ```
|
||||
//
|
||||
// runs the guard twice, using the same binding for `a`, and only
|
||||
// storagedeads after everything ends, so if we don't regard the
|
||||
// storagelive as killing storage, we would have a multiple assignment
|
||||
// to immutable data error.
|
||||
if let LookupResult::Exact(mpi) =
|
||||
rev_lookup.find(&mir::Place::Base(mir::PlaceBase::Local(local))) {
|
||||
debug!("stmt {:?} at loc {:?} clears the ever initialized status of {:?}",
|
||||
stmt, location, &init_path_map[mpi]);
|
||||
sets.kill_all(&init_path_map[mpi]);
|
||||
}
|
||||
mir::StatementKind::StorageDead(local) => {
|
||||
// End inits for StorageDead, so that an immutable variable can
|
||||
// be reinitialized on the next iteration of the loop.
|
||||
let move_path_index = rev_lookup.find_local(local);
|
||||
debug!("stmt {:?} at loc {:?} clears the ever initialized status of {:?}",
|
||||
stmt, location, &init_path_map[move_path_index]);
|
||||
sets.kill_all(&init_path_map[move_path_index]);
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue