Make Ty::boxed_ty
return an Option
This commit is contained in:
parent
842d6fc32e
commit
f6e8a84eea
21 changed files with 58 additions and 48 deletions
|
@ -1075,11 +1075,13 @@ where
|
|||
// the raw pointer, so size and align are set to the boxed type, but `pointee.safe`
|
||||
// will still be `None`.
|
||||
if let Some(ref mut pointee) = result {
|
||||
if offset.bytes() == 0 && this.ty.is_box() {
|
||||
if offset.bytes() == 0
|
||||
&& let Some(boxed_ty) = this.ty.boxed_ty()
|
||||
{
|
||||
debug_assert!(pointee.safe.is_none());
|
||||
let optimize = tcx.sess.opts.optimize != OptLevel::No;
|
||||
pointee.safe = Some(PointerKind::Box {
|
||||
unpin: optimize && this.ty.boxed_ty().is_unpin(tcx, cx.param_env()),
|
||||
unpin: optimize && boxed_ty.is_unpin(tcx, cx.param_env()),
|
||||
global: this.ty.is_box_global(tcx),
|
||||
});
|
||||
}
|
||||
|
|
|
@ -1170,14 +1170,19 @@ impl<'tcx> Ty<'tcx> {
|
|||
}
|
||||
}
|
||||
|
||||
/// Panics if called on any type other than `Box<T>`.
|
||||
pub fn boxed_ty(self) -> Ty<'tcx> {
|
||||
pub fn boxed_ty(self) -> Option<Ty<'tcx>> {
|
||||
match self.kind() {
|
||||
Adt(def, args) if def.is_box() => args.type_at(0),
|
||||
_ => bug!("`boxed_ty` is called on non-box type {:?}", self),
|
||||
Adt(def, args) if def.is_box() => Some(args.type_at(0)),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
/// Panics if called on any type other than `Box<T>`.
|
||||
pub fn expect_boxed_ty(self) -> Ty<'tcx> {
|
||||
self.boxed_ty()
|
||||
.unwrap_or_else(|| bug!("`expect_boxed_ty` is called on non-box type {:?}", self))
|
||||
}
|
||||
|
||||
/// A scalar type is one that denotes an atomic datum, with no sub-components.
|
||||
/// (A RawPtr is scalar because it represents a non-managed pointer, so its
|
||||
/// contents are abstract to rustc.)
|
||||
|
@ -1323,7 +1328,7 @@ impl<'tcx> Ty<'tcx> {
|
|||
/// Some types -- notably unsafe ptrs -- can only be dereferenced explicitly.
|
||||
pub fn builtin_deref(self, explicit: bool) -> Option<Ty<'tcx>> {
|
||||
match *self.kind() {
|
||||
Adt(def, _) if def.is_box() => Some(self.boxed_ty()),
|
||||
_ if let Some(boxed) = self.boxed_ty() => Some(boxed),
|
||||
Ref(_, ty, _) => Some(ty),
|
||||
RawPtr(ty, _) if explicit => Some(ty),
|
||||
_ => None,
|
||||
|
|
|
@ -1628,7 +1628,7 @@ impl<'tcx> ExplicitSelf<'tcx> {
|
|||
_ if is_self_ty(self_arg_ty) => ByValue,
|
||||
ty::Ref(region, ty, mutbl) if is_self_ty(ty) => ByReference(region, mutbl),
|
||||
ty::RawPtr(ty, mutbl) if is_self_ty(ty) => ByRawPointer(mutbl),
|
||||
ty::Adt(def, _) if def.is_box() && is_self_ty(self_arg_ty.boxed_ty()) => ByBox,
|
||||
_ if self_arg_ty.boxed_ty().is_some_and(is_self_ty) => ByBox,
|
||||
_ => Other,
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue