Rename adjustment::PointerCast and variants using it to PointerCoercion

It makes it sound like the `ExprKind` and `Rvalue` are supposed to represent all pointer related
casts, when in reality their just used to share a some enum variants. Make it clear there these
are only coercion to make it clear why only some pointer related "casts" are in the enum.
This commit is contained in:
Nilstrieb 2023-07-05 20:07:03 +02:00
parent fd68a6ded9
commit 2beabbbf6f
85 changed files with 214 additions and 185 deletions

View File

@ -9,7 +9,7 @@ use rustc_middle::mir::{
Body, CallSource, CastKind, ConstraintCategory, FakeReadCause, Local, LocalInfo, Location,
Operand, Place, Rvalue, Statement, StatementKind, TerminatorKind,
};
use rustc_middle::ty::adjustment::PointerCast;
use rustc_middle::ty::adjustment::PointerCoercion;
use rustc_middle::ty::{self, RegionVid, TyCtxt};
use rustc_span::symbol::{kw, Symbol};
use rustc_span::{sym, DesugaringKind, Span};
@ -584,7 +584,11 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
},
// If we see an unsized cast, then if it is our data we should check
// whether it is being cast to a trait object.
Rvalue::Cast(CastKind::Pointer(PointerCast::Unsize), operand, ty) => {
Rvalue::Cast(
CastKind::PointerCoercion(PointerCoercion::Unsize),
operand,
ty,
) => {
match operand {
Operand::Copy(place) | Operand::Move(place) => {
if let Some(from) = place.as_local() {

View File

@ -28,7 +28,7 @@ use rustc_middle::mir::AssertKind;
use rustc_middle::mir::*;
use rustc_middle::traits::query::NoSolution;
use rustc_middle::traits::ObligationCause;
use rustc_middle::ty::adjustment::PointerCast;
use rustc_middle::ty::adjustment::PointerCoercion;
use rustc_middle::ty::cast::CastTy;
use rustc_middle::ty::subst::{SubstsRef, UserSubsts};
use rustc_middle::ty::visit::TypeVisitableExt;
@ -1908,7 +1908,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
self.check_operand(op, location);
match cast_kind {
CastKind::Pointer(PointerCast::ReifyFnPointer) => {
CastKind::PointerCoercion(PointerCoercion::ReifyFnPointer) => {
let fn_sig = op.ty(body, tcx).fn_sig(tcx);
// The type that we see in the fcx is like
@ -1937,7 +1937,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
}
}
CastKind::Pointer(PointerCast::ClosureFnPointer(unsafety)) => {
CastKind::PointerCoercion(PointerCoercion::ClosureFnPointer(unsafety)) => {
let sig = match op.ty(body, tcx).kind() {
ty::Closure(_, substs) => substs.as_closure().sig(),
_ => bug!(),
@ -1962,7 +1962,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
}
}
CastKind::Pointer(PointerCast::UnsafeFnPointer) => {
CastKind::PointerCoercion(PointerCoercion::UnsafeFnPointer) => {
let fn_sig = op.ty(body, tcx).fn_sig(tcx);
// The type that we see in the fcx is like
@ -1991,7 +1991,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
}
}
CastKind::Pointer(PointerCast::Unsize) => {
CastKind::PointerCoercion(PointerCoercion::Unsize) => {
let &ty = ty;
let trait_ref = ty::TraitRef::from_lang_item(
tcx,
@ -2038,7 +2038,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
);
}
CastKind::Pointer(PointerCast::MutToConstPointer) => {
CastKind::PointerCoercion(PointerCoercion::MutToConstPointer) => {
let ty::RawPtr(ty::TypeAndMut {
ty: ty_from,
mutbl: hir::Mutability::Mut,
@ -2080,7 +2080,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
}
}
CastKind::Pointer(PointerCast::ArrayToPointer) => {
CastKind::PointerCoercion(PointerCoercion::ArrayToPointer) => {
let ty_from = op.ty(body, tcx);
let opt_ty_elem_mut = match ty_from.kind() {

View File

@ -2,7 +2,7 @@
use rustc_ast::InlineAsmOptions;
use rustc_index::IndexVec;
use rustc_middle::ty::adjustment::PointerCast;
use rustc_middle::ty::adjustment::PointerCoercion;
use rustc_middle::ty::layout::FnAbiOf;
use rustc_middle::ty::print::with_no_trimmed_paths;
@ -571,7 +571,7 @@ fn codegen_stmt<'tcx>(
lval.write_cvalue(fx, res);
}
Rvalue::Cast(
CastKind::Pointer(PointerCast::ReifyFnPointer),
CastKind::PointerCoercion(PointerCoercion::ReifyFnPointer),
ref operand,
to_ty,
) => {
@ -596,17 +596,17 @@ fn codegen_stmt<'tcx>(
}
}
Rvalue::Cast(
CastKind::Pointer(PointerCast::UnsafeFnPointer),
CastKind::PointerCoercion(PointerCoercion::UnsafeFnPointer),
ref operand,
to_ty,
)
| Rvalue::Cast(
CastKind::Pointer(PointerCast::MutToConstPointer),
CastKind::PointerCoercion(PointerCoercion::MutToConstPointer),
ref operand,
to_ty,
)
| Rvalue::Cast(
CastKind::Pointer(PointerCast::ArrayToPointer),
CastKind::PointerCoercion(PointerCoercion::ArrayToPointer),
ref operand,
to_ty,
) => {
@ -662,7 +662,7 @@ fn codegen_stmt<'tcx>(
}
}
Rvalue::Cast(
CastKind::Pointer(PointerCast::ClosureFnPointer(_)),
CastKind::PointerCoercion(PointerCoercion::ClosureFnPointer(_)),
ref operand,
_to_ty,
) => {
@ -684,7 +684,11 @@ fn codegen_stmt<'tcx>(
_ => bug!("{} cannot be cast to a fn ptr", operand.layout().ty),
}
}
Rvalue::Cast(CastKind::Pointer(PointerCast::Unsize), ref operand, _to_ty) => {
Rvalue::Cast(
CastKind::PointerCoercion(PointerCoercion::Unsize),
ref operand,
_to_ty,
) => {
let operand = codegen_operand(fx, operand);
crate::unsize::coerce_unsized_into(fx, operand, lval);
}

View File

@ -1,6 +1,6 @@
//! Codegen of the [`PointerCast::Unsize`] operation.
//! Codegen of the [`PointerCoercion::Unsize`] operation.
//!
//! [`PointerCast::Unsize`]: `rustc_middle::ty::adjustment::PointerCast::Unsize`
//! [`PointerCoercion::Unsize`]: `rustc_middle::ty::adjustment::PointerCoercion::Unsize`
use crate::prelude::*;

View File

@ -11,7 +11,7 @@ use rustc_middle::mir;
use rustc_middle::mir::Operand;
use rustc_middle::ty::cast::{CastTy, IntTy};
use rustc_middle::ty::layout::{HasTyCtxt, LayoutOf, TyAndLayout};
use rustc_middle::ty::{self, adjustment::PointerCast, Instance, Ty, TyCtxt};
use rustc_middle::ty::{self, adjustment::PointerCoercion, Instance, Ty, TyCtxt};
use rustc_session::config::OptLevel;
use rustc_span::source_map::{Span, DUMMY_SP};
use rustc_target::abi::{self, FIRST_VARIANT};
@ -32,7 +32,11 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
cg_operand.val.store(bx, dest);
}
mir::Rvalue::Cast(mir::CastKind::Pointer(PointerCast::Unsize), ref source, _) => {
mir::Rvalue::Cast(
mir::CastKind::PointerCoercion(PointerCoercion::Unsize),
ref source,
_,
) => {
// The destination necessarily contains a fat pointer, so if
// it's a scalar pair, it's a fat pointer or newtype thereof.
if bx.cx().is_backend_scalar_pair(dest.layout) {
@ -411,7 +415,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
let lladdr = bx.ptrtoint(llptr, llcast_ty);
OperandValue::Immediate(lladdr)
}
mir::CastKind::Pointer(PointerCast::ReifyFnPointer) => {
mir::CastKind::PointerCoercion(PointerCoercion::ReifyFnPointer) => {
match *operand.layout.ty.kind() {
ty::FnDef(def_id, substs) => {
let instance = ty::Instance::resolve_for_fn_ptr(
@ -427,7 +431,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
_ => bug!("{} cannot be reified to a fn ptr", operand.layout.ty),
}
}
mir::CastKind::Pointer(PointerCast::ClosureFnPointer(_)) => {
mir::CastKind::PointerCoercion(PointerCoercion::ClosureFnPointer(_)) => {
match *operand.layout.ty.kind() {
ty::Closure(def_id, substs) => {
let instance = Instance::resolve_closure(
@ -443,11 +447,11 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
_ => bug!("{} cannot be cast to a fn ptr", operand.layout.ty),
}
}
mir::CastKind::Pointer(PointerCast::UnsafeFnPointer) => {
mir::CastKind::PointerCoercion(PointerCoercion::UnsafeFnPointer) => {
// This is a no-op at the LLVM level.
operand.val
}
mir::CastKind::Pointer(PointerCast::Unsize) => {
mir::CastKind::PointerCoercion(PointerCoercion::Unsize) => {
assert!(bx.cx().is_backend_scalar_pair(cast));
let (lldata, llextra) = match operand.val {
OperandValue::Pair(lldata, llextra) => {
@ -470,7 +474,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
base::unsize_ptr(bx, lldata, operand.layout.ty, cast.ty, llextra);
OperandValue::Pair(lldata, llextra)
}
mir::CastKind::Pointer(PointerCast::MutToConstPointer)
mir::CastKind::PointerCoercion(PointerCoercion::MutToConstPointer)
| mir::CastKind::PtrToPtr
if bx.cx().is_backend_scalar_pair(operand.layout) =>
{
@ -504,8 +508,8 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
base::cast_to_dyn_star(bx, lldata, operand.layout, cast.ty, llextra);
OperandValue::Pair(lldata, llextra)
}
mir::CastKind::Pointer(
PointerCast::MutToConstPointer | PointerCast::ArrayToPointer,
mir::CastKind::PointerCoercion(
PointerCoercion::MutToConstPointer | PointerCoercion::ArrayToPointer,
)
| mir::CastKind::IntToInt
| mir::CastKind::FloatToInt

View File

@ -4,7 +4,7 @@ use rustc_apfloat::ieee::{Double, Single};
use rustc_apfloat::{Float, FloatConvert};
use rustc_middle::mir::interpret::{InterpResult, PointerArithmetic, Scalar};
use rustc_middle::mir::CastKind;
use rustc_middle::ty::adjustment::PointerCast;
use rustc_middle::ty::adjustment::PointerCoercion;
use rustc_middle::ty::layout::{IntegerExt, LayoutOf, TyAndLayout};
use rustc_middle::ty::{self, FloatTy, Ty, TypeAndMut};
use rustc_target::abi::Integer;
@ -24,51 +24,52 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
cast_ty: Ty<'tcx>,
dest: &PlaceTy<'tcx, M::Provenance>,
) -> InterpResult<'tcx> {
use rustc_middle::mir::CastKind::*;
// FIXME: In which cases should we trigger UB when the source is uninit?
match cast_kind {
Pointer(PointerCast::Unsize) => {
CastKind::PointerCoercion(PointerCoercion::Unsize) => {
let cast_ty = self.layout_of(cast_ty)?;
self.unsize_into(src, cast_ty, dest)?;
}
PointerExposeAddress => {
CastKind::PointerExposeAddress => {
let src = self.read_immediate(src)?;
let res = self.pointer_expose_address_cast(&src, cast_ty)?;
self.write_immediate(res, dest)?;
}
PointerFromExposedAddress => {
CastKind::PointerFromExposedAddress => {
let src = self.read_immediate(src)?;
let res = self.pointer_from_exposed_address_cast(&src, cast_ty)?;
self.write_immediate(res, dest)?;
}
IntToInt | IntToFloat => {
CastKind::IntToInt | CastKind::IntToFloat => {
let src = self.read_immediate(src)?;
let res = self.int_to_int_or_float(&src, cast_ty)?;
self.write_immediate(res, dest)?;
}
FloatToFloat | FloatToInt => {
CastKind::FloatToFloat | CastKind::FloatToInt => {
let src = self.read_immediate(src)?;
let res = self.float_to_float_or_int(&src, cast_ty)?;
self.write_immediate(res, dest)?;
}
FnPtrToPtr | PtrToPtr => {
CastKind::FnPtrToPtr | CastKind::PtrToPtr => {
let src = self.read_immediate(&src)?;
let res = self.ptr_to_ptr(&src, cast_ty)?;
self.write_immediate(res, dest)?;
}
Pointer(PointerCast::MutToConstPointer | PointerCast::ArrayToPointer) => {
CastKind::PointerCoercion(
PointerCoercion::MutToConstPointer | PointerCoercion::ArrayToPointer,
) => {
// These are NOPs, but can be wide pointers.
let v = self.read_immediate(src)?;
self.write_immediate(*v, dest)?;
}
Pointer(PointerCast::ReifyFnPointer) => {
CastKind::PointerCoercion(PointerCoercion::ReifyFnPointer) => {
// All reifications must be monomorphic, bail out otherwise.
ensure_monomorphic_enough(*self.tcx, src.layout.ty)?;
@ -90,7 +91,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
}
}
Pointer(PointerCast::UnsafeFnPointer) => {
CastKind::PointerCoercion(PointerCoercion::UnsafeFnPointer) => {
let src = self.read_immediate(src)?;
match cast_ty.kind() {
ty::FnPtr(_) => {
@ -101,7 +102,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
}
}
Pointer(PointerCast::ClosureFnPointer(_)) => {
CastKind::PointerCoercion(PointerCoercion::ClosureFnPointer(_)) => {
// All reifications must be monomorphic, bail out otherwise.
ensure_monomorphic_enough(*self.tcx, src.layout.ty)?;
@ -122,7 +123,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
}
}
DynStar => {
CastKind::DynStar => {
if let ty::Dynamic(data, _, ty::DynStar) = cast_ty.kind() {
// Initial cast from sized to dyn trait
let vtable = self.get_vtable_ptr(src.layout.ty, data.principal())?;
@ -136,7 +137,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
}
}
Transmute => {
CastKind::Transmute => {
assert!(src.layout.is_sized());
assert!(dest.layout.is_sized());
if src.layout.size != dest.layout.size {

View File

@ -9,7 +9,7 @@ use rustc_infer::traits::{ImplSource, Obligation, ObligationCause};
use rustc_middle::mir::visit::{MutatingUseContext, NonMutatingUseContext, PlaceContext, Visitor};
use rustc_middle::mir::*;
use rustc_middle::ty::subst::{GenericArgKind, InternalSubsts};
use rustc_middle::ty::{self, adjustment::PointerCast, Instance, InstanceDef, Ty, TyCtxt};
use rustc_middle::ty::{self, adjustment::PointerCoercion, Instance, InstanceDef, Ty, TyCtxt};
use rustc_middle::ty::{TraitRef, TypeVisitableExt};
use rustc_mir_dataflow::{self, Analysis};
use rustc_span::{sym, Span, Symbol};
@ -521,12 +521,12 @@ impl<'tcx> Visitor<'tcx> for Checker<'_, 'tcx> {
}
Rvalue::Cast(
CastKind::Pointer(
PointerCast::MutToConstPointer
| PointerCast::ArrayToPointer
| PointerCast::UnsafeFnPointer
| PointerCast::ClosureFnPointer(_)
| PointerCast::ReifyFnPointer,
CastKind::PointerCoercion(
PointerCoercion::MutToConstPointer
| PointerCoercion::ArrayToPointer
| PointerCoercion::UnsafeFnPointer
| PointerCoercion::ClosureFnPointer(_)
| PointerCoercion::ReifyFnPointer,
),
_,
_,
@ -534,7 +534,7 @@ impl<'tcx> Visitor<'tcx> for Checker<'_, 'tcx> {
// These are all okay; they only change the type, not the data.
}
Rvalue::Cast(CastKind::Pointer(PointerCast::Unsize), _, _) => {
Rvalue::Cast(CastKind::PointerCoercion(PointerCoercion::Unsize), _, _) => {
// Unsizing is implemented for CTFE.
}

View File

@ -650,7 +650,7 @@ impl<'a, 'tcx> Visitor<'tcx> for TypeChecker<'a, 'tcx> {
// FIXME: Add Checks for these
CastKind::PointerFromExposedAddress
| CastKind::PointerExposeAddress
| CastKind::Pointer(_) => {}
| CastKind::PointerCoercion(_) => {}
CastKind::IntToInt | CastKind::IntToFloat => {
let input_valid = op_ty.is_integral() || op_ty.is_char() || op_ty.is_bool();
let target_valid = target_type.is_numeric() || target_type.is_char();

View File

@ -47,7 +47,7 @@ use rustc_infer::infer::{Coercion, DefineOpaqueTypes, InferOk, InferResult};
use rustc_infer::traits::{Obligation, PredicateObligation};
use rustc_middle::lint::in_external_macro;
use rustc_middle::ty::adjustment::{
Adjust, Adjustment, AllowTwoPhase, AutoBorrow, AutoBorrowMutability, PointerCast,
Adjust, Adjustment, AllowTwoPhase, AutoBorrow, AutoBorrowMutability, PointerCoercion,
};
use rustc_middle::ty::error::TypeError;
use rustc_middle::ty::relate::RelateResult;
@ -592,7 +592,7 @@ impl<'f, 'tcx> Coerce<'f, 'tcx> {
};
let coerce_target = self.next_ty_var(origin);
let mut coercion = self.unify_and(coerce_target, target, |target| {
let unsize = Adjustment { kind: Adjust::Pointer(PointerCast::Unsize), target };
let unsize = Adjustment { kind: Adjust::Pointer(PointerCoercion::Unsize), target };
match reborrow {
None => vec![unsize],
Some((ref deref, ref autoref)) => vec![deref.clone(), autoref.clone(), unsize],
@ -849,7 +849,7 @@ impl<'f, 'tcx> Coerce<'f, 'tcx> {
a,
fn_ty_a,
b,
simple(Adjust::Pointer(PointerCast::UnsafeFnPointer)),
simple(Adjust::Pointer(PointerCoercion::UnsafeFnPointer)),
identity,
)
}
@ -893,16 +893,16 @@ impl<'f, 'tcx> Coerce<'f, 'tcx> {
|unsafe_ty| {
vec![
Adjustment {
kind: Adjust::Pointer(PointerCast::ReifyFnPointer),
kind: Adjust::Pointer(PointerCoercion::ReifyFnPointer),
target: a_fn_pointer,
},
Adjustment {
kind: Adjust::Pointer(PointerCast::UnsafeFnPointer),
kind: Adjust::Pointer(PointerCoercion::UnsafeFnPointer),
target: unsafe_ty,
},
]
},
simple(Adjust::Pointer(PointerCast::ReifyFnPointer)),
simple(Adjust::Pointer(PointerCoercion::ReifyFnPointer)),
)?;
obligations.extend(o2);
@ -952,7 +952,7 @@ impl<'f, 'tcx> Coerce<'f, 'tcx> {
self.unify_and(
pointer_ty,
b,
simple(Adjust::Pointer(PointerCast::ClosureFnPointer(unsafety))),
simple(Adjust::Pointer(PointerCoercion::ClosureFnPointer(unsafety))),
)
}
_ => self.unify_and(a, b, identity),
@ -987,7 +987,7 @@ impl<'f, 'tcx> Coerce<'f, 'tcx> {
]
})
} else if mt_a.mutbl != mutbl_b {
self.unify_and(a_unsafe, b, simple(Adjust::Pointer(PointerCast::MutToConstPointer)))
self.unify_and(a_unsafe, b, simple(Adjust::Pointer(PointerCoercion::MutToConstPointer)))
} else {
self.unify_and(a_unsafe, b, identity)
}
@ -1187,13 +1187,17 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
// Reify both sides and return the reified fn pointer type.
let fn_ptr = Ty::new_fn_ptr(self.tcx, sig);
let prev_adjustment = match prev_ty.kind() {
ty::Closure(..) => Adjust::Pointer(PointerCast::ClosureFnPointer(a_sig.unsafety())),
ty::FnDef(..) => Adjust::Pointer(PointerCast::ReifyFnPointer),
ty::Closure(..) => {
Adjust::Pointer(PointerCoercion::ClosureFnPointer(a_sig.unsafety()))
}
ty::FnDef(..) => Adjust::Pointer(PointerCoercion::ReifyFnPointer),
_ => unreachable!(),
};
let next_adjustment = match new_ty.kind() {
ty::Closure(..) => Adjust::Pointer(PointerCast::ClosureFnPointer(b_sig.unsafety())),
ty::FnDef(..) => Adjust::Pointer(PointerCast::ReifyFnPointer),
ty::Closure(..) => {
Adjust::Pointer(PointerCoercion::ClosureFnPointer(b_sig.unsafety()))
}
ty::FnDef(..) => Adjust::Pointer(PointerCoercion::ReifyFnPointer),
_ => unreachable!(),
};
for expr in exprs.iter().map(|e| e.as_coercion_site()) {

View File

@ -10,7 +10,7 @@ use rustc_hir_analysis::astconv::generics::{
use rustc_hir_analysis::astconv::{AstConv, CreateSubstsForGenericArgsCtxt, IsMethodCall};
use rustc_infer::infer::{self, DefineOpaqueTypes, InferOk};
use rustc_middle::traits::{ObligationCauseCode, UnifyReceiverContext};
use rustc_middle::ty::adjustment::{Adjust, Adjustment, PointerCast};
use rustc_middle::ty::adjustment::{Adjust, Adjustment, PointerCoercion};
use rustc_middle::ty::adjustment::{AllowTwoPhase, AutoBorrow, AutoBorrowMutability};
use rustc_middle::ty::fold::TypeFoldable;
use rustc_middle::ty::subst::{self, SubstsRef};
@ -212,8 +212,10 @@ impl<'a, 'tcx> ConfirmContext<'a, 'tcx> {
region,
ty::TypeAndMut { mutbl: mutbl.into(), ty: unsized_ty },
);
adjustments
.push(Adjustment { kind: Adjust::Pointer(PointerCast::Unsize), target });
adjustments.push(Adjustment {
kind: Adjust::Pointer(PointerCoercion::Unsize),
target,
});
}
}
Some(probe::AutorefOrPtrAdjustment::ToConstPtr) => {
@ -226,7 +228,7 @@ impl<'a, 'tcx> ConfirmContext<'a, 'tcx> {
};
adjustments.push(Adjustment {
kind: Adjust::Pointer(PointerCast::MutToConstPointer),
kind: Adjust::Pointer(PointerCoercion::MutToConstPointer),
target,
});
}

View File

@ -6,7 +6,7 @@ use rustc_hir as hir;
use rustc_hir_analysis::autoderef::Autoderef;
use rustc_infer::infer::type_variable::{TypeVariableOrigin, TypeVariableOriginKind};
use rustc_infer::infer::InferOk;
use rustc_middle::ty::adjustment::{Adjust, Adjustment, OverloadedDeref, PointerCast};
use rustc_middle::ty::adjustment::{Adjust, Adjustment, OverloadedDeref, PointerCoercion};
use rustc_middle::ty::adjustment::{AllowTwoPhase, AutoBorrow, AutoBorrowMutability};
use rustc_middle::ty::{self, Ty};
use rustc_span::symbol::{sym, Ident};
@ -173,7 +173,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
}
if unsize {
adjustments.push(Adjustment {
kind: Adjust::Pointer(PointerCast::Unsize),
kind: Adjust::Pointer(PointerCoercion::Unsize),
target: method.sig.inputs()[0],
});
}
@ -441,7 +441,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
if let [
..,
Adjustment { kind: Adjust::Borrow(AutoBorrow::Ref(..)), .. },
Adjustment { kind: Adjust::Pointer(PointerCast::Unsize), ref mut target },
Adjustment { kind: Adjust::Pointer(PointerCoercion::Unsize), ref mut target },
] = adjustments[..]
{
*target = method.sig.inputs()[0];

View File

@ -11,7 +11,7 @@ use rustc_hir::intravisit::{self, Visitor};
use rustc_infer::infer::error_reporting::TypeAnnotationNeeded::E0282;
use rustc_middle::hir::place::Place as HirPlace;
use rustc_middle::mir::FakeReadCause;
use rustc_middle::ty::adjustment::{Adjust, Adjustment, PointerCast};
use rustc_middle::ty::adjustment::{Adjust, Adjustment, PointerCoercion};
use rustc_middle::ty::fold::{TypeFoldable, TypeFolder, TypeSuperFoldable};
use rustc_middle::ty::visit::{TypeSuperVisitable, TypeVisitable, TypeVisitableExt};
use rustc_middle::ty::{self, ClosureSizeProfileData, Ty, TyCtxt};
@ -251,7 +251,7 @@ impl<'cx, 'tcx> WritebackCx<'cx, 'tcx> {
// Since this is "after" the other adjustment to be
// discarded, we do an extra `pop()`
if let Some(Adjustment {
kind: Adjust::Pointer(PointerCast::Unsize), ..
kind: Adjust::Pointer(PointerCoercion::Unsize), ..
}) = a.pop()
{
// So the borrow discard actually happens here

View File

@ -2014,7 +2014,7 @@ impl<'tcx> Rvalue<'tcx> {
| CastKind::IntToFloat
| CastKind::FnPtrToPtr
| CastKind::PtrToPtr
| CastKind::Pointer(_)
| CastKind::PointerCoercion(_)
| CastKind::PointerFromExposedAddress
| CastKind::DynStar
| CastKind::Transmute,

View File

@ -7,7 +7,7 @@ use super::{BasicBlock, Constant, Local, SwitchTargets, UserTypeProjection};
use crate::mir::coverage::{CodeRegion, CoverageKind};
use crate::traits::Reveal;
use crate::ty::adjustment::PointerCast;
use crate::ty::adjustment::PointerCoercion;
use crate::ty::subst::SubstsRef;
use crate::ty::{self, List, Ty};
use crate::ty::{Region, UserTypeAnnotationIndex};
@ -1230,9 +1230,9 @@ pub enum CastKind {
/// An address-to-pointer cast that picks up an exposed provenance.
/// See the docs on `from_exposed_addr` for more details.
PointerFromExposedAddress,
/// All sorts of pointer-to-pointer casts. Note that reference-to-raw-ptr casts are
/// Pointer related casts that are done by coercions. Note that reference-to-raw-ptr casts are
/// translated into `&raw mut/const *r`, i.e., they are not actually casts.
Pointer(PointerCast),
PointerCoercion(PointerCoercion),
/// Cast into a dyn* object.
DynStar,
IntToInt,

View File

@ -18,7 +18,7 @@ use rustc_index::IndexVec;
use rustc_middle::middle::region;
use rustc_middle::mir::interpret::AllocId;
use rustc_middle::mir::{self, BinOp, BorrowKind, FakeReadCause, Mutability, UnOp};
use rustc_middle::ty::adjustment::PointerCast;
use rustc_middle::ty::adjustment::PointerCoercion;
use rustc_middle::ty::subst::SubstsRef;
use rustc_middle::ty::{self, AdtDef, FnSig, List, Ty, UpvarSubsts};
use rustc_middle::ty::{CanonicalUserType, CanonicalUserTypeAnnotation};
@ -329,9 +329,10 @@ pub enum ExprKind<'tcx> {
NeverToAny {
source: ExprId,
},
/// A pointer cast. More information can be found in [`PointerCast`].
Pointer {
cast: PointerCast,
/// A pointer coercion. More information can be found in [`PointerCoercion`].
/// Pointer casts that cannot be done by coercions are represented by [`ExprKind::Cast`].
PointerCoercion {
cast: PointerCoercion,
source: ExprId,
},
/// A `loop` expression.

View File

@ -65,7 +65,7 @@ pub fn walk_expr<'a, 'tcx: 'a, V: Visitor<'a, 'tcx>>(visitor: &mut V, expr: &Exp
Cast { source } => visitor.visit_expr(&visitor.thir()[source]),
Use { source } => visitor.visit_expr(&visitor.thir()[source]),
NeverToAny { source } => visitor.visit_expr(&visitor.thir()[source]),
Pointer { source, cast: _ } => visitor.visit_expr(&visitor.thir()[source]),
PointerCoercion { source, cast: _ } => visitor.visit_expr(&visitor.thir()[source]),
Let { expr, .. } => {
visitor.visit_expr(&visitor.thir()[expr]);
}

View File

@ -6,7 +6,7 @@ use rustc_span::Span;
use rustc_target::abi::FieldIdx;
#[derive(Clone, Copy, Debug, PartialEq, Eq, TyEncodable, TyDecodable, Hash, HashStable)]
pub enum PointerCast {
pub enum PointerCoercion {
/// Go from a fn-item type to a fn-pointer type.
ReifyFnPointer,
@ -99,7 +99,7 @@ pub enum Adjust<'tcx> {
/// Take the address and produce either a `&` or `*` pointer.
Borrow(AutoBorrow<'tcx>),
Pointer(PointerCast),
Pointer(PointerCoercion),
/// Cast into a dyn* object.
DynStar,

View File

@ -332,7 +332,7 @@ TrivialTypeTraversalAndLiftImpls! {
crate::ty::IntVarValue,
crate::ty::ParamConst,
crate::ty::ParamTy,
crate::ty::adjustment::PointerCast,
crate::ty::adjustment::PointerCoercion,
crate::ty::RegionVid,
crate::ty::UniverseIndex,
crate::ty::Variance,

View File

@ -535,7 +535,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
| ExprKind::Cast { .. }
| ExprKind::Use { .. }
| ExprKind::NeverToAny { .. }
| ExprKind::Pointer { .. }
| ExprKind::PointerCoercion { .. }
| ExprKind::Repeat { .. }
| ExprKind::Borrow { .. }
| ExprKind::AddressOf { .. }

View File

@ -300,7 +300,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
let cast_kind = mir_cast_kind(ty, expr.ty);
block.and(Rvalue::Cast(cast_kind, source, expr.ty))
}
ExprKind::Pointer { cast, source } => {
ExprKind::PointerCoercion { cast, source } => {
let source = unpack!(
block = this.as_operand(
block,
@ -310,7 +310,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
NeedsTemporary::No
)
);
block.and(Rvalue::Cast(CastKind::Pointer(cast), source, expr.ty))
block.and(Rvalue::Cast(CastKind::PointerCoercion(cast), source, expr.ty))
}
ExprKind::Array { ref fields } => {
// (*) We would (maybe) be closer to codegen if we

View File

@ -63,7 +63,7 @@ impl Category {
| ExprKind::Binary { .. }
| ExprKind::Box { .. }
| ExprKind::Cast { .. }
| ExprKind::Pointer { .. }
| ExprKind::PointerCoercion { .. }
| ExprKind::Repeat { .. }
| ExprKind::Assign { .. }
| ExprKind::AssignOp { .. }

View File

@ -556,7 +556,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
| ExprKind::Binary { .. }
| ExprKind::Box { .. }
| ExprKind::Cast { .. }
| ExprKind::Pointer { .. }
| ExprKind::PointerCoercion { .. }
| ExprKind::Repeat { .. }
| ExprKind::Array { .. }
| ExprKind::Tuple { .. }

View File

@ -16,7 +16,7 @@ use rustc_middle::mir::*;
use rustc_middle::thir::*;
use rustc_middle::ty::util::IntTypeExt;
use rustc_middle::ty::GenericArg;
use rustc_middle::ty::{self, adjustment::PointerCast, Ty, TyCtxt};
use rustc_middle::ty::{self, adjustment::PointerCoercion, Ty, TyCtxt};
use rustc_span::def_id::DefId;
use rustc_span::symbol::{sym, Symbol};
use rustc_span::Span;
@ -423,7 +423,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
source_info,
temp,
Rvalue::Cast(
CastKind::Pointer(PointerCast::Unsize),
CastKind::PointerCoercion(PointerCoercion::Unsize),
Operand::Copy(val),
ty,
),
@ -436,7 +436,11 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
block,
source_info,
slice,
Rvalue::Cast(CastKind::Pointer(PointerCast::Unsize), expect, ty),
Rvalue::Cast(
CastKind::PointerCoercion(PointerCoercion::Unsize),
expect,
ty,
),
);
expect = Operand::Move(slice);
}

View File

@ -303,7 +303,7 @@ impl<'a, 'tcx> Visitor<'a, 'tcx> for UnsafetyVisitor<'a, 'tcx> {
| ExprKind::NeverToAny { .. }
| ExprKind::PlaceTypeAscription { .. }
| ExprKind::ValueTypeAscription { .. }
| ExprKind::Pointer { .. }
| ExprKind::PointerCoercion { .. }
| ExprKind::Repeat { .. }
| ExprKind::StaticRef { .. }
| ExprKind::ThreadLocalRef { .. }

View File

@ -13,7 +13,7 @@ use rustc_middle::middle::region;
use rustc_middle::mir::{self, BinOp, BorrowKind, UnOp};
use rustc_middle::thir::*;
use rustc_middle::ty::adjustment::{
Adjust, Adjustment, AutoBorrow, AutoBorrowMutability, PointerCast,
Adjust, Adjustment, AutoBorrow, AutoBorrowMutability, PointerCoercion,
};
use rustc_middle::ty::subst::InternalSubsts;
use rustc_middle::ty::{
@ -125,11 +125,16 @@ impl<'tcx> Cx<'tcx> {
};
let kind = match adjustment.kind {
Adjust::Pointer(PointerCast::Unsize) => {
Adjust::Pointer(PointerCoercion::Unsize) => {
adjust_span(&mut expr);
ExprKind::Pointer { cast: PointerCast::Unsize, source: self.thir.exprs.push(expr) }
ExprKind::PointerCoercion {
cast: PointerCoercion::Unsize,
source: self.thir.exprs.push(expr),
}
}
Adjust::Pointer(cast) => {
ExprKind::PointerCoercion { cast, source: self.thir.exprs.push(expr) }
}
Adjust::Pointer(cast) => ExprKind::Pointer { cast, source: self.thir.exprs.push(expr) },
Adjust::NeverToAny if adjustment.target.is_never() => return expr,
Adjust::NeverToAny => ExprKind::NeverToAny { source: self.thir.exprs.push(expr) },
Adjust::Deref(None) => {
@ -192,9 +197,9 @@ impl<'tcx> Cx<'tcx> {
// Special cased so that we can type check that the element
// type of the source matches the pointed to type of the
// destination.
ExprKind::Pointer {
ExprKind::PointerCoercion {
source: self.mirror_expr(source),
cast: PointerCast::ArrayToPointer,
cast: PointerCoercion::ArrayToPointer,
}
} else {
// check whether this is casting an enum variant discriminant

View File

@ -301,7 +301,7 @@ impl<'a, 'tcx> ThirPrinter<'a, 'tcx> {
self.print_expr(*source, depth_lvl + 2);
print_indented!(self, "}", depth_lvl);
}
Pointer { cast, source } => {
PointerCoercion { cast, source } => {
print_indented!(self, "Pointer {", depth_lvl);
print_indented!(self, format!("cast: {:?}", cast), depth_lvl + 1);
print_indented!(self, "source:", depth_lvl + 1);

View File

@ -41,7 +41,7 @@ fn compute_slice_length<'tcx>(
for (local, rvalue, _) in ssa.assignments(body) {
match rvalue {
Rvalue::Cast(
CastKind::Pointer(ty::adjustment::PointerCast::Unsize),
CastKind::PointerCoercion(ty::adjustment::PointerCoercion::Unsize),
operand,
cast_ty,
) => {

View File

@ -176,7 +176,7 @@ use rustc_middle::mir::mono::{InstantiationMode, MonoItem};
use rustc_middle::mir::visit::Visitor as MirVisitor;
use rustc_middle::mir::{self, Local, Location};
use rustc_middle::query::TyCtxtAt;
use rustc_middle::ty::adjustment::{CustomCoerceUnsized, PointerCast};
use rustc_middle::ty::adjustment::{CustomCoerceUnsized, PointerCoercion};
use rustc_middle::ty::print::with_no_trimmed_paths;
use rustc_middle::ty::subst::{GenericArgKind, InternalSubsts};
use rustc_middle::ty::{
@ -617,7 +617,7 @@ impl<'a, 'tcx> MirVisitor<'tcx> for MirUsedCollector<'a, 'tcx> {
// have to instantiate all methods of the trait being cast to, so we
// can build the appropriate vtable.
mir::Rvalue::Cast(
mir::CastKind::Pointer(PointerCast::Unsize),
mir::CastKind::PointerCoercion(PointerCoercion::Unsize),
ref operand,
target_ty,
)
@ -643,7 +643,7 @@ impl<'a, 'tcx> MirVisitor<'tcx> for MirUsedCollector<'a, 'tcx> {
}
}
mir::Rvalue::Cast(
mir::CastKind::Pointer(PointerCast::ReifyFnPointer),
mir::CastKind::PointerCoercion(PointerCoercion::ReifyFnPointer),
ref operand,
_,
) => {
@ -652,7 +652,7 @@ impl<'a, 'tcx> MirVisitor<'tcx> for MirUsedCollector<'a, 'tcx> {
visit_fn_use(self.tcx, fn_ty, false, span, &mut self.output);
}
mir::Rvalue::Cast(
mir::CastKind::Pointer(PointerCast::ClosureFnPointer(_)),
mir::CastKind::PointerCoercion(PointerCoercion::ClosureFnPointer(_)),
ref operand,
_,
) => {

View File

@ -221,7 +221,7 @@ fn recurse_build<'tcx>(
maybe_supported_error(GenericConstantTooComplexSub::AdtNotSupported(node.span))?
}
// dont know if this is correct
ExprKind::Pointer { .. } => {
ExprKind::PointerCoercion { .. } => {
error(GenericConstantTooComplexSub::PointerNotSupported(node.span))?
}
ExprKind::Yield { .. } => {
@ -324,7 +324,7 @@ impl<'a, 'tcx> IsThirPolymorphic<'a, 'tcx> {
| thir::ExprKind::Cast { .. }
| thir::ExprKind::Use { .. }
| thir::ExprKind::NeverToAny { .. }
| thir::ExprKind::Pointer { .. }
| thir::ExprKind::PointerCoercion { .. }
| thir::ExprKind::Loop { .. }
| thir::ExprKind::Let { .. }
| thir::ExprKind::Match { .. }

View File

@ -9,7 +9,7 @@ use rustc_hir::{
Body, Expr, ExprKind, GenericArg, Impl, ImplItemKind, Item, ItemKind, Node, PathSegment, QPath, TyKind,
};
use rustc_lint::{LateContext, LateLintPass};
use rustc_middle::ty::adjustment::{Adjust, PointerCast};
use rustc_middle::ty::adjustment::{Adjust, PointerCoercion};
use rustc_middle::ty::{self, Adt, AdtDef, SubstsRef, Ty, TypeckResults};
use rustc_session::{declare_tool_lint, impl_lint_pass};
use rustc_span::sym;
@ -116,7 +116,7 @@ fn check_struct<'tcx>(
let is_default_without_adjusts = |expr| {
is_default_equivalent(cx, expr)
&& typeck_results.expr_adjustments(expr).iter().all(|adj| {
!matches!(adj.kind, Adjust::Pointer(PointerCast::Unsize)
!matches!(adj.kind, Adjust::Pointer(PointerCoercion::Unsize)
if contains_trait_object(adj.target))
})
};

View File

@ -14,7 +14,7 @@ use rustc_hir as hir;
use rustc_hir::intravisit::FnKind;
use rustc_hir::{BindingAnnotation, Body, FnDecl, Impl, ItemKind, MutTy, Mutability, Node, PatKind};
use rustc_lint::{LateContext, LateLintPass};
use rustc_middle::ty::adjustment::{Adjust, PointerCast};
use rustc_middle::ty::adjustment::{Adjust, PointerCoercion};
use rustc_middle::ty::layout::LayoutOf;
use rustc_middle::ty::{self, RegionKind};
use rustc_session::{declare_tool_lint, impl_lint_pass};
@ -195,7 +195,7 @@ impl<'tcx> PassByRefOrValue {
.adjustments()
.items()
.flat_map(|(_, a)| a)
.any(|a| matches!(a.kind, Adjust::Pointer(PointerCast::UnsafeFnPointer)))
.any(|a| matches!(a.kind, Adjust::Pointer(PointerCoercion::UnsafeFnPointer)))
{
continue;
}

View File

@ -16,7 +16,7 @@ use rustc_middle::mir::{
};
use rustc_middle::traits::{ImplSource, ObligationCause};
use rustc_middle::ty::subst::GenericArgKind;
use rustc_middle::ty::{self, adjustment::PointerCast, Ty, TyCtxt};
use rustc_middle::ty::{self, adjustment::PointerCoercion, Ty, TyCtxt};
use rustc_middle::ty::{BoundConstness, TraitRef};
use rustc_semver::RustcVersion;
use rustc_span::symbol::sym;
@ -119,18 +119,18 @@ fn check_rvalue<'tcx>(
| CastKind::FloatToFloat
| CastKind::FnPtrToPtr
| CastKind::PtrToPtr
| CastKind::Pointer(PointerCast::MutToConstPointer | PointerCast::ArrayToPointer),
| CastKind::PointerCoercion(PointerCoercion::MutToConstPointer | PointerCoercion::ArrayToPointer),
operand,
_,
) => check_operand(tcx, operand, span, body),
Rvalue::Cast(
CastKind::Pointer(
PointerCast::UnsafeFnPointer | PointerCast::ClosureFnPointer(_) | PointerCast::ReifyFnPointer,
CastKind::PointerCoercion(
PointerCoercion::UnsafeFnPointer | PointerCoercion::ClosureFnPointer(_) | PointerCoercion::ReifyFnPointer,
),
_,
_,
) => Err((span, "function pointer casts are not allowed in const fn".into())),
Rvalue::Cast(CastKind::Pointer(PointerCast::Unsize), op, cast_ty) => {
Rvalue::Cast(CastKind::PointerCoercion(PointerCoercion::Unsize), op, cast_ty) => {
let pointee_ty = if let Some(deref_ty) = cast_ty.builtin_deref(true) {
deref_ty.ty
} else {

View File

@ -150,7 +150,7 @@ fn address_of_reborrow() -> () {
StorageLive(_9);
StorageLive(_10);
_10 = &raw const (*_1);
_9 = move _10 as *const dyn std::marker::Send (Pointer(Unsize));
_9 = move _10 as *const dyn std::marker::Send (PointerCoercion(Unsize));
StorageDead(_10);
AscribeUserType(_9, o, UserTypeProjection { base: UserType(1), projs: [] });
_8 = _9;
@ -159,13 +159,13 @@ fn address_of_reborrow() -> () {
StorageLive(_11);
StorageLive(_12);
_12 = &raw const (*_1);
_11 = move _12 as *const [i32] (Pointer(Unsize));
_11 = move _12 as *const [i32] (PointerCoercion(Unsize));
StorageDead(_12);
StorageDead(_11);
StorageLive(_13);
StorageLive(_14);
_14 = &raw const (*_1);
_13 = move _14 as *const i32 (Pointer(ArrayToPointer));
_13 = move _14 as *const i32 (PointerCoercion(ArrayToPointer));
StorageDead(_14);
StorageDead(_13);
StorageLive(_15);
@ -179,14 +179,14 @@ fn address_of_reborrow() -> () {
StorageLive(_17);
StorageLive(_18);
_18 = &raw const (*_1);
_17 = move _18 as *const dyn std::marker::Send (Pointer(Unsize));
_17 = move _18 as *const dyn std::marker::Send (PointerCoercion(Unsize));
StorageDead(_18);
FakeRead(ForLet(None), _17);
AscribeUserType(_17, o, UserTypeProjection { base: UserType(7), projs: [] });
StorageLive(_19);
StorageLive(_20);
_20 = &raw const (*_1);
_19 = move _20 as *const [i32] (Pointer(Unsize));
_19 = move _20 as *const [i32] (PointerCoercion(Unsize));
StorageDead(_20);
FakeRead(ForLet(None), _19);
AscribeUserType(_19, o, UserTypeProjection { base: UserType(9), projs: [] });
@ -204,7 +204,7 @@ fn address_of_reborrow() -> () {
StorageLive(_25);
StorageLive(_26);
_26 = &raw const (*_3);
_25 = move _26 as *const dyn std::marker::Send (Pointer(Unsize));
_25 = move _26 as *const dyn std::marker::Send (PointerCoercion(Unsize));
StorageDead(_26);
AscribeUserType(_25, o, UserTypeProjection { base: UserType(11), projs: [] });
_24 = _25;
@ -213,7 +213,7 @@ fn address_of_reborrow() -> () {
StorageLive(_27);
StorageLive(_28);
_28 = &raw const (*_3);
_27 = move _28 as *const [i32] (Pointer(Unsize));
_27 = move _28 as *const [i32] (PointerCoercion(Unsize));
StorageDead(_28);
StorageDead(_27);
StorageLive(_29);
@ -227,14 +227,14 @@ fn address_of_reborrow() -> () {
StorageLive(_31);
StorageLive(_32);
_32 = &raw const (*_3);
_31 = move _32 as *const dyn std::marker::Send (Pointer(Unsize));
_31 = move _32 as *const dyn std::marker::Send (PointerCoercion(Unsize));
StorageDead(_32);
FakeRead(ForLet(None), _31);
AscribeUserType(_31, o, UserTypeProjection { base: UserType(17), projs: [] });
StorageLive(_33);
StorageLive(_34);
_34 = &raw const (*_3);
_33 = move _34 as *const [i32] (Pointer(Unsize));
_33 = move _34 as *const [i32] (PointerCoercion(Unsize));
StorageDead(_34);
FakeRead(ForLet(None), _33);
AscribeUserType(_33, o, UserTypeProjection { base: UserType(19), projs: [] });
@ -252,7 +252,7 @@ fn address_of_reborrow() -> () {
StorageLive(_39);
StorageLive(_40);
_40 = &raw mut (*_3);
_39 = move _40 as *mut dyn std::marker::Send (Pointer(Unsize));
_39 = move _40 as *mut dyn std::marker::Send (PointerCoercion(Unsize));
StorageDead(_40);
AscribeUserType(_39, o, UserTypeProjection { base: UserType(21), projs: [] });
_38 = _39;
@ -261,7 +261,7 @@ fn address_of_reborrow() -> () {
StorageLive(_41);
StorageLive(_42);
_42 = &raw mut (*_3);
_41 = move _42 as *mut [i32] (Pointer(Unsize));
_41 = move _42 as *mut [i32] (PointerCoercion(Unsize));
StorageDead(_42);
StorageDead(_41);
StorageLive(_43);
@ -275,14 +275,14 @@ fn address_of_reborrow() -> () {
StorageLive(_45);
StorageLive(_46);
_46 = &raw mut (*_3);
_45 = move _46 as *mut dyn std::marker::Send (Pointer(Unsize));
_45 = move _46 as *mut dyn std::marker::Send (PointerCoercion(Unsize));
StorageDead(_46);
FakeRead(ForLet(None), _45);
AscribeUserType(_45, o, UserTypeProjection { base: UserType(27), projs: [] });
StorageLive(_47);
StorageLive(_48);
_48 = &raw mut (*_3);
_47 = move _48 as *mut [i32] (Pointer(Unsize));
_47 = move _48 as *mut [i32] (PointerCoercion(Unsize));
StorageDead(_48);
FakeRead(ForLet(None), _47);
AscribeUserType(_47, o, UserTypeProjection { base: UserType(29), projs: [] });

View File

@ -39,7 +39,7 @@ fn main() -> () {
StorageLive(_3);
StorageLive(_4);
_4 = _1;
_3 = move _4 as *const Test (Pointer(MutToConstPointer));
_3 = move _4 as *const Test (PointerCoercion(MutToConstPointer));
StorageDead(_4);
_2 = Test::x(move _3) -> [return: bb2, unwind: bb4];
}
@ -64,7 +64,7 @@ fn main() -> () {
StorageLive(_11);
StorageLive(_12);
_12 = (*(*(*(*_5))));
_11 = move _12 as *const Test (Pointer(MutToConstPointer));
_11 = move _12 as *const Test (PointerCoercion(MutToConstPointer));
StorageDead(_12);
_10 = Test::x(move _11) -> [return: bb3, unwind: bb4];
}

View File

@ -187,7 +187,7 @@ static XXX: &Foo = {
StorageDead(_7);
_5 = &_6;
_4 = &(*_5);
_3 = move _4 as &[(u32, u32)] (Pointer(Unsize));
_3 = move _4 as &[(u32, u32)] (PointerCoercion(Unsize));
StorageDead(_4);
_2 = Foo { tup: const "hi", data: move _3 };
StorageDead(_3);

View File

@ -8,7 +8,7 @@ fn roundtrip(_1: *const u8) -> *const u8 {
bb0: {
StorageLive(_2);
_2 = _1 as *mut u8 (PtrToPtr);
_0 = move _2 as *const u8 (Pointer(MutToConstPointer));
_0 = move _2 as *const u8 (PointerCoercion(MutToConstPointer));
StorageDead(_2);
return;
}

View File

@ -22,7 +22,7 @@
- _2 = &_3;
+ _6 = const _;
+ _2 = &(*_6);
_1 = move _2 as &[&i32] (Pointer(Unsize));
_1 = move _2 as &[&i32] (PointerCoercion(Unsize));
- StorageDead(_4);
StorageDead(_2);
_0 = core::slice::<impl [&i32]>::as_ptr(move _1) -> [return: bb1, unwind: bb2];

View File

@ -24,7 +24,7 @@
- _2 = &_3;
+ _6 = const _;
+ _2 = &(*_6);
_1 = move _2 as &[&i32] (Pointer(Unsize));
_1 = move _2 as &[&i32] (PointerCoercion(Unsize));
- StorageDead(_4);
StorageDead(_2);
_0 = core::slice::<impl [&i32]>::as_ptr(move _1) -> [return: bb1, unwind: bb2];

View File

@ -28,7 +28,7 @@
_9 = const _;
_3 = &(*_9);
_2 = &raw const (*_3);
_1 = move _2 as *const [i32] (Pointer(Unsize));
_1 = move _2 as *const [i32] (PointerCoercion(Unsize));
StorageDead(_2);
StorageDead(_3);
StorageLive(_5);

View File

@ -28,7 +28,7 @@
_9 = const _;
_3 = &(*_9);
_2 = &raw const (*_3);
_1 = move _2 as *const [i32] (Pointer(Unsize));
_1 = move _2 as *const [i32] (PointerCoercion(Unsize));
StorageDead(_2);
StorageDead(_3);
StorageLive(_5);

View File

@ -28,7 +28,7 @@
_9 = const _;
_3 = &(*_9);
_2 = &raw const (*_3);
_1 = move _2 as *const [i32] (Pointer(Unsize));
_1 = move _2 as *const [i32] (PointerCoercion(Unsize));
StorageDead(_2);
StorageDead(_3);
StorageLive(_5);

View File

@ -28,7 +28,7 @@
_9 = const _;
_3 = &(*_9);
_2 = &raw const (*_3);
_1 = move _2 as *const [i32] (Pointer(Unsize));
_1 = move _2 as *const [i32] (PointerCoercion(Unsize));
StorageDead(_2);
StorageDead(_3);
StorageLive(_5);

View File

@ -13,7 +13,7 @@
StorageLive(_1);
StorageLive(_2);
StorageLive(_3);
_3 = main as fn() (Pointer(ReifyFnPointer));
_3 = main as fn() (PointerCoercion(ReifyFnPointer));
_2 = move _3 as usize (PointerExposeAddress);
StorageDead(_3);
_1 = move _2 as *const fn() (PointerFromExposedAddress);

View File

@ -21,7 +21,7 @@
_9 = const _;
_4 = _9;
_3 = _4;
_2 = move _3 as &[u32] (Pointer(Unsize));
_2 = move _3 as &[u32] (PointerCoercion(Unsize));
StorageDead(_3);
StorageLive(_6);
_6 = const 1_usize;

View File

@ -21,7 +21,7 @@
_9 = const _;
_4 = _9;
_3 = _4;
_2 = move _3 as &[u32] (Pointer(Unsize));
_2 = move _3 as &[u32] (PointerCoercion(Unsize));
StorageDead(_3);
StorageLive(_6);
_6 = const 1_usize;

View File

@ -21,7 +21,7 @@
_9 = const _;
_4 = _9;
_3 = _4;
_2 = move _3 as &[u32] (Pointer(Unsize));
_2 = move _3 as &[u32] (PointerCoercion(Unsize));
StorageDead(_3);
StorageLive(_6);
_6 = const 1_usize;

View File

@ -21,7 +21,7 @@
_9 = const _;
_4 = _9;
_3 = _4;
_2 = move _3 as &[u32] (Pointer(Unsize));
_2 = move _3 as &[u32] (PointerCoercion(Unsize));
StorageDead(_3);
StorageLive(_6);
_6 = const 1_usize;

View File

@ -47,7 +47,7 @@
StorageLive(_6);
StorageLive(_7);
_7 = &_2;
_6 = move _7 as &[i32] (Pointer(Unsize));
_6 = move _7 as &[i32] (PointerCoercion(Unsize));
StorageDead(_7);
_5 = core::slice::<impl [i32]>::len(move _6) -> [return: bb1, unwind unreachable];
}

View File

@ -47,7 +47,7 @@
StorageLive(_6);
StorageLive(_7);
_7 = &_2;
_6 = move _7 as &[i32] (Pointer(Unsize));
_6 = move _7 as &[i32] (PointerCoercion(Unsize));
StorageDead(_7);
_5 = core::slice::<impl [i32]>::len(move _6) -> [return: bb1, unwind continue];
}

View File

@ -31,7 +31,7 @@
_4 = &(*_2);
- _0 = try_execute_query::<<Q as Query>::C>(move _4) -> [return: bb2, unwind unreachable];
+ StorageLive(_5);
+ _5 = _4 as &dyn Cache<V = <Q as Query>::V> (Pointer(Unsize));
+ _5 = _4 as &dyn Cache<V = <Q as Query>::V> (PointerCoercion(Unsize));
+ _0 = <dyn Cache<V = <Q as Query>::V> as Cache>::store_nocache(_5) -> [return: bb2, unwind unreachable];
}

View File

@ -31,7 +31,7 @@
_4 = &(*_2);
- _0 = try_execute_query::<<Q as Query>::C>(move _4) -> [return: bb2, unwind continue];
+ StorageLive(_5);
+ _5 = _4 as &dyn Cache<V = <Q as Query>::V> (Pointer(Unsize));
+ _5 = _4 as &dyn Cache<V = <Q as Query>::V> (PointerCoercion(Unsize));
+ _0 = <dyn Cache<V = <Q as Query>::V> as Cache>::store_nocache(_5) -> [return: bb2, unwind continue];
}

View File

@ -14,7 +14,7 @@
StorageLive(_2);
StorageLive(_3);
_3 = &(*_1);
_2 = move _3 as &dyn Cache<V = <C as Cache>::V> (Pointer(Unsize));
_2 = move _3 as &dyn Cache<V = <C as Cache>::V> (PointerCoercion(Unsize));
StorageDead(_3);
- _0 = mk_cycle::<<C as Cache>::V>(move _2) -> [return: bb1, unwind unreachable];
+ _0 = <dyn Cache<V = <C as Cache>::V> as Cache>::store_nocache(_2) -> [return: bb1, unwind unreachable];

View File

@ -14,7 +14,7 @@
StorageLive(_2);
StorageLive(_3);
_3 = &(*_1);
_2 = move _3 as &dyn Cache<V = <C as Cache>::V> (Pointer(Unsize));
_2 = move _3 as &dyn Cache<V = <C as Cache>::V> (PointerCoercion(Unsize));
StorageDead(_3);
- _0 = mk_cycle::<<C as Cache>::V>(move _2) -> [return: bb1, unwind continue];
+ _0 = <dyn Cache<V = <C as Cache>::V> as Cache>::store_nocache(_2) -> [return: bb1, unwind continue];

View File

@ -164,7 +164,7 @@
+ StorageDead(_17);
+ StorageLive(_19);
+ StorageLive(_20);
+ _19 = _16 as *const u8 (Pointer(MutToConstPointer));
+ _19 = _16 as *const u8 (PointerCoercion(MutToConstPointer));
+ _15 = NonNull::<u8> { pointer: _19 };
+ StorageDead(_20);
+ StorageDead(_19);

View File

@ -181,7 +181,7 @@
+ StorageDead(_17);
+ StorageLive(_19);
+ StorageLive(_20);
+ _19 = _16 as *const u8 (Pointer(MutToConstPointer));
+ _19 = _16 as *const u8 (PointerCoercion(MutToConstPointer));
+ _15 = NonNull::<u8> { pointer: _19 };
+ StorageDead(_20);
+ StorageDead(_19);

View File

@ -13,7 +13,7 @@ fn test2(_1: &dyn X) -> bool {
StorageLive(_2);
StorageLive(_3);
_3 = &(*_1);
_2 = move _3 as &dyn X (Pointer(Unsize));
_2 = move _3 as &dyn X (PointerCoercion(Unsize));
StorageDead(_3);
_0 = <dyn X as X>::y(_2) -> [return: bb1, unwind unreachable];
}

View File

@ -13,7 +13,7 @@ fn test2(_1: &dyn X) -> bool {
StorageLive(_2);
StorageLive(_3);
_3 = &(*_1);
_2 = move _3 as &dyn X (Pointer(Unsize));
_2 = move _3 as &dyn X (PointerCoercion(Unsize));
StorageDead(_3);
_0 = <dyn X as X>::y(_2) -> [return: bb1, unwind continue];
}

View File

@ -32,7 +32,7 @@
StorageLive(_5);
_5 = [_1, _1, _1];
_4 = &_5;
_2 = _4 as &[T] (Pointer(Unsize));
_2 = _4 as &[T] (PointerCoercion(Unsize));
_9 = Len((*_2));
_10 = const 3_usize;
- _11 = Eq(move _9, const 3_usize);

View File

@ -32,7 +32,7 @@
StorageLive(_5);
_5 = [_1, _1, _1];
_4 = &_5;
_2 = _4 as &[T] (Pointer(Unsize));
_2 = _4 as &[T] (PointerCoercion(Unsize));
_9 = Len((*_2));
_10 = const 3_usize;
- _11 = Eq(move _9, const 3_usize);

View File

@ -22,7 +22,7 @@
StorageLive(_6);
StorageLive(_7);
_7 = &(*_2);
_6 = move _7 as &[u8] (Pointer(Unsize));
_6 = move _7 as &[u8] (PointerCoercion(Unsize));
StorageDead(_7);
- _5 = Len((*_6));
+ _5 = const N;

View File

@ -22,7 +22,7 @@
StorageLive(_6);
StorageLive(_7);
_7 = &(*_2);
_6 = move _7 as &[u8] (Pointer(Unsize));
_6 = move _7 as &[u8] (PointerCoercion(Unsize));
StorageDead(_7);
- _5 = Len((*_6));
+ _5 = const N;

View File

@ -25,7 +25,7 @@
StorageLive(_6);
StorageLive(_7);
_7 = &(*_2);
_6 = move _7 as &[u8] (Pointer(Unsize));
_6 = move _7 as &[u8] (PointerCoercion(Unsize));
StorageDead(_7);
- _5 = Len((*_6));
+ _5 = const N;

View File

@ -25,7 +25,7 @@
StorageLive(_6);
StorageLive(_7);
_7 = &(*_2);
_6 = move _7 as &[u8] (Pointer(Unsize));
_6 = move _7 as &[u8] (PointerCoercion(Unsize));
StorageDead(_7);
- _5 = Len((*_6));
+ _5 = const N;

View File

@ -11,7 +11,7 @@
StorageLive(_2);
StorageLive(_3);
_3 = &(*_1);
_2 = move _3 as &[u8] (Pointer(Unsize));
_2 = move _3 as &[u8] (PointerCoercion(Unsize));
StorageDead(_3);
- _0 = Len((*_2));
+ _0 = const N;

View File

@ -11,7 +11,7 @@
StorageLive(_2);
StorageLive(_3);
_3 = &(*_1);
_2 = move _3 as &[u8] (Pointer(Unsize));
_2 = move _3 as &[u8] (PointerCoercion(Unsize));
StorageDead(_3);
- _0 = Len((*_2));
+ _0 = const N;

View File

@ -11,7 +11,7 @@
StorageLive(_2);
StorageLive(_3);
_3 = &_1;
_2 = move _3 as &[u8] (Pointer(Unsize));
_2 = move _3 as &[u8] (PointerCoercion(Unsize));
StorageDead(_3);
- _0 = Len((*_2));
+ _0 = const N;

View File

@ -11,7 +11,7 @@
StorageLive(_2);
StorageLive(_3);
_3 = &_1;
_2 = move _3 as &[u8] (Pointer(Unsize));
_2 = move _3 as &[u8] (PointerCoercion(Unsize));
StorageDead(_3);
- _0 = Len((*_2));
+ _0 = const N;

View File

@ -25,7 +25,7 @@
StorageLive(_4);
_4 = &_1;
_3 = &(*_4);
_2 = move _3 as &[u8] (Pointer(Unsize));
_2 = move _3 as &[u8] (PointerCoercion(Unsize));
StorageDead(_3);
StorageDead(_4);
StorageLive(_5);

View File

@ -25,7 +25,7 @@
StorageLive(_4);
_4 = &_1;
_3 = &(*_4);
_2 = move _3 as &[u8] (Pointer(Unsize));
_2 = move _3 as &[u8] (PointerCoercion(Unsize));
StorageDead(_3);
StorageDead(_4);
StorageLive(_5);

View File

@ -22,7 +22,7 @@
StorageLive(_4);
_4 = &mut _1;
_3 = &mut (*_4);
_2 = move _3 as &mut [u8] (Pointer(Unsize));
_2 = move _3 as &mut [u8] (PointerCoercion(Unsize));
StorageDead(_3);
StorageDead(_4);
StorageLive(_5);

View File

@ -22,7 +22,7 @@
StorageLive(_4);
_4 = &mut _1;
_3 = &mut (*_4);
_2 = move _3 as &mut [u8] (Pointer(Unsize));
_2 = move _3 as &mut [u8] (PointerCoercion(Unsize));
StorageDead(_3);
StorageDead(_4);
StorageLive(_5);

View File

@ -78,7 +78,7 @@ fn slice_get_unchecked_mut_range(_1: &mut [u32], _2: std::ops::Range<usize>) ->
StorageLive(_12);
StorageLive(_11);
StorageLive(_10);
_10 = _9 as *const () (Pointer(MutToConstPointer));
_10 = _9 as *const () (PointerCoercion(MutToConstPointer));
_11 = ptr::metadata::PtrComponents::<[u32]> { data_address: move _10, metadata: _6 };
StorageDead(_10);
_12 = ptr::metadata::PtrRepr::<[u32]> { const_ptr: move _11 };

View File

@ -78,7 +78,7 @@ fn slice_get_unchecked_mut_range(_1: &mut [u32], _2: std::ops::Range<usize>) ->
StorageLive(_12);
StorageLive(_11);
StorageLive(_10);
_10 = _9 as *const () (Pointer(MutToConstPointer));
_10 = _9 as *const () (PointerCoercion(MutToConstPointer));
_11 = ptr::metadata::PtrComponents::<[u32]> { data_address: move _10, metadata: _6 };
StorageDead(_10);
_12 = ptr::metadata::PtrRepr::<[u32]> { const_ptr: move _11 };

View File

@ -131,7 +131,7 @@ fn enumerated_loop(_1: &[T], _2: impl Fn(usize, &T)) -> () {
_9 = _4 as *mut T (PtrToPtr);
StorageLive(_10);
StorageLive(_24);
_10 = _9 as *const T (Pointer(MutToConstPointer));
_10 = _9 as *const T (PointerCoercion(MutToConstPointer));
_11 = NonNull::<T> { pointer: _10 };
StorageDead(_24);
StorageDead(_10);

View File

@ -131,7 +131,7 @@ fn enumerated_loop(_1: &[T], _2: impl Fn(usize, &T)) -> () {
_9 = _4 as *mut T (PtrToPtr);
StorageLive(_10);
StorageLive(_24);
_10 = _9 as *const T (Pointer(MutToConstPointer));
_10 = _9 as *const T (PointerCoercion(MutToConstPointer));
_11 = NonNull::<T> { pointer: _10 };
StorageDead(_24);
StorageDead(_10);

View File

@ -121,7 +121,7 @@ fn forward_loop(_1: &[T], _2: impl Fn(&T)) -> () {
_9 = _4 as *mut T (PtrToPtr);
StorageLive(_10);
StorageLive(_22);
_10 = _9 as *const T (Pointer(MutToConstPointer));
_10 = _9 as *const T (PointerCoercion(MutToConstPointer));
_11 = NonNull::<T> { pointer: _10 };
StorageDead(_22);
StorageDead(_10);

View File

@ -121,7 +121,7 @@ fn forward_loop(_1: &[T], _2: impl Fn(&T)) -> () {
_9 = _4 as *mut T (PtrToPtr);
StorageLive(_10);
StorageLive(_22);
_10 = _9 as *const T (Pointer(MutToConstPointer));
_10 = _9 as *const T (PointerCoercion(MutToConstPointer));
_11 = NonNull::<T> { pointer: _10 };
StorageDead(_22);
StorageDead(_10);

View File

@ -133,7 +133,7 @@ fn reverse_loop(_1: &[T], _2: impl Fn(&T)) -> () {
_9 = _4 as *mut T (PtrToPtr);
StorageLive(_10);
StorageLive(_24);
_10 = _9 as *const T (Pointer(MutToConstPointer));
_10 = _9 as *const T (PointerCoercion(MutToConstPointer));
_11 = NonNull::<T> { pointer: _10 };
StorageDead(_24);
StorageDead(_10);

View File

@ -133,7 +133,7 @@ fn reverse_loop(_1: &[T], _2: impl Fn(&T)) -> () {
_9 = _4 as *mut T (PtrToPtr);
StorageLive(_10);
StorageLive(_24);
_10 = _9 as *const T (Pointer(MutToConstPointer));
_10 = _9 as *const T (PointerCoercion(MutToConstPointer));
_11 = NonNull::<T> { pointer: _10 };
StorageDead(_24);
StorageDead(_10);

View File

@ -69,7 +69,7 @@ fn array_casts() -> () {
StorageLive(_4);
_4 = &mut _1;
_3 = &raw mut (*_4);
_2 = move _3 as *mut usize (Pointer(ArrayToPointer));
_2 = move _3 as *mut usize (PointerCoercion(ArrayToPointer));
StorageDead(_3);
StorageDead(_4);
StorageLive(_5);
@ -92,7 +92,7 @@ fn array_casts() -> () {
StorageLive(_11);
_11 = &_8;
_10 = &raw const (*_11);
_9 = move _10 as *const usize (Pointer(ArrayToPointer));
_9 = move _10 as *const usize (PointerCoercion(ArrayToPointer));
StorageDead(_10);
StorageDead(_11);
StorageLive(_12);

View File

@ -69,7 +69,7 @@ fn array_casts() -> () {
StorageLive(_4);
_4 = &mut _1;
_3 = &raw mut (*_4);
_2 = move _3 as *mut usize (Pointer(ArrayToPointer));
_2 = move _3 as *mut usize (PointerCoercion(ArrayToPointer));
StorageDead(_3);
StorageDead(_4);
StorageLive(_5);
@ -92,7 +92,7 @@ fn array_casts() -> () {
StorageLive(_11);
_11 = &_8;
_10 = &raw const (*_11);
_9 = move _10 as *const usize (Pointer(ArrayToPointer));
_9 = move _10 as *const usize (PointerCoercion(ArrayToPointer));
StorageDead(_10);
StorageDead(_11);
StorageLive(_12);

View File

@ -105,7 +105,7 @@ fn main() -> () {
StorageLive(_14);
_14 = [closure@main::{closure#0}];
Retag(_14);
_13 = move _14 as for<'a> fn(&'a i32) -> &'a i32 (Pointer(ClosureFnPointer(Normal)));
_13 = move _14 as for<'a> fn(&'a i32) -> &'a i32 (PointerCoercion(ClosureFnPointer(Normal)));
StorageDead(_14);
StorageLive(_15);
StorageLive(_16);

View File

@ -105,7 +105,7 @@ fn main() -> () {
StorageLive(_14);
_14 = [closure@main::{closure#0}];
Retag(_14);
_13 = move _14 as for<'a> fn(&'a i32) -> &'a i32 (Pointer(ClosureFnPointer(Normal)));
_13 = move _14 as for<'a> fn(&'a i32) -> &'a i32 (PointerCoercion(ClosureFnPointer(Normal)));
StorageDead(_14);
StorageLive(_15);
StorageLive(_16);

View File

@ -21,7 +21,7 @@
- StorageLive(_4);
- _4 = &_1;
- _3 = &(*_4);
- _2 = move _3 as &[u8] (Pointer(Unsize));
- _2 = move _3 as &[u8] (PointerCoercion(Unsize));
- StorageDead(_3);
- StorageDead(_4);
- StorageDead(_2);

View File

@ -62,7 +62,7 @@
}
bb1: {
_3 = move _4 as std::boxed::Box<dyn std::fmt::Display> (Pointer(Unsize));
_3 = move _4 as std::boxed::Box<dyn std::fmt::Display> (PointerCoercion(Unsize));
StorageDead(_4);
_2 = Result::<Box<dyn std::fmt::Display>, <T as Err>::Err>::Ok(move _3);
StorageDead(_3);
@ -95,7 +95,7 @@
_26 = const _;
_14 = &(*_26);
_13 = &(*_14);
_12 = move _13 as &[&str] (Pointer(Unsize));
_12 = move _13 as &[&str] (PointerCoercion(Unsize));
StorageDead(_13);
StorageLive(_16);
StorageLive(_17);
@ -126,7 +126,7 @@
StorageDead(_20);
_18 = &_19;
_17 = &(*_18);
_16 = move _17 as &[core::fmt::rt::Argument<'_>] (Pointer(Unsize));
_16 = move _17 as &[core::fmt::rt::Argument<'_>] (PointerCoercion(Unsize));
StorageDead(_17);
_11 = Arguments::<'_>::new_v1(move _12, move _16) -> [return: bb5, unwind unreachable];
}