X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Flibrustc_mir%2Fborrow_check%2Ferror_reporting.rs;h=1fbedc49ecf3f62c09493555250ffddb36519b45;hb=e9c41148c0c834d13d6f45bfd99c8f23781c5d31;hp=251d4b727c7544b35427d1b81e5e3e8db6bfd809;hpb=fba38ac27e2ade309f4c2504a6d6cd3556972a28;p=rust.git diff --git a/src/librustc_mir/borrow_check/error_reporting.rs b/src/librustc_mir/borrow_check/error_reporting.rs index 251d4b727c7..1fbedc49ecf 100644 --- a/src/librustc_mir/borrow_check/error_reporting.rs +++ b/src/librustc_mir/borrow_check/error_reporting.rs @@ -152,7 +152,7 @@ fn append_place_to_string( match place { PlaceRef { base: PlaceBase::Local(local), - projection: None, + projection: [], } => { self.append_local_to_string(*local, buf)?; } @@ -162,7 +162,7 @@ fn append_place_to_string( kind: StaticKind::Promoted(..), .. }), - projection: None, + projection: [], } => { buf.push_str("promoted"); } @@ -173,15 +173,17 @@ fn append_place_to_string( def_id, .. }), - projection: None, + projection: [], } => { buf.push_str(&self.infcx.tcx.item_name(*def_id).to_string()); } PlaceRef { base, - projection: Some(ref proj), + projection: [.., elem], } => { - match proj.elem { + let proj_base = &place.projection[..place.projection.len() - 1]; + + match elem { ProjectionElem::Deref => { let upvar_field_projection = self.is_upvar_field_projection(place); @@ -199,20 +201,20 @@ fn append_place_to_string( self.append_place_to_string( PlaceRef { base, - projection: &proj.base, + projection: proj_base, }, buf, autoderef, &including_downcast, )?; } else { - match (&proj.base, base) { - (None, PlaceBase::Local(local)) => { + match (proj_base, base) { + ([], PlaceBase::Local(local)) => { if self.body.local_decls[*local].is_ref_for_guard() { self.append_place_to_string( PlaceRef { base, - projection: &proj.base, + projection: proj_base, }, buf, autoderef, @@ -224,7 +226,7 @@ fn append_place_to_string( self.append_place_to_string( PlaceRef { base, - projection: &proj.base, + projection: proj_base, }, buf, autoderef, @@ -238,7 +240,7 @@ fn append_place_to_string( self.append_place_to_string( PlaceRef { base, - projection: &proj.base, + projection: proj_base, }, buf, autoderef, @@ -253,7 +255,7 @@ fn append_place_to_string( self.append_place_to_string( PlaceRef { base, - projection: &proj.base, + projection: proj_base, }, buf, autoderef, @@ -275,12 +277,12 @@ fn append_place_to_string( } else { let field_name = self.describe_field(PlaceRef { base, - projection: &proj.base, - }, field); + projection: proj_base, + }, *field); self.append_place_to_string( PlaceRef { base, - projection: &proj.base, + projection: proj_base, }, buf, autoderef, @@ -295,14 +297,14 @@ fn append_place_to_string( self.append_place_to_string( PlaceRef { base, - projection: &proj.base, + projection: proj_base, }, buf, autoderef, &including_downcast, )?; buf.push_str("["); - if self.append_local_to_string(index, buf).is_err() { + if self.append_local_to_string(*index, buf).is_err() { buf.push_str("_"); } buf.push_str("]"); @@ -315,7 +317,7 @@ fn append_place_to_string( self.append_place_to_string( PlaceRef { base, - projection: &proj.base, + projection: proj_base, }, buf, autoderef, @@ -336,7 +338,7 @@ fn append_local_to_string(&self, local_index: Local, buf: &mut String) -> Result let local = &self.body.local_decls[local_index]; match local.name { Some(name) if !local.from_compiler_desugaring() => { - buf.push_str(name.as_str().get()); + buf.push_str(&name.as_str()); Ok(()) } _ => Err(()), @@ -349,28 +351,32 @@ fn describe_field(&self, place: PlaceRef<'cx, 'tcx>, field: Field) -> String { match place { PlaceRef { base: PlaceBase::Local(local), - projection: None, + projection: [], } => { let local = &self.body.local_decls[*local]; self.describe_field_from_ty(&local.ty, field, None) } PlaceRef { base: PlaceBase::Static(static_), - projection: None, + projection: [], } => self.describe_field_from_ty(&static_.ty, field, None), PlaceRef { base, - projection: Some(proj), - } => match proj.elem { - ProjectionElem::Deref => self.describe_field(PlaceRef { - base, - projection: &proj.base, - }, field), + projection: [.., elem], + } => match elem { + ProjectionElem::Deref => { + let proj_base = &place.projection[..place.projection.len() - 1]; + + self.describe_field(PlaceRef { + base, + projection: proj_base, + }, field) + } ProjectionElem::Downcast(_, variant_index) => { let base_ty = Place::ty_from(place.base, place.projection, self.body, self.infcx.tcx).ty; - self.describe_field_from_ty(&base_ty, field, Some(variant_index)) + self.describe_field_from_ty(&base_ty, field, Some(*variant_index)) } ProjectionElem::Field(_, field_type) => { self.describe_field_from_ty(&field_type, field, None) @@ -378,9 +384,11 @@ fn describe_field(&self, place: PlaceRef<'cx, 'tcx>, field: Field) -> String { ProjectionElem::Index(..) | ProjectionElem::ConstantIndex { .. } | ProjectionElem::Subslice { .. } => { + let proj_base = &place.projection[..place.projection.len() - 1]; + self.describe_field(PlaceRef { base, - projection: &proj.base, + projection: proj_base, }, field) } }, @@ -445,7 +453,7 @@ pub fn is_place_thread_local(&self, place_ref: PlaceRef<'cx, 'tcx>) -> bool { def_id, .. }), - projection: None, + projection: [], } = place_ref { let attrs = self.infcx.tcx.get_attrs(*def_id); let is_thread_local = attrs.iter().any(|attr| attr.check_name(sym::thread_local)); @@ -830,7 +838,7 @@ pub(super) fn borrow_spans(&self, use_span: Span, location: Location) -> UseSpan Some(&Statement { kind: StatementKind::Assign(Place { base: PlaceBase::Local(local), - projection: None, + projection: box [], }, _), .. }) => local,