diff options
| author | Paul Daniel Faria <Nashenas88@users.noreply.github.com> | 2019-10-24 09:18:04 -0400 |
|---|---|---|
| committer | Paul Daniel Faria <Nashenas88@users.noreply.github.com> | 2019-12-02 08:31:35 -0500 |
| commit | 26f1c01ff7d63415cabacefa301b6b4a6814f661 (patch) | |
| tree | 73d0be6696cceea005930cf9d4b956451e6b2308 | |
| parent | ab98c595eaa07249e2ebbf37c9123b33fc6a892f (diff) | |
| download | rust-26f1c01ff7d63415cabacefa301b6b4a6814f661.tar.gz rust-26f1c01ff7d63415cabacefa301b6b4a6814f661.zip | |
Add read_only fn to BodyCache<&mut...> impl, fix more Body -> (ReadOnly)BodyCache type errors
| -rw-r--r-- | src/librustc/mir/cache.rs | 9 | ||||
| -rw-r--r-- | src/librustc_mir/borrow_check/mod.rs | 6 | ||||
| -rw-r--r-- | src/librustc_mir/borrow_check/nll/mod.rs | 4 | ||||
| -rw-r--r-- | src/librustc_mir/borrow_check/nll/type_check/liveness/mod.rs | 11 | ||||
| -rw-r--r-- | src/librustc_mir/borrow_check/nll/type_check/liveness/trace.rs | 28 | ||||
| -rw-r--r-- | src/librustc_mir/borrow_check/nll/type_check/mod.rs | 30 |
6 files changed, 48 insertions, 40 deletions
diff --git a/src/librustc/mir/cache.rs b/src/librustc/mir/cache.rs index c0c5f77fe6e..24d1f9e373b 100644 --- a/src/librustc/mir/cache.rs +++ b/src/librustc/mir/cache.rs @@ -206,6 +206,15 @@ impl<'a, 'tcx> BodyCache<&'a mut Body<'tcx>> { } #[inline] + pub fn read_only(mut self) -> ReadOnlyBodyCache<'a, 'tcx> { + self.cache.ensure_predecessors(self.body); + ReadOnlyBodyCache { + cache: self.cache, + body: self.body, + } + } + + #[inline] pub fn basic_blocks(&self) -> &IndexVec<BasicBlock, BasicBlockData<'tcx>> { &self.body.basic_blocks } diff --git a/src/librustc_mir/borrow_check/mod.rs b/src/librustc_mir/borrow_check/mod.rs index 0c1b0c4e14e..f8ae07aa394 100644 --- a/src/librustc_mir/borrow_check/mod.rs +++ b/src/librustc_mir/borrow_check/mod.rs @@ -163,13 +163,13 @@ fn do_mir_borrowck<'a, 'tcx>( // be modified (in place) to contain non-lexical lifetimes. It // will have a lifetime tied to the inference context. let mut body: Body<'tcx> = input_body.clone(); - // TODO(pfaria) this very likely won't work because - let promoted: IndexVec<Promoted, Body<'tcx>> = input_promoted.clone(); - let mut promoted_cache: IndexVec<Promoted, BodyCache<&mut Body<'tcx>>> = promoted.iter_mut().map(|body| BodyCache::new(body)).collect(); + let mut promoted = input_promoted.clone(); + let mut promoted_cache: IndexVec<Promoted, BodyCache<&mut Body<'tcx>>> = input_promoted.clone().iter_mut().map(|body| BodyCache::new(body)).collect(); let mut body_cache = BodyCache::new(&mut body); let free_regions = nll::replace_regions_in_mir(infcx, def_id, param_env, &mut body_cache, &mut promoted_cache); let body_cache = BodyCache::new(&body).read_only(); // no further changes + let promoted: IndexVec<Promoted, ReadOnlyBodyCache<'_, 'tcx>> = promoted_cache.into_iter().map(|body_cache| body_cache.read_only()).collect(); let location_table = &LocationTable::new(&body_cache); diff --git a/src/librustc_mir/borrow_check/nll/mod.rs b/src/librustc_mir/borrow_check/nll/mod.rs index dac5815fada..5fa2c6605f6 100644 --- a/src/librustc_mir/borrow_check/nll/mod.rs +++ b/src/librustc_mir/borrow_check/nll/mod.rs @@ -159,7 +159,7 @@ pub(in crate::borrow_check) fn compute_regions<'cx, 'tcx>( def_id: DefId, universal_regions: UniversalRegions<'tcx>, body_cache: &ReadOnlyBodyCache<'_, 'tcx>, - promoted: &IndexVec<Promoted, Body<'tcx>>, + promoted_cache: &IndexVec<Promoted, ReadOnlyBodyCache<'_, 'tcx>>, local_names: &IndexVec<Local, Option<Symbol>>, upvars: &[Upvar], location_table: &LocationTable, @@ -191,7 +191,7 @@ pub(in crate::borrow_check) fn compute_regions<'cx, 'tcx>( infcx, param_env, body_cache, - promoted, + promoted_cache, def_id, &universal_regions, location_table, diff --git a/src/librustc_mir/borrow_check/nll/type_check/liveness/mod.rs b/src/librustc_mir/borrow_check/nll/type_check/liveness/mod.rs index a01b528833b..833958814af 100644 --- a/src/librustc_mir/borrow_check/nll/type_check/liveness/mod.rs +++ b/src/librustc_mir/borrow_check/nll/type_check/liveness/mod.rs @@ -7,7 +7,7 @@ use crate::borrow_check::nll::ToRegionVid; use crate::dataflow::move_paths::MoveData; use crate::dataflow::FlowAtLocation; use crate::dataflow::MaybeInitializedPlaces; -use rustc::mir::{Body, Local}; +use rustc::mir::{Body, Local, ReadOnlyBodyCache}; use rustc::ty::{RegionVid, TyCtxt}; use rustc_data_structures::fx::FxHashSet; use std::rc::Rc; @@ -28,7 +28,7 @@ mod trace; /// performed before pub(super) fn generate<'tcx>( typeck: &mut TypeChecker<'_, 'tcx>, - body: &Body<'tcx>, + body_cache: &ReadOnlyBodyCache<'_, 'tcx>, elements: &Rc<RegionValueElements>, flow_inits: &mut FlowAtLocation<'tcx, MaybeInitializedPlaces<'_, 'tcx>>, move_data: &MoveData<'tcx>, @@ -41,15 +41,14 @@ pub(super) fn generate<'tcx>( &typeck.borrowck_context.universal_regions, &typeck.borrowck_context.constraints.outlives_constraints, ); - let live_locals = compute_live_locals(typeck.tcx(), &free_regions, body); + let live_locals = compute_live_locals(typeck.tcx(), &free_regions, &body_cache); let facts_enabled = AllFacts::enabled(typeck.tcx()); - let polonius_drop_used = if facts_enabled { let mut drop_used = Vec::new(); polonius::populate_access_facts( typeck, - body, + &body_cache, location_table, move_data, &mut drop_used, @@ -62,7 +61,7 @@ pub(super) fn generate<'tcx>( if !live_locals.is_empty() || facts_enabled { trace::trace( typeck, - body, + body_cache, elements, flow_inits, move_data, diff --git a/src/librustc_mir/borrow_check/nll/type_check/liveness/trace.rs b/src/librustc_mir/borrow_check/nll/type_check/liveness/trace.rs index eacc4d084db..5929516ec4e 100644 --- a/src/librustc_mir/borrow_check/nll/type_check/liveness/trace.rs +++ b/src/librustc_mir/borrow_check/nll/type_check/liveness/trace.rs @@ -7,7 +7,7 @@ use crate::dataflow::indexes::MovePathIndex; use crate::dataflow::move_paths::MoveData; use crate::dataflow::{FlowAtLocation, FlowsAtLocation, MaybeInitializedPlaces}; use rustc::infer::canonical::QueryRegionConstraints; -use rustc::mir::{BasicBlock, Body, ConstraintCategory, Local, Location}; +use rustc::mir::{BasicBlock, ConstraintCategory, Local, Location, ReadOnlyBodyCache}; use rustc::traits::query::dropck_outlives::DropckOutlivesResult; use rustc::traits::query::type_op::outlives::DropckOutlives; use rustc::traits::query::type_op::TypeOp; @@ -32,7 +32,7 @@ use std::rc::Rc; /// this respects `#[may_dangle]` annotations). pub(super) fn trace( typeck: &mut TypeChecker<'_, 'tcx>, - body: &Body<'tcx>, + body_cache: &ReadOnlyBodyCache<'_, 'tcx>, elements: &Rc<RegionValueElements>, flow_inits: &mut FlowAtLocation<'tcx, MaybeInitializedPlaces<'_, 'tcx>>, move_data: &MoveData<'tcx>, @@ -41,11 +41,11 @@ pub(super) fn trace( ) { debug!("trace()"); - let local_use_map = &LocalUseMap::build(&live_locals, elements, body); + let local_use_map = &LocalUseMap::build(&live_locals, elements, &body_cache); let cx = LivenessContext { typeck, - body, + body_cache, flow_inits, elements, local_use_map, @@ -71,7 +71,7 @@ struct LivenessContext<'me, 'typeck, 'flow, 'tcx> { elements: &'me RegionValueElements, /// MIR we are analyzing. - body: &'me Body<'tcx>, + body_cache: &'me ReadOnlyBodyCache<'me, 'tcx>, /// Mapping to/from the various indices used for initialization tracking. move_data: &'me MoveData<'tcx>, @@ -135,7 +135,7 @@ impl LivenessResults<'me, 'typeck, 'flow, 'tcx> { self.compute_use_live_points_for(local); self.compute_drop_live_points_for(local); - let local_ty = self.cx.body.local_decls[local].ty; + let local_ty = self.cx.body_cache.local_decls[local].ty; if !self.use_live_at.is_empty() { self.cx.add_use_live_facts_for(local_ty, &self.use_live_at); @@ -165,7 +165,7 @@ impl LivenessResults<'me, 'typeck, 'flow, 'tcx> { for (local, location) in drop_used { if !live_locals.contains(&local) { - let local_ty = self.cx.body.local_decls[local].ty; + let local_ty = self.cx.body_cache.local_decls[local].ty; if local_ty.has_free_regions() { self.cx.add_drop_live_facts_for( local, @@ -211,7 +211,7 @@ impl LivenessResults<'me, 'typeck, 'flow, 'tcx> { } if self.use_live_at.insert(p) { - self.cx.elements.push_predecessors(self.cx.body, p, &mut self.stack) + self.cx.elements.push_predecessors(&self.cx.body_cache, p, &mut self.stack) } } } @@ -234,7 +234,7 @@ impl LivenessResults<'me, 'typeck, 'flow, 'tcx> { // Find the drops where `local` is initialized. for drop_point in self.cx.local_use_map.drops(local) { let location = self.cx.elements.to_location(drop_point); - debug_assert_eq!(self.cx.body.terminator_loc(location.block), location,); + debug_assert_eq!(self.cx.body_cache.terminator_loc(location.block), location,); if self.cx.initialized_at_terminator(location.block, mpi) { if self.drop_live_at.insert(drop_point) { @@ -280,7 +280,7 @@ impl LivenessResults<'me, 'typeck, 'flow, 'tcx> { // block. One of them may be either a definition or use // live point. let term_location = self.cx.elements.to_location(term_point); - debug_assert_eq!(self.cx.body.terminator_loc(term_location.block), term_location,); + debug_assert_eq!(self.cx.body_cache.terminator_loc(term_location.block), term_location,); let block = term_location.block; let entry_point = self.cx.elements.entry_point(term_location.block); for p in (entry_point..term_point).rev() { @@ -302,7 +302,7 @@ impl LivenessResults<'me, 'typeck, 'flow, 'tcx> { } } - for &pred_block in self.cx.body.predecessors_for(block).iter() { + for &pred_block in self.cx.body_cache.predecessors_for(block).iter() { debug!("compute_drop_live_points_for_block: pred_block = {:?}", pred_block,); // Check whether the variable is (at least partially) @@ -328,7 +328,7 @@ impl LivenessResults<'me, 'typeck, 'flow, 'tcx> { continue; } - let pred_term_loc = self.cx.body.terminator_loc(pred_block); + let pred_term_loc = self.cx.body_cache.terminator_loc(pred_block); let pred_term_point = self.cx.elements.point_from_location(pred_term_loc); // If the terminator of this predecessor either *assigns* @@ -399,7 +399,7 @@ impl LivenessContext<'_, '_, '_, 'tcx> { // the effects of all statements. This is the only way to get // "just ahead" of a terminator. self.flow_inits.reset_to_entry_of(block); - for statement_index in 0..self.body[block].statements.len() { + for statement_index in 0..self.body_cache[block].statements.len() { let location = Location { block, statement_index }; self.flow_inits.reconstruct_statement_effect(location); self.flow_inits.apply_local_effect(location); @@ -471,7 +471,7 @@ impl LivenessContext<'_, '_, '_, 'tcx> { drop_data.dropck_result.report_overflows( self.typeck.infcx.tcx, - self.body.source_info(*drop_locations.first().unwrap()).span, + self.body_cache.source_info(*drop_locations.first().unwrap()).span, dropped_ty, ); diff --git a/src/librustc_mir/borrow_check/nll/type_check/mod.rs b/src/librustc_mir/borrow_check/nll/type_check/mod.rs index 2de9f0e1282..8e966033bb8 100644 --- a/src/librustc_mir/borrow_check/nll/type_check/mod.rs +++ b/src/librustc_mir/borrow_check/nll/type_check/mod.rs @@ -116,7 +116,7 @@ pub(crate) fn type_check<'tcx>( infcx: &InferCtxt<'_, 'tcx>, param_env: ty::ParamEnv<'tcx>, body_cache: &ReadOnlyBodyCache<'_, 'tcx>, - promoted: &IndexVec<Promoted, Body<'tcx>>, + promoted_cache: &IndexVec<Promoted, ReadOnlyBodyCache<'_, 'tcx>>, mir_def_id: DefId, universal_regions: &Rc<UniversalRegions<'tcx>>, location_table: &LocationTable, @@ -162,7 +162,7 @@ pub(crate) fn type_check<'tcx>( mir_def_id, param_env, body_cache, - promoted, + promoted_cache, ®ion_bound_pairs, implicit_region_bound, &mut borrowck_context, @@ -186,7 +186,7 @@ fn type_check_internal<'a, 'tcx, R>( mir_def_id: DefId, param_env: ty::ParamEnv<'tcx>, body_cache: &ReadOnlyBodyCache<'a, 'tcx>, - promoted: &'a IndexVec<Promoted, Body<'tcx>>, + promoted_cache: &'a IndexVec<Promoted, ReadOnlyBodyCache<'_, 'tcx>>, region_bound_pairs: &'a RegionBoundPairs<'tcx>, implicit_region_bound: ty::Region<'tcx>, borrowck_context: &'a mut BorrowCheckContext<'a, 'tcx>, @@ -204,7 +204,7 @@ fn type_check_internal<'a, 'tcx, R>( universal_region_relations, ); let errors_reported = { - let mut verifier = TypeVerifier::new(&mut checker, body_cache, promoted); + let mut verifier = TypeVerifier::new(&mut checker, body_cache, promoted_cache); verifier.visit_body(body_cache); verifier.errors_reported }; @@ -261,7 +261,7 @@ enum FieldAccessError { struct TypeVerifier<'a, 'b, 'tcx> { cx: &'a mut TypeChecker<'b, 'tcx>, body: &'b Body<'tcx>, - promoted: &'b IndexVec<Promoted, Body<'tcx>>, + promoted_cache: &'b IndexVec<Promoted, ReadOnlyBodyCache<'b, 'tcx>>, last_span: Span, mir_def_id: DefId, errors_reported: bool, @@ -401,11 +401,11 @@ impl<'a, 'b, 'tcx> TypeVerifier<'a, 'b, 'tcx> { fn new( cx: &'a mut TypeChecker<'b, 'tcx>, body: &'b Body<'tcx>, - promoted: &'b IndexVec<Promoted, Body<'tcx>>, + promoted_cache: &'b IndexVec<Promoted, ReadOnlyBodyCache<'b, 'tcx>>, ) -> Self { TypeVerifier { body, - promoted, + promoted_cache, mir_def_id: cx.mir_def_id, cx, last_span: body.span, @@ -464,10 +464,10 @@ impl<'a, 'b, 'tcx> TypeVerifier<'a, 'b, 'tcx> { match kind { StaticKind::Promoted(promoted, _) => { if !self.errors_reported { - let promoted_body = &self.promoted[*promoted]; - self.sanitize_promoted(promoted_body, location); + let promoted_body_cache = &self.promoted_cache[*promoted]; + self.sanitize_promoted(promoted_body_cache, location); - let promoted_ty = promoted_body.return_ty(); + let promoted_ty = promoted_body_cache.return_ty(); check_err(self, place, promoted_ty, san_ty); } } @@ -535,12 +535,12 @@ impl<'a, 'b, 'tcx> TypeVerifier<'a, 'b, 'tcx> { place_ty } - fn sanitize_promoted(&mut self, promoted_body: &'b Body<'tcx>, location: Location) { + fn sanitize_promoted(&mut self, promoted_body_cache: &ReadOnlyBodyCache<'b, 'tcx>, location: Location) { // Determine the constraints from the promoted MIR by running the type // checker on the promoted MIR, then transfer the constraints back to // the main MIR, changing the locations to the provided location. - let parent_body = mem::replace(&mut self.body, promoted_body); + let parent_body = mem::replace(&mut self.body, &promoted_body_cache); // Use new sets of constraints and closure bounds so that we can // modify their locations. @@ -548,7 +548,7 @@ impl<'a, 'b, 'tcx> TypeVerifier<'a, 'b, 'tcx> { let mut constraints = Default::default(); let mut closure_bounds = Default::default(); let mut liveness_constraints = LivenessValues::new( - Rc::new(RegionValueElements::new(promoted_body)), + Rc::new(RegionValueElements::new(&promoted_body_cache)), ); // Don't try to add borrow_region facts for the promoted MIR @@ -570,12 +570,12 @@ impl<'a, 'b, 'tcx> TypeVerifier<'a, 'b, 'tcx> { swap_constraints(self); - self.visit_body(promoted_body); + self.visit_body(promoted_body_cache); if !self.errors_reported { // if verifier failed, don't do further checks to avoid ICEs - self.cx.typeck_mir(promoted_body); + self.cx.typeck_mir(&promoted_body_cache); } self.body = parent_body; |
