diff options
Diffstat (limited to 'src/librustc')
| -rw-r--r-- | src/librustc/ich/impls_mir.rs | 57 | ||||
| -rw-r--r-- | src/librustc/mir/mod.rs | 14 | ||||
| -rw-r--r-- | src/librustc/mir/visit.rs | 7 |
3 files changed, 28 insertions, 50 deletions
diff --git a/src/librustc/ich/impls_mir.rs b/src/librustc/ich/impls_mir.rs index d98bb82aaba..c2987226631 100644 --- a/src/librustc/ich/impls_mir.rs +++ b/src/librustc/ich/impls_mir.rs @@ -193,51 +193,18 @@ for mir::TerminatorKind<'gcx> { impl_stable_hash_for!(struct mir::Statement<'tcx> { source_info, kind }); -impl<'a, 'gcx> HashStable<StableHashingContext<'a>> -for mir::StatementKind<'gcx> { - fn hash_stable<W: StableHasherResult>(&self, - hcx: &mut StableHashingContext<'a>, - hasher: &mut StableHasher<W>) { - mem::discriminant(self).hash_stable(hcx, hasher); - - match *self { - mir::StatementKind::Assign(ref place, ref rvalue) => { - place.hash_stable(hcx, hasher); - rvalue.hash_stable(hcx, hasher); - } - mir::StatementKind::FakeRead(ref cause, ref place) => { - cause.hash_stable(hcx, hasher); - place.hash_stable(hcx, hasher); - } - mir::StatementKind::SetDiscriminant { ref place, variant_index } => { - place.hash_stable(hcx, hasher); - variant_index.hash_stable(hcx, hasher); - } - mir::StatementKind::StorageLive(ref place) | - mir::StatementKind::StorageDead(ref place) => { - place.hash_stable(hcx, hasher); - } - mir::StatementKind::EscapeToRaw(ref place) => { - place.hash_stable(hcx, hasher); - } - mir::StatementKind::Retag { fn_entry, ref place } => { - fn_entry.hash_stable(hcx, hasher); - place.hash_stable(hcx, hasher); - } - mir::StatementKind::AscribeUserType(ref place, ref variance, ref c_ty) => { - place.hash_stable(hcx, hasher); - variance.hash_stable(hcx, hasher); - c_ty.hash_stable(hcx, hasher); - } - mir::StatementKind::Nop => {} - mir::StatementKind::InlineAsm { ref asm, ref outputs, ref inputs } => { - asm.hash_stable(hcx, hasher); - outputs.hash_stable(hcx, hasher); - inputs.hash_stable(hcx, hasher); - } - } - } -} +impl_stable_hash_for!(impl<'gcx> for enum mir::StatementKind<'gcx> [ mir::StatementKind ] { + Assign(place, rvalue), + FakeRead(cause, place), + SetDiscriminant { place, variant_index }, + StorageLive(place), + StorageDead(place), + EscapeToRaw(place), + Retag { fn_entry, two_phase, place }, + AscribeUserType(place, variance, c_ty), + Nop, + InlineAsm { asm, outputs, inputs }, +}); impl_stable_hash_for!(enum mir::FakeReadCause { ForMatchGuard, ForMatchedPlace, ForLet }); diff --git a/src/librustc/mir/mod.rs b/src/librustc/mir/mod.rs index 368f83eb611..8c4a40c00c3 100644 --- a/src/librustc/mir/mod.rs +++ b/src/librustc/mir/mod.rs @@ -1778,6 +1778,10 @@ pub enum StatementKind<'tcx> { /// `fn_entry` indicates whether this is the initial retag that happens in the /// function prolog. fn_entry: bool, + /// `two_phase` indicates whether this is just the reservation action of + /// a two-phase borrow. + two_phase: bool, + /// The place to retag place: Place<'tcx>, }, @@ -1841,8 +1845,12 @@ impl<'tcx> Debug for Statement<'tcx> { match self.kind { Assign(ref place, ref rv) => write!(fmt, "{:?} = {:?}", place, rv), FakeRead(ref cause, ref place) => write!(fmt, "FakeRead({:?}, {:?})", cause, place), - Retag { fn_entry, ref place } => - write!(fmt, "Retag({}{:?})", if fn_entry { "[fn entry] " } else { "" }, place), + Retag { fn_entry, two_phase, ref place } => + write!(fmt, "Retag({}{}{:?})", + if fn_entry { "[fn entry] " } else { "" }, + if two_phase { "[2phase] " } else { "" }, + place, + ), EscapeToRaw(ref place) => write!(fmt, "EscapeToRaw({:?})", place), StorageLive(ref place) => write!(fmt, "StorageLive({:?})", place), StorageDead(ref place) => write!(fmt, "StorageDead({:?})", place), @@ -3019,7 +3027,7 @@ EnumTypeFoldableImpl! { (StatementKind::StorageLive)(a), (StatementKind::StorageDead)(a), (StatementKind::InlineAsm) { asm, outputs, inputs }, - (StatementKind::Retag) { fn_entry, place }, + (StatementKind::Retag) { fn_entry, two_phase, place }, (StatementKind::EscapeToRaw)(place), (StatementKind::AscribeUserType)(a, v, b), (StatementKind::Nop), diff --git a/src/librustc/mir/visit.rs b/src/librustc/mir/visit.rs index 0c9b06a8d8c..d40d85a1937 100644 --- a/src/librustc/mir/visit.rs +++ b/src/librustc/mir/visit.rs @@ -154,9 +154,10 @@ macro_rules! make_mir_visitor { fn visit_retag(&mut self, fn_entry: & $($mutability)* bool, + two_phase: & $($mutability)* bool, place: & $($mutability)* Place<'tcx>, location: Location) { - self.super_retag(fn_entry, place, location); + self.super_retag(fn_entry, two_phase, place, location); } fn visit_place(&mut self, @@ -417,8 +418,9 @@ macro_rules! make_mir_visitor { } } StatementKind::Retag { ref $($mutability)* fn_entry, + ref $($mutability)* two_phase, ref $($mutability)* place } => { - self.visit_retag(fn_entry, place, location); + self.visit_retag(fn_entry, two_phase, place, location); } StatementKind::AscribeUserType( ref $($mutability)* place, @@ -724,6 +726,7 @@ macro_rules! make_mir_visitor { fn super_retag(&mut self, _fn_entry: & $($mutability)* bool, + _two_phase: & $($mutability)* bool, place: & $($mutability)* Place<'tcx>, location: Location) { self.visit_place( |
