about summary refs log tree commit diff
diff options
context:
space:
mode:
authorSantiago Pastorino <spastorino@gmail.com>2019-07-19 20:42:58 +0200
committerSantiago Pastorino <spastorino@gmail.com>2019-07-20 05:08:39 +0200
commit95e727a5c3799f3eaf6ead0b203087cf30cc7206 (patch)
tree4e58a530c9a9d7d21ddcaba1c3788d341cbfe2bb
parent34e3b7076c216413f39bf28bfea76f9a72b96cbb (diff)
downloadrust-95e727a5c3799f3eaf6ead0b203087cf30cc7206.tar.gz
rust-95e727a5c3799f3eaf6ead0b203087cf30cc7206.zip
Avoid cloning Place in check_access_permissions
-rw-r--r--src/librustc_mir/borrow_check/mod.rs12
-rw-r--r--src/librustc_mir/borrow_check/mutability_errors.rs52
2 files changed, 36 insertions, 28 deletions
diff --git a/src/librustc_mir/borrow_check/mod.rs b/src/librustc_mir/borrow_check/mod.rs
index b159bf4dd04..cfc7e77f4e5 100644
--- a/src/librustc_mir/borrow_check/mod.rs
+++ b/src/librustc_mir/borrow_check/mod.rs
@@ -1996,9 +1996,9 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
                         self.report_mutability_error(
                             place,
                             span,
-                            &Place {
-                                base: _place_err.0.clone(),
-                                projection: _place_err.1.clone(),
+                            PlaceRef {
+                                base: _place_err.0,
+                                projection: _place_err.1,
                             },
                             error_access,
                             location,
@@ -2033,9 +2033,9 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
             self.report_mutability_error(
                 place,
                 span,
-                &Place {
-                    base: the_place_err.0.clone(),
-                    projection: the_place_err.1.clone(),
+                PlaceRef {
+                    base: the_place_err.0,
+                    projection: the_place_err.1,
                 },
                 error_access,
                 location,
diff --git a/src/librustc_mir/borrow_check/mutability_errors.rs b/src/librustc_mir/borrow_check/mutability_errors.rs
index cc9a31db98b..caaf344f781 100644
--- a/src/librustc_mir/borrow_check/mutability_errors.rs
+++ b/src/librustc_mir/borrow_check/mutability_errors.rs
@@ -2,7 +2,9 @@ use core::unicode::property::Pattern_White_Space;
 use rustc::hir;
 use rustc::hir::Node;
 use rustc::mir::{self, BindingForm, ClearCrossCrate, Local, Location, Body};
-use rustc::mir::{Mutability, Place, PlaceBase, Projection, ProjectionElem, Static, StaticKind};
+use rustc::mir::{
+    Mutability, Place, PlaceRef, PlaceBase, Projection, ProjectionElem, Static, StaticKind
+};
 use rustc::ty::{self, Ty, TyCtxt};
 use rustc_data_structures::indexed_vec::Idx;
 use syntax_pos::Span;
@@ -25,7 +27,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
         &mut self,
         access_place: &Place<'tcx>,
         span: Span,
-        the_place_err: &Place<'tcx>,
+        the_place_err: PlaceRef<'cx, 'tcx>,
         error_access: AccessKind,
         location: Location,
     ) {
@@ -44,7 +46,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
         debug!("report_mutability_error: access_place_desc={:?}", access_place_desc);
 
         match the_place_err {
-            Place {
+            PlaceRef {
                 base: PlaceBase::Local(local),
                 projection: None,
             } => {
@@ -62,7 +64,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
                 }
             }
 
-            Place {
+            PlaceRef {
                 base: _,
                 projection:
                     Some(box Projection {
@@ -83,7 +85,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
                 }
             }
 
-            Place {
+            PlaceRef {
                 base: _,
                 projection:
                     Some(box Projection {
@@ -91,13 +93,19 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
                         elem: ProjectionElem::Deref,
                     }),
             } => {
-                if the_place_err.base == PlaceBase::Local(Local::new(1)) &&
+                if the_place_err.base == &PlaceBase::Local(Local::new(1)) &&
                     base.is_none() &&
                     !self.upvars.is_empty() {
                     item_msg = format!("`{}`", access_place_desc.unwrap());
                     debug_assert!(self.body.local_decls[Local::new(1)].ty.is_region_ptr());
                     debug_assert!(is_closure_or_generator(
-                        the_place_err.ty(self.body, self.infcx.tcx).ty
+                        Place::ty_from(
+                            the_place_err.base,
+                            the_place_err.projection,
+                            self.body,
+                            self.infcx.tcx
+                        )
+                        .ty
                     ));
 
                     reason =
@@ -138,7 +146,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
                 }
             }
 
-            Place {
+            PlaceRef {
                 base:
                     PlaceBase::Static(box Static {
                         kind: StaticKind::Promoted(_),
@@ -147,7 +155,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
                 projection: None,
             } => unreachable!(),
 
-            Place {
+            PlaceRef {
                 base:
                     PlaceBase::Static(box Static {
                         kind: StaticKind::Static(def_id),
@@ -168,7 +176,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
                 }
             }
 
-            Place {
+            PlaceRef {
                 base: _,
                 projection:
                     Some(box Projection {
@@ -176,7 +184,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
                         elem: ProjectionElem::Index(_),
                     }),
             }
-            | Place {
+            | PlaceRef {
                 base: _,
                 projection:
                     Some(box Projection {
@@ -184,14 +192,14 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
                         elem: ProjectionElem::ConstantIndex { .. },
                     }),
             }
-            | Place {
+            | PlaceRef {
                 base: _,
                 projection: Some(box Projection {
                     base: _,
                     elem: ProjectionElem::Subslice { .. },
                 }),
             }
-            | Place {
+            | PlaceRef {
                 base: _,
                 projection: Some(box Projection {
                     base: _,
@@ -252,7 +260,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
             // something like `*((*_1).0`. The local that we get will be a reference to the
             // struct we've got a field access of (it must be a reference since there's a deref
             // after the field access).
-            Place {
+            PlaceRef {
                 base,
                 projection: Some(box Projection {
                     base: Some(box Projection {
@@ -282,7 +290,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
             },
 
             // Suggest removing a `&mut` from the use of a mutable reference.
-            Place {
+            PlaceRef {
                 base: PlaceBase::Local(local),
                 projection: None,
             } if {
@@ -318,7 +326,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
 
             // We want to suggest users use `let mut` for local (user
             // variable) mutations...
-            Place {
+            PlaceRef {
                 base: PlaceBase::Local(local),
                 projection: None,
             } if self.body.local_decls[*local].can_be_made_mutable() => {
@@ -339,7 +347,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
             }
 
             // Also suggest adding mut for upvars
-            Place {
+            PlaceRef {
                 base,
                 projection: Some(box Projection {
                     base: proj_base,
@@ -375,7 +383,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
             // complete hack to approximate old AST-borrowck
             // diagnostic: if the span starts with a mutable borrow of
             // a local variable, then just suggest the user remove it.
-            Place {
+            PlaceRef {
                 base: PlaceBase::Local(_),
                 projection: None,
             } if {
@@ -390,7 +398,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
                 err.span_label(span, "try removing `&mut` here");
             }
 
-            Place {
+            PlaceRef {
                 base: PlaceBase::Local(local),
                 projection: Some(box Projection {
                     base: None,
@@ -417,7 +425,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
             //
             // FIXME: can this case be generalized to work for an
             // arbitrary base for the projection?
-            Place {
+            PlaceRef {
                 base: PlaceBase::Local(local),
                 projection: Some(box Projection {
                     base: None,
@@ -500,7 +508,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
                 }
             }
 
-            Place {
+            PlaceRef {
                 base,
                 projection: Some(box Projection {
                     base: None,
@@ -517,7 +525,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
                 );
             }
 
-            Place {
+            PlaceRef {
                 base: _,
                 projection: Some(box Projection {
                     base: _,