about summary refs log tree commit diff
path: root/compiler/rustc_mir_transform
diff options
context:
space:
mode:
authorouz-a <oguz.agcayazi@gmail.com>2022-04-05 10:08:32 +0300
committerouz-a <oguz.agcayazi@gmail.com>2022-04-05 10:08:32 +0300
commit72070d8103ee2085129075852d318c91e0fcd292 (patch)
treee97140290bba7cb726437844b3be09378be00dd7 /compiler/rustc_mir_transform
parent904d6c8662a46e36fe95275621e82df2aa6b0c36 (diff)
downloadrust-72070d8103ee2085129075852d318c91e0fcd292.tar.gz
rust-72070d8103ee2085129075852d318c91e0fcd292.zip
remove region check
Diffstat (limited to 'compiler/rustc_mir_transform')
-rw-r--r--compiler/rustc_mir_transform/src/deref_separator.rs20
1 files changed, 11 insertions, 9 deletions
diff --git a/compiler/rustc_mir_transform/src/deref_separator.rs b/compiler/rustc_mir_transform/src/deref_separator.rs
index 17e58a3bb89..e62153fd92e 100644
--- a/compiler/rustc_mir_transform/src/deref_separator.rs
+++ b/compiler/rustc_mir_transform/src/deref_separator.rs
@@ -13,21 +13,18 @@ pub fn deref_finder<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
             match stmt.kind {
                 StatementKind::Assign(box (og_place, Rvalue::Ref(region, borrow_knd, place))) => {
                     for (idx, (p_ref, p_elem)) in place.iter_projections().enumerate() {
-                        if p_elem == ProjectionElem::Deref
-                            && !p_ref.projection.is_empty()
-                            && region.is_erased()
-                        {
-                            // The type that we are derefing
+                        if p_elem == ProjectionElem::Deref && !p_ref.projection.is_empty() {
+                            // The type that we are derefing.
                             let ty = p_ref.ty(local_decl, tcx).ty;
                             let temp = patch.new_temp(ty, stmt.source_info.span);
 
                             // Because we are assigning this right before original statement
-                            // we are using index i of statement
+                            // we are using index i of statement.
                             let loc = Location { block: block, statement_index: i };
                             patch.add_statement(loc, StatementKind::StorageLive(temp));
 
                             // We are adding current p_ref's projections to our
-                            // temp value
+                            // temp value.
                             let deref_place =
                                 Place::from(p_ref.local).project_deeper(p_ref.projection, tcx);
                             patch.add_assign(
@@ -37,7 +34,7 @@ pub fn deref_finder<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
                             );
 
                             // We are creating a place by using our temp value's location
-                            // and copying derefed values which we need to create new statement
+                            // and copying derefed values which we need to create new statement.
                             let temp_place =
                                 Place::from(temp).project_deeper(&place.projection[idx..], tcx);
                             let new_stmt = Statement {
@@ -48,12 +45,17 @@ pub fn deref_finder<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
                                 ))),
                             };
 
-                            // Replace current statement with newly created one
+                            // Replace current statement with newly created one.
                             *stmt = new_stmt;
 
                             // Since our job with the temp is done it should be gone
                             let loc = Location { block: block, statement_index: statement_len };
                             patch.add_statement(loc, StatementKind::StorageDead(temp));
+
+                            // As all projections are off the base projection, if there are
+                            // multiple derefs in the middle of projection, it might cause
+                            // unsoundness, to not let that happen we break the loop.
+                            break;
                         }
                     }
                 }