Rollup merge of #81072 - RalfJung:place-ref-ty, r=oli-obk

PlaceRef::ty: use method call syntax
This commit is contained in:
Jonas Schievink 2021-01-23 20:15:59 +01:00 committed by GitHub
commit 3382771dfd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 10 additions and 8 deletions

View File

@ -119,7 +119,7 @@ fn process_place(
) )
); );
if is_consume { if is_consume {
let base_ty = mir::PlaceRef::ty(&place_base, self.fx.mir, cx.tcx()); let base_ty = place_base.ty(self.fx.mir, cx.tcx());
let base_ty = self.fx.monomorphize(base_ty); let base_ty = self.fx.monomorphize(base_ty);
// ZSTs don't require any actual memory access. // ZSTs don't require any actual memory access.

View File

@ -506,7 +506,7 @@ pub fn codegen_place(
pub fn monomorphized_place_ty(&self, place_ref: mir::PlaceRef<'tcx>) -> Ty<'tcx> { pub fn monomorphized_place_ty(&self, place_ref: mir::PlaceRef<'tcx>) -> Ty<'tcx> {
let tcx = self.cx.tcx(); let tcx = self.cx.tcx();
let place_ty = mir::PlaceRef::ty(&place_ref, self.mir, tcx); let place_ty = place_ref.ty(self.mir, tcx);
self.monomorphize(place_ty.ty) self.monomorphize(place_ty.ty)
} }
} }

View File

@ -289,7 +289,7 @@ pub(in crate::borrow_check) fn report_use_of_moved_or_uninitialized(
); );
} }
let ty = PlaceRef::ty(&used_place, self.body, self.infcx.tcx).ty; let ty = used_place.ty(self.body, self.infcx.tcx).ty;
let needs_note = match ty.kind() { let needs_note = match ty.kind() {
ty::Closure(id, _) => { ty::Closure(id, _) => {
let tables = self.infcx.tcx.typeck(id.expect_local()); let tables = self.infcx.tcx.typeck(id.expect_local());
@ -728,6 +728,8 @@ pub(in crate::borrow_check) fn describe_place_for_conflicting_borrow(
// Define a small closure that we can use to check if the type of a place // Define a small closure that we can use to check if the type of a place
// is a union. // is a union.
let union_ty = |place_base| { let union_ty = |place_base| {
// Need to use fn call syntax `PlaceRef::ty` to determine the type of `place_base`;
// using a type annotation in the closure argument instead leads to a lifetime error.
let ty = PlaceRef::ty(&place_base, self.body, self.infcx.tcx).ty; let ty = PlaceRef::ty(&place_base, self.body, self.infcx.tcx).ty;
ty.ty_adt_def().filter(|adt| adt.is_union()).map(|_| ty) ty.ty_adt_def().filter(|adt| adt.is_union()).map(|_| ty)
}; };

View File

@ -1743,7 +1743,7 @@ fn check_if_path_or_subpath_is_moved(
if let Some((place_base, ProjectionElem::Subslice { from, to, from_end: false })) = if let Some((place_base, ProjectionElem::Subslice { from, to, from_end: false })) =
place_span.0.last_projection() place_span.0.last_projection()
{ {
let place_ty = PlaceRef::ty(&place_base, self.body(), self.infcx.tcx); let place_ty = place_base.ty(self.body(), self.infcx.tcx);
if let ty::Array(..) = place_ty.ty.kind() { if let ty::Array(..) = place_ty.ty.kind() {
self.check_if_subslice_element_is_moved( self.check_if_subslice_element_is_moved(
location, location,
@ -1854,7 +1854,7 @@ fn check_if_assigned_path_is_moved(
// assigning to `P.f` requires `P` itself // assigning to `P.f` requires `P` itself
// be already initialized // be already initialized
let tcx = self.infcx.tcx; let tcx = self.infcx.tcx;
let base_ty = PlaceRef::ty(&place_base, self.body(), tcx).ty; let base_ty = place_base.ty(self.body(), tcx).ty;
match base_ty.kind() { match base_ty.kind() {
ty::Adt(def, _) if def.has_dtor(tcx) => { ty::Adt(def, _) if def.has_dtor(tcx) => {
self.check_if_path_or_subpath_is_moved( self.check_if_path_or_subpath_is_moved(
@ -1951,7 +1951,7 @@ fn check_parent_of_field<'cx, 'tcx>(
// no move out from an earlier location) then this is an attempt at initialization // no move out from an earlier location) then this is an attempt at initialization
// of the union - we should error in that case. // of the union - we should error in that case.
let tcx = this.infcx.tcx; let tcx = this.infcx.tcx;
if let ty::Adt(def, _) = PlaceRef::ty(&base, this.body(), tcx).ty.kind() { if let ty::Adt(def, _) = base.ty(this.body(), tcx).ty.kind() {
if def.is_union() { if def.is_union() {
if this.move_data.path_map[mpi].iter().any(|moi| { if this.move_data.path_map[mpi].iter().any(|moi| {
this.move_data.moves[*moi].source.is_predecessor_of(location, this.body) this.move_data.moves[*moi].source.is_predecessor_of(location, this.body)
@ -2173,7 +2173,7 @@ fn is_mutable(
Some((place_base, elem)) => { Some((place_base, elem)) => {
match elem { match elem {
ProjectionElem::Deref => { ProjectionElem::Deref => {
let base_ty = PlaceRef::ty(&place_base, self.body(), self.infcx.tcx).ty; let base_ty = place_base.ty(self.body(), self.infcx.tcx).ty;
// Check the kind of deref to decide // Check the kind of deref to decide
match base_ty.kind() { match base_ty.kind() {

View File

@ -117,7 +117,7 @@ fn next(&mut self) -> Option<Self::Item> {
// derefs, except we stop at the deref of a shared // derefs, except we stop at the deref of a shared
// reference. // reference.
let ty = PlaceRef::ty(&cursor_base, self.body, self.tcx).ty; let ty = cursor_base.ty(self.body, self.tcx).ty;
match ty.kind() { match ty.kind() {
ty::RawPtr(_) | ty::Ref(_ /*rgn*/, _ /*ty*/, hir::Mutability::Not) => { ty::RawPtr(_) | ty::Ref(_ /*rgn*/, _ /*ty*/, hir::Mutability::Not) => {
// don't continue traversing over derefs of raw pointers or shared // don't continue traversing over derefs of raw pointers or shared