diff --git a/src/librustc/mir/mod.rs b/src/librustc/mir/mod.rs index 602ce12c37d818c2bf0e536d189378c731a964c3..0ebc70750a6bba18aaffb2f1372e03ca7c723da0 100644 --- a/src/librustc/mir/mod.rs +++ b/src/librustc/mir/mod.rs @@ -1547,7 +1547,7 @@ pub struct Statement<'tcx> { // `Statement` is used a lot. Make sure it doesn't unintentionally get bigger. #[cfg(target_arch = "x86_64")] -static_assert_size!(Statement<'_>, 64); +static_assert_size!(Statement<'_>, 32); impl Statement<'_> { /// Changes a statement to a nop. This is both faster than deleting instructions and avoids @@ -1568,7 +1568,7 @@ pub fn replace_nop(&mut self) -> Self { #[derive(Clone, Debug, RustcEncodable, RustcDecodable, HashStable)] pub enum StatementKind<'tcx> { /// Write the RHS Rvalue to the LHS Place. - Assign(Place<'tcx>, Box>), + Assign(Box<(Place<'tcx>, Rvalue<'tcx>)>), /// This represents all the reading that a pattern match may do /// (e.g., inspecting constants and discriminant values), and the @@ -1577,10 +1577,10 @@ pub enum StatementKind<'tcx> { /// /// Note that this also is emitted for regular `let` bindings to ensure that locals that are /// never accessed still get some sanity checks for, e.g., `let x: ! = ..;` - FakeRead(FakeReadCause, Place<'tcx>), + FakeRead(FakeReadCause, Box>), /// Write the discriminant for a variant to the enum Place. - SetDiscriminant { place: Place<'tcx>, variant_index: VariantIdx }, + SetDiscriminant { place: Box>, variant_index: VariantIdx }, /// Start a live range for the storage of the local. StorageLive(Local), @@ -1597,7 +1597,7 @@ pub enum StatementKind<'tcx> { /// by miri and only generated when "-Z mir-emit-retag" is passed. /// See /// for more details. - Retag(RetagKind, Place<'tcx>), + Retag(RetagKind, Box>), /// Encodes a user's type ascription. These need to be preserved /// intact so that NLL can respect them. For example: @@ -1611,7 +1611,7 @@ pub enum StatementKind<'tcx> { /// - `Contravariant` -- requires that `T_y :> T` /// - `Invariant` -- requires that `T_y == T` /// - `Bivariant` -- no effect - AscribeUserType(Place<'tcx>, ty::Variance, Box), + AscribeUserType(Box<(Place<'tcx>, UserTypeProjection)>, ty::Variance), /// No-op. Useful for deleting instructions without affecting statement indices. Nop, @@ -1675,7 +1675,7 @@ impl Debug for Statement<'_> { fn fmt(&self, fmt: &mut Formatter<'_>) -> fmt::Result { use self::StatementKind::*; match self.kind { - Assign(ref place, ref rv) => write!(fmt, "{:?} = {:?}", place, rv), + Assign(box(ref place, ref rv)) => write!(fmt, "{:?} = {:?}", place, rv), FakeRead(ref cause, ref place) => write!(fmt, "FakeRead({:?}, {:?})", cause, place), Retag(ref kind, ref place) => write!( fmt, @@ -1696,7 +1696,7 @@ fn fmt(&self, fmt: &mut Formatter<'_>) -> fmt::Result { InlineAsm(ref asm) => { write!(fmt, "asm!({:?} : {:?} : {:?})", asm.asm, asm.outputs, asm.inputs) } - AscribeUserType(ref place, ref variance, ref c_ty) => { + AscribeUserType(box(ref place, ref c_ty), ref variance) => { write!(fmt, "AscribeUserType({:?}, {:?}, {:?})", place, variance, c_ty) } Nop => write!(fmt, "nop"), @@ -2998,14 +2998,14 @@ impl<'tcx> TypeFoldable<'tcx> for Statement<'tcx> { EnumTypeFoldableImpl! { impl<'tcx> TypeFoldable<'tcx> for StatementKind<'tcx> { - (StatementKind::Assign)(a, b), + (StatementKind::Assign)(a), (StatementKind::FakeRead)(cause, place), (StatementKind::SetDiscriminant) { place, variant_index }, (StatementKind::StorageLive)(a), (StatementKind::StorageDead)(a), (StatementKind::InlineAsm)(a), (StatementKind::Retag)(kind, place), - (StatementKind::AscribeUserType)(a, v, b), + (StatementKind::AscribeUserType)(a, v), (StatementKind::Nop), } } diff --git a/src/librustc/mir/visit.rs b/src/librustc/mir/visit.rs index 9f3df7cc58f60799b695cd9798bc028987d84b9e..1e3b9eb29c79d0f07198409ccc43ee32f66eb1c3 100644 --- a/src/librustc/mir/visit.rs +++ b/src/librustc/mir/visit.rs @@ -344,7 +344,9 @@ fn super_statement(&mut self, self.visit_source_info(source_info); match kind { - StatementKind::Assign(place, rvalue) => { + StatementKind::Assign( + box(ref $($mutability)? place, ref $($mutability)? rvalue) + ) => { self.visit_assign(place, rvalue, location); } StatementKind::FakeRead(_, place) => { @@ -391,7 +393,10 @@ fn super_statement(&mut self, StatementKind::Retag(kind, place) => { self.visit_retag(kind, place, location); } - StatementKind::AscribeUserType(place, variance, user_ty) => { + StatementKind::AscribeUserType( + box(ref $($mutability)? place, ref $($mutability)? user_ty), + variance + ) => { self.visit_ascribe_user_ty(place, variance, user_ty, location); } StatementKind::Nop => {} diff --git a/src/librustc_codegen_ssa/mir/statement.rs b/src/librustc_codegen_ssa/mir/statement.rs index b1bc57c2e90ec88fa85564585d16f0ac0073b05b..dab7dfc04175110b57b369126d2817c1d9bb34fe 100644 --- a/src/librustc_codegen_ssa/mir/statement.rs +++ b/src/librustc_codegen_ssa/mir/statement.rs @@ -16,12 +16,12 @@ pub fn codegen_statement( self.set_debug_loc(&mut bx, statement.source_info); match statement.kind { - mir::StatementKind::Assign(ref place, ref rvalue) => { + mir::StatementKind::Assign(box(ref place, ref rvalue)) => { if let mir::Place { base: mir::PlaceBase::Local(index), projection: box [], - } = *place { - match self.locals[index] { + } = place { + match self.locals[*index] { LocalRef::Place(cg_dest) => { self.codegen_rvalue(bx, cg_dest, rvalue) } @@ -30,7 +30,7 @@ pub fn codegen_statement( } LocalRef::Operand(None) => { let (mut bx, operand) = self.codegen_rvalue_operand(bx, rvalue); - if let Some(name) = self.mir.local_decls[index].name { + if let Some(name) = self.mir.local_decls[*index].name { match operand.val { OperandValue::Ref(x, ..) | OperandValue::Immediate(x) => { @@ -44,7 +44,7 @@ pub fn codegen_statement( } } } - self.locals[index] = LocalRef::Operand(Some(operand)); + self.locals[*index] = LocalRef::Operand(Some(operand)); bx } LocalRef::Operand(Some(op)) => { @@ -64,7 +64,7 @@ pub fn codegen_statement( self.codegen_rvalue(bx, cg_dest, rvalue) } } - mir::StatementKind::SetDiscriminant{ref place, variant_index} => { + mir::StatementKind::SetDiscriminant{box ref place, variant_index} => { self.codegen_place(&mut bx, &place.as_ref()) .codegen_set_discr(&mut bx, variant_index); bx diff --git a/src/librustc_mir/borrow_check/conflict_errors.rs b/src/librustc_mir/borrow_check/conflict_errors.rs index a6f7c8f227c99b03c42f1edfbe20718973e211b9..413f7e2e406356c43573fe59dfa8cd2de0c115e1 100644 --- a/src/librustc_mir/borrow_check/conflict_errors.rs +++ b/src/librustc_mir/borrow_check/conflict_errors.rs @@ -1600,7 +1600,7 @@ fn annotate_argument_and_return_for_borrow( "annotate_argument_and_return_for_borrow: location={:?}", location ); - if let Some(&Statement { kind: StatementKind::Assign(ref reservation, _), ..}) + if let Some(&Statement { kind: StatementKind::Assign(box(ref reservation, _)), ..}) = &self.body[location.block].statements.get(location.statement_index) { debug!( @@ -1625,11 +1625,13 @@ fn annotate_argument_and_return_for_borrow( target, stmt ); if let StatementKind::Assign( - Place { - base: PlaceBase::Local(assigned_to), - projection: box [], - }, - box rvalue + box( + Place { + base: PlaceBase::Local(assigned_to), + projection: box [], + }, + rvalue + ) ) = &stmt.kind { debug!( "annotate_argument_and_return_for_borrow: assigned_to={:?} \ diff --git a/src/librustc_mir/borrow_check/error_reporting.rs b/src/librustc_mir/borrow_check/error_reporting.rs index aeee961d2d35457b0cf30671a61ec7fd9b34529a..5bccd2835c980d32f6d75caee10ead5fa486e834 100644 --- a/src/librustc_mir/borrow_check/error_reporting.rs +++ b/src/librustc_mir/borrow_check/error_reporting.rs @@ -41,7 +41,7 @@ pub(super) fn add_moved_or_invoked_closure_note( let mut target = place.local_or_deref_local(); for stmt in &self.body[location.block].statements[location.statement_index..] { debug!("add_moved_or_invoked_closure_note: stmt={:?} target={:?}", stmt, target); - if let StatementKind::Assign(into, box Rvalue::Use(from)) = &stmt.kind { + if let StatementKind::Assign(box(into, Rvalue::Use(from))) = &stmt.kind { debug!("add_fnonce_closure_note: into={:?} from={:?}", into, from); match from { Operand::Copy(ref place) | @@ -792,8 +792,7 @@ pub(super) fn move_spans( debug!("move_spans: moved_place={:?} location={:?} stmt={:?}", moved_place, location, stmt); if let StatementKind::Assign( - _, - box Rvalue::Aggregate(ref kind, ref places) + box(_, Rvalue::Aggregate(ref kind, ref places)) ) = stmt.kind { let (def_id, is_generator) = match kind { box AggregateKind::Closure(def_id, _) => (def_id, false), @@ -830,10 +829,10 @@ pub(super) fn borrow_spans(&self, use_span: Span, location: Location) -> UseSpan .get(location.statement_index) { Some(&Statement { - kind: StatementKind::Assign(Place { + kind: StatementKind::Assign(box(Place { base: PlaceBase::Local(local), projection: box [], - }, _), + }, _)), .. }) => local, _ => return OtherUse(use_span), @@ -846,7 +845,7 @@ pub(super) fn borrow_spans(&self, use_span: Span, location: Location) -> UseSpan for stmt in &self.body[location.block].statements[location.statement_index + 1..] { if let StatementKind::Assign( - _, box Rvalue::Aggregate(ref kind, ref places) + box(_, Rvalue::Aggregate(ref kind, ref places)) ) = stmt.kind { let (def_id, is_generator) = match kind { box AggregateKind::Closure(def_id, _) => (def_id, false), diff --git a/src/librustc_mir/borrow_check/mod.rs b/src/librustc_mir/borrow_check/mod.rs index 2305984a017d0d3515525f6d978d597c2ccb995e..3b10d8f19668c26950bf82a30c05170816e96d0d 100644 --- a/src/librustc_mir/borrow_check/mod.rs +++ b/src/librustc_mir/borrow_check/mod.rs @@ -546,7 +546,7 @@ fn visit_statement_entry( self.check_activations(location, span, flow_state); match stmt.kind { - StatementKind::Assign(ref lhs, ref rhs) => { + StatementKind::Assign(box(ref lhs, ref rhs)) => { self.consume_rvalue( location, (rhs, span), @@ -561,7 +561,7 @@ fn visit_statement_entry( flow_state, ); } - StatementKind::FakeRead(_, ref place) => { + StatementKind::FakeRead(_, box ref place) => { // Read for match doesn't access any memory and is used to // assert that a place is safe and live. So we don't have to // do any checks here. @@ -1387,7 +1387,7 @@ fn propagate_closure_used_mut_upvar(&mut self, operand: &Operand<'tcx>) { let stmt = &bbd.statements[loc.statement_index]; debug!("temporary assigned in: stmt={:?}", stmt); - if let StatementKind::Assign(_, box Rvalue::Ref(_, _, ref source)) = stmt.kind { + if let StatementKind::Assign(box(_, Rvalue::Ref(_, _, ref source))) = stmt.kind { propagate_closure_used_mut_place(self, source); } else { bug!("closures should only capture user variables \ diff --git a/src/librustc_mir/borrow_check/move_errors.rs b/src/librustc_mir/borrow_check/move_errors.rs index cdba1aafdacb0500ccc32654ea765a48fe8c3fc3..aa732b0092a223f300a5528c6420ceab3498115b 100644 --- a/src/librustc_mir/borrow_check/move_errors.rs +++ b/src/librustc_mir/borrow_check/move_errors.rs @@ -89,11 +89,13 @@ fn append_to_grouped_errors( // If that ever stops being the case, then the ever initialized // flow could be used. if let Some(StatementKind::Assign( - Place { - base: PlaceBase::Local(local), - projection: box [], - }, - box Rvalue::Use(Operand::Move(move_from)), + box( + Place { + base: PlaceBase::Local(local), + projection: box [], + }, + Rvalue::Use(Operand::Move(move_from)) + ) )) = self.body.basic_blocks()[location.block] .statements .get(location.statement_index) diff --git a/src/librustc_mir/borrow_check/nll/explain_borrow/mod.rs b/src/librustc_mir/borrow_check/nll/explain_borrow/mod.rs index ad68b4bc054bb7006c18308e797868a489d8482a..eae2f832ba7918c80ed68a97061100a312ff8073 100644 --- a/src/librustc_mir/borrow_check/nll/explain_borrow/mod.rs +++ b/src/librustc_mir/borrow_check/nll/explain_borrow/mod.rs @@ -541,10 +541,10 @@ fn was_captured_by_trait_object(&self, borrow: &BorrowData<'tcx>) -> bool { // it which simplifies the termination logic. let mut queue = vec![location]; let mut target = if let Some(&Statement { - kind: StatementKind::Assign(Place { + kind: StatementKind::Assign(box(Place { base: PlaceBase::Local(local), projection: box [], - }, _), + }, _)), .. }) = stmt { @@ -567,7 +567,7 @@ fn was_captured_by_trait_object(&self, borrow: &BorrowData<'tcx>) -> bool { debug!("was_captured_by_trait_object: stmt={:?}", stmt); // The only kind of statement that we care about is assignments... - if let StatementKind::Assign(place, box rvalue) = &stmt.kind { + if let StatementKind::Assign(box(place, rvalue)) = &stmt.kind { let into = match place.local_or_deref_local() { Some(into) => into, None => { diff --git a/src/librustc_mir/borrow_check/nll/invalidation.rs b/src/librustc_mir/borrow_check/nll/invalidation.rs index 71106af767064683378eb16223a81fd01466ca34..1d429e3a6dee6c721daa18e3e2b26d6700ccbda8 100644 --- a/src/librustc_mir/borrow_check/nll/invalidation.rs +++ b/src/librustc_mir/borrow_check/nll/invalidation.rs @@ -66,7 +66,7 @@ fn visit_statement( self.check_activations(location); match statement.kind { - StatementKind::Assign(ref lhs, ref rhs) => { + StatementKind::Assign(box(ref lhs, ref rhs)) => { self.consume_rvalue( location, rhs, 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 599472958f4fcf12f110f70f22c0eaed84613707..10c038bc3336fc51a2e809ed566545a24b02ceb5 100644 --- a/src/librustc_mir/borrow_check/nll/type_check/mod.rs +++ b/src/librustc_mir/borrow_check/nll/type_check/mod.rs @@ -1343,7 +1343,7 @@ fn check_stmt(&mut self, body: &Body<'tcx>, stmt: &Statement<'tcx>, location: Lo debug!("check_stmt: {:?}", stmt); let tcx = self.tcx(); match stmt.kind { - StatementKind::Assign(ref place, ref rv) => { + StatementKind::Assign(box(ref place, ref rv)) => { // Assignments to temporaries are not "interesting"; // they are not caused by the user, but rather artifacts // of lowering. Assignments to other sorts of places *are* interesting @@ -1450,7 +1450,7 @@ fn check_stmt(&mut self, body: &Body<'tcx>, stmt: &Statement<'tcx>, location: Lo ); }; } - StatementKind::AscribeUserType(ref place, variance, box ref projection) => { + StatementKind::AscribeUserType(box(ref place, ref projection), variance) => { let place_ty = place.ty(body, tcx).ty; if let Err(terr) = self.relate_type_and_user_type( place_ty, diff --git a/src/librustc_mir/borrow_check/used_muts.rs b/src/librustc_mir/borrow_check/used_muts.rs index 8bfd24a1e59156926b4463d36ac90b547c0acbd2..695080dfe23d90e2e41b0d7ef870b576d3e17930 100644 --- a/src/librustc_mir/borrow_check/used_muts.rs +++ b/src/librustc_mir/borrow_check/used_muts.rs @@ -89,7 +89,7 @@ fn visit_statement( _location: Location, ) { match &statement.kind { - StatementKind::Assign(into, _) => { + StatementKind::Assign(box(into, _)) => { if let PlaceBase::Local(local) = into.base { debug!( "visit_statement: statement={:?} local={:?} \ diff --git a/src/librustc_mir/build/cfg.rs b/src/librustc_mir/build/cfg.rs index 778d1e71cedfc3d8bd2414270ec06ec29bc63866..3ed6b4ff346784c66e27a4fc17a664ece3acae91 100644 --- a/src/librustc_mir/build/cfg.rs +++ b/src/librustc_mir/build/cfg.rs @@ -37,7 +37,7 @@ pub fn push_assign(&mut self, rvalue: Rvalue<'tcx>) { self.push(block, Statement { source_info, - kind: StatementKind::Assign(place.clone(), box rvalue) + kind: StatementKind::Assign(box(place.clone(), rvalue)) }); } diff --git a/src/librustc_mir/build/expr/as_place.rs b/src/librustc_mir/build/expr/as_place.rs index 5af66faf6ee1e8d81883183264389a831266dc22..09b33c6654a9db084a0bc431d1ed99bc81e54ec8 100644 --- a/src/librustc_mir/build/expr/as_place.rs +++ b/src/librustc_mir/build/expr/as_place.rs @@ -147,9 +147,11 @@ fn expr_as_place( Statement { source_info, kind: StatementKind::AscribeUserType( - place.clone(), + box( + place.clone(), + UserTypeProjection { base: annotation_index, projs: vec![], } + ), Variance::Invariant, - box UserTypeProjection { base: annotation_index, projs: vec![], }, ), }, ); @@ -174,9 +176,11 @@ fn expr_as_place( Statement { source_info, kind: StatementKind::AscribeUserType( - Place::from(temp.clone()), + box( + Place::from(temp.clone()), + UserTypeProjection { base: annotation_index, projs: vec![], }, + ), Variance::Invariant, - box UserTypeProjection { base: annotation_index, projs: vec![], }, ), }, ); diff --git a/src/librustc_mir/build/matches/mod.rs b/src/librustc_mir/build/matches/mod.rs index 64368ab604645d6a8986e4a4210fd8846ef42f44..613044dba29022ba32aa7b87716810fd7aa65f0c 100644 --- a/src/librustc_mir/build/matches/mod.rs +++ b/src/librustc_mir/build/matches/mod.rs @@ -135,7 +135,7 @@ pub fn match_expr( source_info, kind: StatementKind::FakeRead( FakeReadCause::ForMatchedPlace, - scrutinee_place.clone(), + box(scrutinee_place.clone()), ), }); @@ -320,7 +320,7 @@ pub(super) fn expr_into_pattern( block, Statement { source_info, - kind: StatementKind::FakeRead(FakeReadCause::ForLet, place), + kind: StatementKind::FakeRead(FakeReadCause::ForLet, box(place)), }, ); @@ -362,12 +362,12 @@ pub(super) fn expr_into_pattern( block, Statement { source_info: pattern_source_info, - kind: StatementKind::FakeRead(FakeReadCause::ForLet, place.clone()), + kind: StatementKind::FakeRead(FakeReadCause::ForLet, box(place.clone())), }, ); let ty_source_info = self.source_info(user_ty_span); - let user_ty = box pat_ascription_ty.user_ty( + let user_ty = pat_ascription_ty.user_ty( &mut self.canonical_user_type_annotations, place.ty(&self.local_decls, self.hir.tcx()).ty, ty_source_info.span, @@ -377,7 +377,10 @@ pub(super) fn expr_into_pattern( Statement { source_info: ty_source_info, kind: StatementKind::AscribeUserType( - place, + box( + place, + user_ty, + ), // We always use invariant as the variance here. This is because the // variance field from the ascription refers to the variance to use // when applying the type to the value being matched, but this @@ -393,7 +396,6 @@ pub(super) fn expr_into_pattern( // contrast, is intended to be used to relate `T` to the type of // ``. ty::Variance::Invariant, - user_ty, ), }, ); @@ -1523,7 +1525,7 @@ fn bind_and_guard_matched_candidate<'pat>( source_info: guard_end, kind: StatementKind::FakeRead( FakeReadCause::ForMatchGuard, - Place::from(temp), + box(Place::from(temp)), ), }); } @@ -1573,7 +1575,7 @@ fn bind_and_guard_matched_candidate<'pat>( post_guard_block, Statement { source_info: guard_end, - kind: StatementKind::FakeRead(FakeReadCause::ForGuardBinding, place), + kind: StatementKind::FakeRead(FakeReadCause::ForGuardBinding, box(place)), }, ); } @@ -1606,7 +1608,7 @@ fn ascribe_types(&mut self, block: BasicBlock, ascriptions: &[Ascription<'tcx>]) ascription.user_ty, ); - let user_ty = box ascription.user_ty.clone().user_ty( + let user_ty = ascription.user_ty.clone().user_ty( &mut self.canonical_user_type_annotations, ascription.source.ty(&self.local_decls, self.hir.tcx()).ty, source_info.span @@ -1616,9 +1618,11 @@ fn ascribe_types(&mut self, block: BasicBlock, ascriptions: &[Ascription<'tcx>]) Statement { source_info, kind: StatementKind::AscribeUserType( - ascription.source.clone(), + box( + ascription.source.clone(), + user_ty, + ), ascription.variance, - user_ty, ), }, ); diff --git a/src/librustc_mir/dataflow/impls/borrows.rs b/src/librustc_mir/dataflow/impls/borrows.rs index 04674fb58cb9f6ffa6c76cb3bab4917f8ae05f0d..a86fcb30f4d36ca97bbf7c94fec381eaf69e9834 100644 --- a/src/librustc_mir/dataflow/impls/borrows.rs +++ b/src/librustc_mir/dataflow/impls/borrows.rs @@ -268,8 +268,8 @@ fn statement_effect(&self, debug!("Borrows::statement_effect: stmt={:?}", stmt); match stmt.kind { - mir::StatementKind::Assign(ref lhs, ref rhs) => { - if let mir::Rvalue::Ref(_, _, ref place) = **rhs { + mir::StatementKind::Assign(box(ref lhs, ref rhs)) => { + if let mir::Rvalue::Ref(_, _, ref place) = *rhs { if place.ignore_borrow( self.tcx, self.body, diff --git a/src/librustc_mir/dataflow/impls/storage_liveness.rs b/src/librustc_mir/dataflow/impls/storage_liveness.rs index 0e01701ea9e4467ccd068289ebaf4578538a8e33..0f66b13fdc51af33d7404e3113583334aec274d9 100644 --- a/src/librustc_mir/dataflow/impls/storage_liveness.rs +++ b/src/librustc_mir/dataflow/impls/storage_liveness.rs @@ -119,8 +119,8 @@ fn statement_effect(&self, match stmt.kind { StatementKind::StorageLive(l) => sets.gen(l), StatementKind::StorageDead(l) => sets.kill(l), - StatementKind::Assign(ref place, _) - | StatementKind::SetDiscriminant { ref place, .. } => { + StatementKind::Assign(box(ref place, _)) + | StatementKind::SetDiscriminant { box ref place, .. } => { if let PlaceBase::Local(local) = place.base { sets.gen(local); } diff --git a/src/librustc_mir/dataflow/move_paths/builder.rs b/src/librustc_mir/dataflow/move_paths/builder.rs index a4427287c4f80003207c4734206cf5a0e23af9f8..698c50166270a2bea6b3b5d684df8ded2d746a1b 100644 --- a/src/librustc_mir/dataflow/move_paths/builder.rs +++ b/src/librustc_mir/dataflow/move_paths/builder.rs @@ -268,7 +268,7 @@ struct Gatherer<'b, 'a, 'tcx> { impl<'b, 'a, 'tcx> Gatherer<'b, 'a, 'tcx> { fn gather_statement(&mut self, stmt: &Statement<'tcx>) { match stmt.kind { - StatementKind::Assign(ref place, ref rval) => { + StatementKind::Assign(box(ref place, ref rval)) => { self.create_move_path(place); if let RvalueInitializationState::Shallow = rval.initialization_state() { // Box starts out uninitialized - need to create a separate diff --git a/src/librustc_mir/interpret/step.rs b/src/librustc_mir/interpret/step.rs index ca4da451a1f2d58f9f57879c683073b107fcb980..affca10bf5265e01db586b9e71eb60e50185841f 100644 --- a/src/librustc_mir/interpret/step.rs +++ b/src/librustc_mir/interpret/step.rs @@ -82,7 +82,7 @@ fn statement(&mut self, stmt: &mir::Statement<'tcx>) -> InterpResult<'tcx> { self.memory.tcx.span = stmt.source_info.span; match stmt.kind { - Assign(ref place, ref rvalue) => self.eval_rvalue_into_place(rvalue, place)?, + Assign(box(ref place, ref rvalue)) => self.eval_rvalue_into_place(rvalue, place)?, SetDiscriminant { ref place, diff --git a/src/librustc_mir/shim.rs b/src/librustc_mir/shim.rs index 9086ae844dd520086a2c470ee5bc7748d8140a42..6daca5e261431f7d4149c79b1945badd4e355f53 100644 --- a/src/librustc_mir/shim.rs +++ b/src/librustc_mir/shim.rs @@ -217,7 +217,7 @@ fn build_drop_shim<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId, ty: Option>) // Function arguments should be retagged, and we make this one raw. body.basic_blocks_mut()[START_BLOCK].statements.insert(0, Statement { source_info, - kind: StatementKind::Retag(RetagKind::Raw, dropee_ptr.clone()), + kind: StatementKind::Retag(RetagKind::Raw, box(dropee_ptr.clone())), }); } let patch = { @@ -415,8 +415,10 @@ fn copy_shim(&mut self) { let rcvr = Place::from(Local::new(1+0)).deref(); let ret_statement = self.make_statement( StatementKind::Assign( - Place::return_place(), - box Rvalue::Use(Operand::Copy(rcvr)) + box( + Place::return_place(), + Rvalue::Use(Operand::Copy(rcvr)) + ) ) ); self.block(vec![ret_statement], TerminatorKind::Return, false); @@ -458,8 +460,10 @@ fn make_clone_call( // `let ref_loc: &ty = &src;` let statement = self.make_statement( StatementKind::Assign( - ref_loc.clone(), - box Rvalue::Ref(tcx.lifetimes.re_erased, BorrowKind::Shared, src) + box( + ref_loc.clone(), + Rvalue::Ref(tcx.lifetimes.re_erased, BorrowKind::Shared, src) + ) ) ); @@ -486,8 +490,10 @@ fn loop_header( let cond = self.make_place(Mutability::Mut, tcx.types.bool); let compute_cond = self.make_statement( StatementKind::Assign( - cond.clone(), - box Rvalue::BinaryOp(BinOp::Ne, Operand::Copy(end), Operand::Copy(beg)) + box( + cond.clone(), + Rvalue::BinaryOp(BinOp::Ne, Operand::Copy(end), Operand::Copy(beg)) + ) ) ); @@ -521,14 +527,18 @@ fn array_shim(&mut self, dest: Place<'tcx>, src: Place<'tcx>, ty: Ty<'tcx>, len: let inits = vec![ self.make_statement( StatementKind::Assign( - Place::from(beg), - box Rvalue::Use(Operand::Constant(self.make_usize(0))) + box( + Place::from(beg), + Rvalue::Use(Operand::Constant(self.make_usize(0))) + ) ) ), self.make_statement( StatementKind::Assign( - end.clone(), - box Rvalue::Use(Operand::Constant(self.make_usize(len))) + box( + end.clone(), + Rvalue::Use(Operand::Constant(self.make_usize(len))) + ) ) ) ]; @@ -559,11 +569,13 @@ fn array_shim(&mut self, dest: Place<'tcx>, src: Place<'tcx>, ty: Ty<'tcx>, len: let statements = vec![ self.make_statement( StatementKind::Assign( - Place::from(beg), - box Rvalue::BinaryOp( - BinOp::Add, - Operand::Copy(Place::from(beg)), - Operand::Constant(self.make_usize(1)) + box( + Place::from(beg), + Rvalue::BinaryOp( + BinOp::Add, + Operand::Copy(Place::from(beg)), + Operand::Constant(self.make_usize(1)) + ) ) ) ) @@ -582,8 +594,10 @@ fn array_shim(&mut self, dest: Place<'tcx>, src: Place<'tcx>, ty: Ty<'tcx>, len: let beg = self.local_decls.push(temp_decl(Mutability::Mut, tcx.types.usize, span)); let init = self.make_statement( StatementKind::Assign( - Place::from(beg), - box Rvalue::Use(Operand::Constant(self.make_usize(0))) + box( + Place::from(beg), + Rvalue::Use(Operand::Constant(self.make_usize(0))) + ) ) ); self.block(vec![init], TerminatorKind::Goto { target: BasicBlock::new(6) }, true); @@ -609,11 +623,13 @@ fn array_shim(&mut self, dest: Place<'tcx>, src: Place<'tcx>, ty: Ty<'tcx>, len: // `goto #6;` let statement = self.make_statement( StatementKind::Assign( - Place::from(beg), - box Rvalue::BinaryOp( - BinOp::Add, - Operand::Copy(Place::from(beg)), - Operand::Constant(self.make_usize(1)) + box( + Place::from(beg), + Rvalue::BinaryOp( + BinOp::Add, + Operand::Copy(Place::from(beg)), + Operand::Constant(self.make_usize(1)) + ) ) ) ); @@ -727,8 +743,10 @@ fn build_call_shim<'tcx>( statements.push(Statement { source_info, kind: StatementKind::Assign( - Place::from(ref_rcvr), - box Rvalue::Ref(tcx.lifetimes.re_erased, borrow_kind, rcvr_l) + box( + Place::from(ref_rcvr), + Rvalue::Ref(tcx.lifetimes.re_erased, borrow_kind, rcvr_l) + ) ) }); Operand::Move(Place::from(ref_rcvr)) diff --git a/src/librustc_mir/transform/add_retag.rs b/src/librustc_mir/transform/add_retag.rs index 466f6060827ec1d7b15f95538157982bfbb841e0..833c8b1646bb68d2ec31ad55f5db9a8809c927e2 100644 --- a/src/librustc_mir/transform/add_retag.rs +++ b/src/librustc_mir/transform/add_retag.rs @@ -89,7 +89,7 @@ fn run_pass(&self, tcx: TyCtxt<'tcx>, _src: MirSource<'tcx>, body: &mut Body<'tc basic_blocks[START_BLOCK].statements.splice(0..0, places.into_iter().map(|place| Statement { source_info, - kind: StatementKind::Retag(RetagKind::FnEntry, place), + kind: StatementKind::Retag(RetagKind::FnEntry, box(place)), }) ); } @@ -125,7 +125,7 @@ fn run_pass(&self, tcx: TyCtxt<'tcx>, _src: MirSource<'tcx>, body: &mut Body<'tc for (source_info, dest_place, dest_block) in returns { basic_blocks[dest_block].statements.insert(0, Statement { source_info, - kind: StatementKind::Retag(RetagKind::Default, dest_place), + kind: StatementKind::Retag(RetagKind::Default, box(dest_place)), }); } @@ -137,11 +137,11 @@ fn run_pass(&self, tcx: TyCtxt<'tcx>, _src: MirSource<'tcx>, body: &mut Body<'tc for i in (0..block_data.statements.len()).rev() { let (retag_kind, place) = match block_data.statements[i].kind { // If we are casting *from* a reference, we may have to retag-as-raw. - StatementKind::Assign(ref place, box Rvalue::Cast( + StatementKind::Assign(box(ref place, Rvalue::Cast( CastKind::Misc, ref src, dest_ty, - )) => { + ))) => { let src_ty = src.ty(&*local_decls, tcx); if src_ty.is_region_ptr() { // The only `Misc` casts on references are those creating raw pointers. @@ -155,7 +155,7 @@ fn run_pass(&self, tcx: TyCtxt<'tcx>, _src: MirSource<'tcx>, body: &mut Body<'tc // Assignments of reference or ptr type are the ones where we may have // to update tags. This includes `x = &[mut] ...` and hence // we also retag after taking a reference! - StatementKind::Assign(ref place, box ref rvalue) if needs_retag(place) => { + StatementKind::Assign(box(ref place, ref rvalue)) if needs_retag(place) => { let kind = match rvalue { Rvalue::Ref(_, borrow_kind, _) if borrow_kind.allows_two_phase_borrow() @@ -173,7 +173,7 @@ fn run_pass(&self, tcx: TyCtxt<'tcx>, _src: MirSource<'tcx>, body: &mut Body<'tc let source_info = block_data.statements[i].source_info; block_data.statements.insert(i+1, Statement { source_info, - kind: StatementKind::Retag(retag_kind, place), + kind: StatementKind::Retag(retag_kind, box(place)), }); } } diff --git a/src/librustc_mir/transform/cleanup_post_borrowck.rs b/src/librustc_mir/transform/cleanup_post_borrowck.rs index ede1cb62f9451475583c390ec82bf5aea48014fd..ea173279aa07321604650d5ae7fb19ec33b93895 100644 --- a/src/librustc_mir/transform/cleanup_post_borrowck.rs +++ b/src/librustc_mir/transform/cleanup_post_borrowck.rs @@ -39,7 +39,7 @@ fn visit_statement(&mut self, location: Location) { match statement.kind { StatementKind::AscribeUserType(..) - | StatementKind::Assign(_, box Rvalue::Ref(_, BorrowKind::Shallow, _)) + | StatementKind::Assign(box(_, Rvalue::Ref(_, BorrowKind::Shallow, _))) | StatementKind::FakeRead(..) => statement.make_nop(), _ => (), } diff --git a/src/librustc_mir/transform/const_prop.rs b/src/librustc_mir/transform/const_prop.rs index 2e91561f2eee1c1d1f3cf5fb7c52dbd59f799821..614d5d2a4a2fbd5174564b233523934b1274ef63 100644 --- a/src/librustc_mir/transform/const_prop.rs +++ b/src/librustc_mir/transform/const_prop.rs @@ -665,7 +665,7 @@ fn visit_statement( location: Location, ) { trace!("visit_statement: {:?}", statement); - if let StatementKind::Assign(ref place, ref mut rval) = statement.kind { + if let StatementKind::Assign(box(ref place, ref mut rval)) = statement.kind { let place_ty: Ty<'tcx> = place .ty(&self.local_decls, self.tcx) .ty; diff --git a/src/librustc_mir/transform/copy_prop.rs b/src/librustc_mir/transform/copy_prop.rs index 20bdb4b03f0813dfa94d85991f1b071ed6a741d6..28f97f41b50cf7027d4d0181f3e6e71fcedab517 100644 --- a/src/librustc_mir/transform/copy_prop.rs +++ b/src/librustc_mir/transform/copy_prop.rs @@ -94,11 +94,13 @@ fn run_pass(&self, tcx: TyCtxt<'tcx>, _source: MirSource<'tcx>, body: &mut Body< // That use of the source must be an assignment. match statement.kind { StatementKind::Assign( - Place { - base: PlaceBase::Local(local), - projection: box [], - }, - box Rvalue::Use(ref operand) + box( + Place { + base: PlaceBase::Local(local), + projection: box [], + }, + Rvalue::Use(ref operand) + ) ) if local == dest_local => { let maybe_action = match *operand { Operand::Copy(ref src_place) | @@ -148,24 +150,28 @@ fn eliminate_self_assignments( if let Some(stmt) = body[location.block].statements.get(location.statement_index) { match stmt.kind { StatementKind::Assign( - Place { - base: PlaceBase::Local(local), - projection: box [], - }, - box Rvalue::Use(Operand::Copy(Place { - base: PlaceBase::Local(src_local), - projection: box [], - })), + box( + Place { + base: PlaceBase::Local(local), + projection: box [], + }, + Rvalue::Use(Operand::Copy(Place { + base: PlaceBase::Local(src_local), + projection: box [], + })), + ) ) | StatementKind::Assign( - Place { - base: PlaceBase::Local(local), - projection: box [], - }, - box Rvalue::Use(Operand::Move(Place { - base: PlaceBase::Local(src_local), - projection: box [], - })), + box( + Place { + base: PlaceBase::Local(local), + projection: box [], + }, + Rvalue::Use(Operand::Move(Place { + base: PlaceBase::Local(src_local), + projection: box [], + })), + ) ) if local == dest_local && dest_local == src_local => {} _ => { continue; diff --git a/src/librustc_mir/transform/deaggregator.rs b/src/librustc_mir/transform/deaggregator.rs index 1fc7ce09aa647db7a2d2229f3956578a79ba5794..c1224be6324e20bd58379e882864c0e89420d1e2 100644 --- a/src/librustc_mir/transform/deaggregator.rs +++ b/src/librustc_mir/transform/deaggregator.rs @@ -12,8 +12,8 @@ fn run_pass(&self, tcx: TyCtxt<'tcx>, _source: MirSource<'tcx>, body: &mut Body< for bb in basic_blocks { bb.expand_statements(|stmt| { // FIXME(eddyb) don't match twice on `stmt.kind` (post-NLL). - if let StatementKind::Assign(_, ref rhs) = stmt.kind { - if let Rvalue::Aggregate(ref kind, _) = **rhs { + if let StatementKind::Assign(box(_, ref rhs)) = stmt.kind { + if let Rvalue::Aggregate(ref kind, _) = *rhs { // FIXME(#48193) Deaggregate arrays when it's cheaper to do so. if let AggregateKind::Array(_) = **kind { return None; @@ -28,7 +28,7 @@ fn run_pass(&self, tcx: TyCtxt<'tcx>, _source: MirSource<'tcx>, body: &mut Body< let stmt = stmt.replace_nop(); let source_info = stmt.source_info; let (lhs, kind, operands) = match stmt.kind { - StatementKind::Assign(lhs, box rvalue) => { + StatementKind::Assign(box(lhs, rvalue)) => { match rvalue { Rvalue::Aggregate(kind, operands) => (lhs, kind, operands), _ => bug!() diff --git a/src/librustc_mir/transform/elaborate_drops.rs b/src/librustc_mir/transform/elaborate_drops.rs index de5978c3a3525a5c345d87ce347519fdaa5463bf..a9c66b3c8c6d18dac2a90fa39358599414668692 100644 --- a/src/librustc_mir/transform/elaborate_drops.rs +++ b/src/librustc_mir/transform/elaborate_drops.rs @@ -452,7 +452,7 @@ fn elaborate_replace( assert!(!data.is_cleanup, "DropAndReplace in unwind path not supported"); let assign = Statement { - kind: StatementKind::Assign(location.clone(), box Rvalue::Use(value.clone())), + kind: StatementKind::Assign(box(location.clone(), Rvalue::Use(value.clone()))), source_info: terminator.source_info }; diff --git a/src/librustc_mir/transform/generator.rs b/src/librustc_mir/transform/generator.rs index cf899c64406bca8759e5275c306527ce987f6de9..0ce2db93c421d0ce99d7e835aa19180e8ce7d783 100644 --- a/src/librustc_mir/transform/generator.rs +++ b/src/librustc_mir/transform/generator.rs @@ -217,7 +217,10 @@ fn set_discr(&self, state_disc: VariantIdx, source_info: SourceInfo) -> Statemen let self_place = Place::from(self_arg()); Statement { source_info, - kind: StatementKind::SetDiscriminant { place: self_place, variant_index: state_disc }, + kind: StatementKind::SetDiscriminant { + place: box self_place, + variant_index: state_disc, + }, } } @@ -230,7 +233,7 @@ fn get_discr(&self, body: &mut Body<'tcx>) -> (Statement<'tcx>, Place<'tcx>) { let self_place = Place::from(self_arg()); let assign = Statement { source_info: source_info(body), - kind: StatementKind::Assign(temp.clone(), box Rvalue::Discriminant(self_place)), + kind: StatementKind::Assign(box(temp.clone(), Rvalue::Discriminant(self_place))), }; (assign, temp) } @@ -288,8 +291,12 @@ fn visit_basic_block_data(&mut self, // We must assign the value first in case it gets declared dead below data.statements.push(Statement { source_info, - kind: StatementKind::Assign(Place::return_place(), - box self.make_state(state_idx, v)), + kind: StatementKind::Assign( + box( + Place::return_place(), + self.make_state(state_idx, v) + ) + ), }); let state = if let Some(resume) = resume { // Yield let state = 3 + self.suspension_points.len(); @@ -929,7 +936,7 @@ fn create_generator_drop_shim<'tcx>( // Alias tracking must know we changed the type body.basic_blocks_mut()[START_BLOCK].statements.insert(0, Statement { source_info, - kind: StatementKind::Retag(RetagKind::Raw, Place::from(self_arg())), + kind: StatementKind::Retag(RetagKind::Raw, box Place::from(self_arg())), }) } diff --git a/src/librustc_mir/transform/inline.rs b/src/librustc_mir/transform/inline.rs index 2b3c6d55f24ddd4ab69784bd2cf8dbf0192c2a34..5ad026dc143c9574c4dbce509b8371555877eacf 100644 --- a/src/librustc_mir/transform/inline.rs +++ b/src/librustc_mir/transform/inline.rs @@ -457,7 +457,7 @@ fn dest_needs_borrow(place: &Place<'_>) -> bool { let stmt = Statement { source_info: callsite.location, - kind: StatementKind::Assign(tmp.clone(), box dest) + kind: StatementKind::Assign(box(tmp.clone(), dest)) }; caller_body[callsite.bb] .statements.push(stmt); @@ -608,7 +608,7 @@ fn create_temp_if_necessary( let stmt = Statement { source_info: callsite.location, - kind: StatementKind::Assign(Place::from(arg_tmp), box arg), + kind: StatementKind::Assign(box(Place::from(arg_tmp), arg)), }; caller_body[callsite.bb].statements.push(stmt); arg_tmp diff --git a/src/librustc_mir/transform/promote_consts.rs b/src/librustc_mir/transform/promote_consts.rs index 0723a0c992e8e2a4b5cbdef82bbcc641654e0524..7d1b96b8be170dc89d11cde8d5194285a88cf723 100644 --- a/src/librustc_mir/transform/promote_consts.rs +++ b/src/librustc_mir/transform/promote_consts.rs @@ -187,7 +187,7 @@ fn assign(&mut self, dest: Local, rvalue: Rvalue<'tcx>, span: Span) { span, scope: OUTERMOST_SOURCE_SCOPE }, - kind: StatementKind::Assign(Place::from(dest), box rvalue) + kind: StatementKind::Assign(box(Place::from(dest), rvalue)) }); } @@ -222,10 +222,10 @@ fn promote_temp(&mut self, temp: Local) -> Local { // First, take the Rvalue or Call out of the source MIR, // or duplicate it, depending on keep_original. if loc.statement_index < no_stmts { - let (rvalue, source_info) = { + let (mut rvalue, source_info) = { let statement = &mut self.source[loc.block].statements[loc.statement_index]; let rhs = match statement.kind { - StatementKind::Assign(_, ref mut rhs) => rhs, + StatementKind::Assign(box(_, ref mut rhs)) => rhs, _ => { span_bug!(statement.source_info.span, "{:?} is not an assignment", statement); @@ -235,12 +235,11 @@ fn promote_temp(&mut self, temp: Local) -> Local { (if self.keep_original { rhs.clone() } else { - let unit = box Rvalue::Aggregate(box AggregateKind::Tuple, vec![]); + let unit = Rvalue::Aggregate(box AggregateKind::Tuple, vec![]); mem::replace(rhs, unit) }, statement.source_info) }; - let mut rvalue = *rvalue; self.visit_rvalue(&mut rvalue, loc); self.assign(new_temp, rvalue, source_info.span); } else { @@ -326,7 +325,7 @@ fn promote_candidate( Candidate::Ref(loc) => { let ref mut statement = blocks[loc.block].statements[loc.statement_index]; match statement.kind { - StatementKind::Assign(_, box Rvalue::Ref(_, _, ref mut place)) => { + StatementKind::Assign(box(_, Rvalue::Ref(_, _, ref mut place))) => { // Use the underlying local for this (necessarily interior) borrow. let ty = place.base.ty(local_decls).ty; let span = statement.source_info.span; @@ -345,7 +344,7 @@ fn promote_candidate( Candidate::Repeat(loc) => { let ref mut statement = blocks[loc.block].statements[loc.statement_index]; match statement.kind { - StatementKind::Assign(_, box Rvalue::Repeat(ref mut operand, _)) => { + StatementKind::Assign(box(_, Rvalue::Repeat(ref mut operand, _))) => { let ty = operand.ty(local_decls, self.tcx); let span = statement.source_info.span; mem::replace( @@ -420,10 +419,10 @@ pub fn promote_candidates<'tcx>( Candidate::Repeat(Location { block, statement_index }) | Candidate::Ref(Location { block, statement_index }) => { match body[block].statements[statement_index].kind { - StatementKind::Assign(Place { + StatementKind::Assign(box(Place { base: PlaceBase::Local(local), projection: box [], - }, _) => { + }, _)) => { if temps[local] == TempState::PromotedOut { // Already promoted. continue; @@ -473,10 +472,10 @@ pub fn promote_candidates<'tcx>( for block in body.basic_blocks_mut() { block.statements.retain(|statement| { match statement.kind { - StatementKind::Assign(Place { + StatementKind::Assign(box(Place { base: PlaceBase::Local(index), projection: box [], - }, _) | + }, _)) | StatementKind::StorageLive(index) | StatementKind::StorageDead(index) => { !promoted(index) diff --git a/src/librustc_mir/transform/qualify_consts.rs b/src/librustc_mir/transform/qualify_consts.rs index e05b0c96620565e58713494f7c1abf0ba84e5e9d..7cc1e634cf812da820c6aa6428d4e134eef85e83 100644 --- a/src/librustc_mir/transform/qualify_consts.rs +++ b/src/librustc_mir/transform/qualify_consts.rs @@ -982,23 +982,25 @@ fn check_const(&mut self) -> (u8, &'tcx BitSet) { for candidate in &self.promotion_candidates { match *candidate { Candidate::Repeat(Location { block: bb, statement_index: stmt_idx }) => { - if let StatementKind::Assign(_, box Rvalue::Repeat( + if let StatementKind::Assign(box(_, Rvalue::Repeat( Operand::Move(Place { base: PlaceBase::Local(index), projection: box [], }), _ - )) = self.body[bb].statements[stmt_idx].kind { + ))) = self.body[bb].statements[stmt_idx].kind { promoted_temps.insert(index); } } Candidate::Ref(Location { block: bb, statement_index: stmt_idx }) => { if let StatementKind::Assign( - _, - box Rvalue::Ref(_, _, Place { - base: PlaceBase::Local(index), - projection: box [], - }) + box( + _, + Rvalue::Ref(_, _, Place { + base: PlaceBase::Local(index), + projection: box [], + }) + ) ) = self.body[bb].statements[stmt_idx].kind { promoted_temps.insert(index); } diff --git a/src/librustc_mir/transform/qualify_min_const_fn.rs b/src/librustc_mir/transform/qualify_min_const_fn.rs index cb2da1d5ff916009b30172bfaa390fcd10845d00..80e020a9eb7e65b8442040178ddb657c975c554e 100644 --- a/src/librustc_mir/transform/qualify_min_const_fn.rs +++ b/src/librustc_mir/transform/qualify_min_const_fn.rs @@ -206,7 +206,7 @@ fn check_statement( ) -> McfResult { let span = statement.source_info.span; match &statement.kind { - StatementKind::Assign(place, rval) => { + StatementKind::Assign(box(place, rval)) => { check_place(place, span)?; check_rvalue(tcx, body, rval, span) } diff --git a/src/librustc_mir/transform/remove_noop_landing_pads.rs b/src/librustc_mir/transform/remove_noop_landing_pads.rs index 07669e2c0c986c606ca678c581134cc4f36d9ed9..70b11944e2fbcc463288cf09b745cd47a5121fc1 100644 --- a/src/librustc_mir/transform/remove_noop_landing_pads.rs +++ b/src/librustc_mir/transform/remove_noop_landing_pads.rs @@ -41,10 +41,10 @@ fn is_nop_landing_pad( // These are all nops in a landing pad } - StatementKind::Assign(Place { + StatementKind::Assign(box(Place { base: PlaceBase::Local(_), projection: box [], - }, box Rvalue::Use(_)) => { + }, Rvalue::Use(_))) => { // Writing to a local (e.g., a drop flag) does not // turn a landing pad to a non-nop } diff --git a/src/librustc_mir/transform/rustc_peek.rs b/src/librustc_mir/transform/rustc_peek.rs index 208407bb9a5e088b84348b60f9769d57a921d79f..68fa082d2940786ab737eca0b02c30fcb1b73a17 100644 --- a/src/librustc_mir/transform/rustc_peek.rs +++ b/src/librustc_mir/transform/rustc_peek.rs @@ -150,7 +150,7 @@ fn each_block<'tcx, O>( for (j, stmt) in statements.iter().enumerate() { debug!("rustc_peek: ({:?},{}) {:?}", bb, j, stmt); let (place, rvalue) = match stmt.kind { - mir::StatementKind::Assign(ref place, ref rvalue) => { + mir::StatementKind::Assign(box(ref place, ref rvalue)) => { (place, rvalue) } mir::StatementKind::FakeRead(..) | @@ -166,7 +166,7 @@ fn each_block<'tcx, O>( }; if place == peek_arg_place { - if let mir::Rvalue::Ref(_, mir::BorrowKind::Shared, ref peeking_at_place) = **rvalue { + if let mir::Rvalue::Ref(_, mir::BorrowKind::Shared, ref peeking_at_place) = *rvalue { // Okay, our search is over. match move_data.rev_lookup.find(peeking_at_place.as_ref()) { LookupResult::Exact(peek_mpi) => { diff --git a/src/librustc_mir/transform/uniform_array_move_out.rs b/src/librustc_mir/transform/uniform_array_move_out.rs index 2f900f2638f48314e08d38961fe74f963b0bc9b8..34ad5cb5dc787d8762262a0b327a54e3a7fb476d 100644 --- a/src/librustc_mir/transform/uniform_array_move_out.rs +++ b/src/librustc_mir/transform/uniform_array_move_out.rs @@ -200,8 +200,8 @@ fn run_pass(&self, tcx: TyCtxt<'tcx>, src: MirSource<'tcx>, body: &mut Body<'tcx for candidate in &visitor.candidates { let statement = &body[candidate.block].statements[candidate.statement_index]; - if let StatementKind::Assign(ref dst_place, ref rval) = statement.kind { - if let Rvalue::Aggregate(box AggregateKind::Array(_), ref items) = **rval { + if let StatementKind::Assign(box(ref dst_place, ref rval)) = statement.kind { + if let Rvalue::Aggregate(box AggregateKind::Array(_), ref items) = *rval { let items : Vec<_> = items.iter().map(|item| { if let Operand::Move(Place { base: PlaceBase::Local(local), @@ -293,24 +293,28 @@ fn try_get_item_source<'a, 'tcx>(local_use: &LocalUse, if block.statements.len() > location.statement_index { let statement = &block.statements[location.statement_index]; if let StatementKind::Assign( - Place { - base: PlaceBase::Local(_), - projection: box [], - }, - box Rvalue::Use(Operand::Move(Place { - base: _, - projection: box [.., ProjectionElem::ConstantIndex { + box( + Place { + base: PlaceBase::Local(_), + projection: box [], + }, + Rvalue::Use(Operand::Move(Place { + base: _, + projection: box [.., ProjectionElem::ConstantIndex { offset, min_length: _, from_end: false - }], - })), + }], + })), + ) ) = &statement.kind { // FIXME remove once we can use slices patterns if let StatementKind::Assign( - _, - box Rvalue::Use(Operand::Move(Place { - base, - projection: box [proj_base @ .., _], - })), + box( + _, + Rvalue::Use(Operand::Move(Place { + base, + projection: box [proj_base @ .., _], + })), + ) ) = &statement.kind { return Some((*offset, PlaceRef { base, diff --git a/src/librustc_mir/util/aggregate.rs b/src/librustc_mir/util/aggregate.rs index 98e70671ab71562bfc1a0007eba8fdf58eacc9b6..b3565d40b8e217e9bdab4f4f2a737adfb3654481 100644 --- a/src/librustc_mir/util/aggregate.rs +++ b/src/librustc_mir/util/aggregate.rs @@ -24,7 +24,7 @@ pub fn expand_aggregate<'tcx>( if adt_def.is_enum() { set_discriminant = Some(Statement { kind: StatementKind::SetDiscriminant { - place: lhs.clone(), + place: box(lhs.clone()), variant_index, }, source_info, @@ -39,7 +39,7 @@ pub fn expand_aggregate<'tcx>( let variant_index = VariantIdx::new(0); set_discriminant = Some(Statement { kind: StatementKind::SetDiscriminant { - place: lhs.clone(), + place: box(lhs.clone()), variant_index, }, source_info, @@ -70,7 +70,7 @@ pub fn expand_aggregate<'tcx>( }; Statement { source_info, - kind: StatementKind::Assign(lhs_field, box Rvalue::Use(op)), + kind: StatementKind::Assign(box(lhs_field, Rvalue::Use(op))), } }).chain(set_discriminant) } diff --git a/src/librustc_mir/util/elaborate_drops.rs b/src/librustc_mir/util/elaborate_drops.rs index c60af70712d1b60c2bdb1b835295b08d667f8f30..52ad97bbde1d7ce6a471d9ccc33d8dcaf22f06d1 100644 --- a/src/librustc_mir/util/elaborate_drops.rs +++ b/src/librustc_mir/util/elaborate_drops.rs @@ -978,7 +978,7 @@ fn constant_usize(&self, val: u16) -> Operand<'tcx> { fn assign(&self, lhs: &Place<'tcx>, rhs: Rvalue<'tcx>) -> Statement<'tcx> { Statement { source_info: self.source_info, - kind: StatementKind::Assign(lhs.clone(), box rhs) + kind: StatementKind::Assign(box(lhs.clone(), rhs)) } } } diff --git a/src/librustc_mir/util/patch.rs b/src/librustc_mir/util/patch.rs index eb457dacf8467982a39222e1330580d982ac024f..2ea9924af7f28d427ccb150392262f8ce2032056 100644 --- a/src/librustc_mir/util/patch.rs +++ b/src/librustc_mir/util/patch.rs @@ -120,7 +120,7 @@ pub fn add_statement(&mut self, loc: Location, stmt: StatementKind<'tcx>) { } pub fn add_assign(&mut self, loc: Location, place: Place<'tcx>, rv: Rvalue<'tcx>) { - self.add_statement(loc, StatementKind::Assign(place, box rv)); + self.add_statement(loc, StatementKind::Assign(box(place, rv))); } pub fn make_nop(&mut self, loc: Location) {