Implement has_ptr_meta without computing type layout
This matches type_has_metadata in cg_ssa and doesn't require computing the layout of the type. It is also a bit faster.
This commit is contained in:
parent
697aa0a320
commit
c4567c1841
@ -98,11 +98,15 @@ fn clif_pair_type_from_ty<'tcx>(
|
|||||||
|
|
||||||
/// Is a pointer to this type a fat ptr?
|
/// Is a pointer to this type a fat ptr?
|
||||||
pub(crate) fn has_ptr_meta<'tcx>(tcx: TyCtxt<'tcx>, ty: Ty<'tcx>) -> bool {
|
pub(crate) fn has_ptr_meta<'tcx>(tcx: TyCtxt<'tcx>, ty: Ty<'tcx>) -> bool {
|
||||||
let ptr_ty = Ty::new_ptr(tcx, TypeAndMut { ty, mutbl: rustc_hir::Mutability::Not });
|
if ty.is_sized(tcx, ParamEnv::reveal_all()) {
|
||||||
match &tcx.layout_of(ParamEnv::reveal_all().and(ptr_ty)).unwrap().abi {
|
return false;
|
||||||
Abi::Scalar(_) => false,
|
}
|
||||||
Abi::ScalarPair(_, _) => true,
|
|
||||||
abi => unreachable!("Abi of ptr to {:?} is {:?}???", ty, abi),
|
let tail = tcx.struct_tail_erasing_lifetimes(ty, ParamEnv::reveal_all());
|
||||||
|
match tail.kind() {
|
||||||
|
ty::Foreign(..) => false,
|
||||||
|
ty::Str | ty::Slice(..) | ty::Dynamic(..) => true,
|
||||||
|
_ => bug!("unexpected unsized tail: {:?}", tail),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user