Rollup merge of #97292 - compiler-errors:tcxify-rustc, r=davidtwco
Lifetime variance fixes for rustc #97287 migrates rustc to a `Ty` type that is invariant over its lifetime `'tcx`, so I need to fix a bunch of places that assume that `Ty<'a>` and `Ty<'b>` can be unified by shortening both to some common lifetime. This is doable, since many lifetimes are already `'tcx`, so all this PR does is be a bit more explicit that elided lifetimes are actually `'tcx`. Split out from #97287 so the compiler team can review independently.
This commit is contained in:
commit
f4bf64c3f0
22 changed files with 92 additions and 86 deletions
|
@ -171,7 +171,7 @@ impl<Tag> Allocation<Tag> {
|
|||
|
||||
/// Try to create an Allocation of `size` bytes, failing if there is not enough memory
|
||||
/// available to the compiler to do so.
|
||||
pub fn uninit(size: Size, align: Align, panic_on_fail: bool) -> InterpResult<'static, Self> {
|
||||
pub fn uninit<'tcx>(size: Size, align: Align, panic_on_fail: bool) -> InterpResult<'tcx, Self> {
|
||||
let bytes = Box::<[u8]>::try_new_zeroed_slice(size.bytes_usize()).map_err(|_| {
|
||||
// This results in an error that can happen non-deterministically, since the memory
|
||||
// available to the compiler can change between runs. Normally queries are always
|
||||
|
|
|
@ -397,38 +397,38 @@ impl<'tcx, Tag: Provenance> Scalar<Tag> {
|
|||
/// Converts the scalar to produce an unsigned integer of the given size.
|
||||
/// Fails if the scalar is a pointer.
|
||||
#[inline]
|
||||
pub fn to_uint(self, size: Size) -> InterpResult<'static, u128> {
|
||||
pub fn to_uint(self, size: Size) -> InterpResult<'tcx, u128> {
|
||||
self.to_bits(size)
|
||||
}
|
||||
|
||||
/// Converts the scalar to produce a `u8`. Fails if the scalar is a pointer.
|
||||
pub fn to_u8(self) -> InterpResult<'static, u8> {
|
||||
pub fn to_u8(self) -> InterpResult<'tcx, u8> {
|
||||
self.to_uint(Size::from_bits(8)).map(|v| u8::try_from(v).unwrap())
|
||||
}
|
||||
|
||||
/// Converts the scalar to produce a `u16`. Fails if the scalar is a pointer.
|
||||
pub fn to_u16(self) -> InterpResult<'static, u16> {
|
||||
pub fn to_u16(self) -> InterpResult<'tcx, u16> {
|
||||
self.to_uint(Size::from_bits(16)).map(|v| u16::try_from(v).unwrap())
|
||||
}
|
||||
|
||||
/// Converts the scalar to produce a `u32`. Fails if the scalar is a pointer.
|
||||
pub fn to_u32(self) -> InterpResult<'static, u32> {
|
||||
pub fn to_u32(self) -> InterpResult<'tcx, u32> {
|
||||
self.to_uint(Size::from_bits(32)).map(|v| u32::try_from(v).unwrap())
|
||||
}
|
||||
|
||||
/// Converts the scalar to produce a `u64`. Fails if the scalar is a pointer.
|
||||
pub fn to_u64(self) -> InterpResult<'static, u64> {
|
||||
pub fn to_u64(self) -> InterpResult<'tcx, u64> {
|
||||
self.to_uint(Size::from_bits(64)).map(|v| u64::try_from(v).unwrap())
|
||||
}
|
||||
|
||||
/// Converts the scalar to produce a `u128`. Fails if the scalar is a pointer.
|
||||
pub fn to_u128(self) -> InterpResult<'static, u128> {
|
||||
pub fn to_u128(self) -> InterpResult<'tcx, u128> {
|
||||
self.to_uint(Size::from_bits(128))
|
||||
}
|
||||
|
||||
/// Converts the scalar to produce a machine-pointer-sized unsigned integer.
|
||||
/// Fails if the scalar is a pointer.
|
||||
pub fn to_machine_usize(self, cx: &impl HasDataLayout) -> InterpResult<'static, u64> {
|
||||
pub fn to_machine_usize(self, cx: &impl HasDataLayout) -> InterpResult<'tcx, u64> {
|
||||
let b = self.to_uint(cx.data_layout().pointer_size)?;
|
||||
Ok(u64::try_from(b).unwrap())
|
||||
}
|
||||
|
@ -436,51 +436,51 @@ impl<'tcx, Tag: Provenance> Scalar<Tag> {
|
|||
/// Converts the scalar to produce a signed integer of the given size.
|
||||
/// Fails if the scalar is a pointer.
|
||||
#[inline]
|
||||
pub fn to_int(self, size: Size) -> InterpResult<'static, i128> {
|
||||
pub fn to_int(self, size: Size) -> InterpResult<'tcx, i128> {
|
||||
let b = self.to_bits(size)?;
|
||||
Ok(size.sign_extend(b) as i128)
|
||||
}
|
||||
|
||||
/// Converts the scalar to produce an `i8`. Fails if the scalar is a pointer.
|
||||
pub fn to_i8(self) -> InterpResult<'static, i8> {
|
||||
pub fn to_i8(self) -> InterpResult<'tcx, i8> {
|
||||
self.to_int(Size::from_bits(8)).map(|v| i8::try_from(v).unwrap())
|
||||
}
|
||||
|
||||
/// Converts the scalar to produce an `i16`. Fails if the scalar is a pointer.
|
||||
pub fn to_i16(self) -> InterpResult<'static, i16> {
|
||||
pub fn to_i16(self) -> InterpResult<'tcx, i16> {
|
||||
self.to_int(Size::from_bits(16)).map(|v| i16::try_from(v).unwrap())
|
||||
}
|
||||
|
||||
/// Converts the scalar to produce an `i32`. Fails if the scalar is a pointer.
|
||||
pub fn to_i32(self) -> InterpResult<'static, i32> {
|
||||
pub fn to_i32(self) -> InterpResult<'tcx, i32> {
|
||||
self.to_int(Size::from_bits(32)).map(|v| i32::try_from(v).unwrap())
|
||||
}
|
||||
|
||||
/// Converts the scalar to produce an `i64`. Fails if the scalar is a pointer.
|
||||
pub fn to_i64(self) -> InterpResult<'static, i64> {
|
||||
pub fn to_i64(self) -> InterpResult<'tcx, i64> {
|
||||
self.to_int(Size::from_bits(64)).map(|v| i64::try_from(v).unwrap())
|
||||
}
|
||||
|
||||
/// Converts the scalar to produce an `i128`. Fails if the scalar is a pointer.
|
||||
pub fn to_i128(self) -> InterpResult<'static, i128> {
|
||||
pub fn to_i128(self) -> InterpResult<'tcx, i128> {
|
||||
self.to_int(Size::from_bits(128))
|
||||
}
|
||||
|
||||
/// Converts the scalar to produce a machine-pointer-sized signed integer.
|
||||
/// Fails if the scalar is a pointer.
|
||||
pub fn to_machine_isize(self, cx: &impl HasDataLayout) -> InterpResult<'static, i64> {
|
||||
pub fn to_machine_isize(self, cx: &impl HasDataLayout) -> InterpResult<'tcx, i64> {
|
||||
let b = self.to_int(cx.data_layout().pointer_size)?;
|
||||
Ok(i64::try_from(b).unwrap())
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn to_f32(self) -> InterpResult<'static, Single> {
|
||||
pub fn to_f32(self) -> InterpResult<'tcx, Single> {
|
||||
// Going through `u32` to check size and truncation.
|
||||
Ok(Single::from_bits(self.to_u32()?.into()))
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn to_f64(self) -> InterpResult<'static, Double> {
|
||||
pub fn to_f64(self) -> InterpResult<'tcx, Double> {
|
||||
// Going through `u64` to check size and truncation.
|
||||
Ok(Double::from_bits(self.to_u64()?.into()))
|
||||
}
|
||||
|
@ -534,7 +534,7 @@ impl<Tag> ScalarMaybeUninit<Tag> {
|
|||
}
|
||||
|
||||
#[inline]
|
||||
pub fn check_init(self) -> InterpResult<'static, Scalar<Tag>> {
|
||||
pub fn check_init<'tcx>(self) -> InterpResult<'tcx, Scalar<Tag>> {
|
||||
match self {
|
||||
ScalarMaybeUninit::Scalar(scalar) => Ok(scalar),
|
||||
ScalarMaybeUninit::Uninit => throw_ub!(InvalidUninitBytes(None)),
|
||||
|
|
|
@ -13,6 +13,7 @@ use crate::ty::subst::{GenericArg, InternalSubsts, Subst, SubstsRef};
|
|||
use crate::ty::{self, List, Ty, TyCtxt};
|
||||
use crate::ty::{AdtDef, InstanceDef, Region, ScalarInt, UserTypeAnnotationIndex};
|
||||
|
||||
use rustc_data_structures::captures::Captures;
|
||||
use rustc_errors::ErrorGuaranteed;
|
||||
use rustc_hir::def::{CtorKind, Namespace};
|
||||
use rustc_hir::def_id::{DefId, LocalDefId, CRATE_DEF_ID};
|
||||
|
@ -484,7 +485,7 @@ impl<'tcx> Body<'tcx> {
|
|||
|
||||
/// Returns an iterator over all user-declared mutable locals.
|
||||
#[inline]
|
||||
pub fn mut_vars_iter<'a>(&'a self) -> impl Iterator<Item = Local> + 'a {
|
||||
pub fn mut_vars_iter<'a>(&'a self) -> impl Iterator<Item = Local> + Captures<'tcx> + 'a {
|
||||
(self.arg_count + 1..self.local_decls.len()).filter_map(move |index| {
|
||||
let local = Local::new(index);
|
||||
let decl = &self.local_decls[local];
|
||||
|
@ -498,7 +499,9 @@ impl<'tcx> Body<'tcx> {
|
|||
|
||||
/// Returns an iterator over all user-declared mutable arguments and locals.
|
||||
#[inline]
|
||||
pub fn mut_vars_and_args_iter<'a>(&'a self) -> impl Iterator<Item = Local> + 'a {
|
||||
pub fn mut_vars_and_args_iter<'a>(
|
||||
&'a self,
|
||||
) -> impl Iterator<Item = Local> + Captures<'tcx> + 'a {
|
||||
(1..self.local_decls.len()).filter_map(move |index| {
|
||||
let local = Local::new(index);
|
||||
let decl = &self.local_decls[local];
|
||||
|
|
|
@ -192,7 +192,7 @@ impl<'tcx> MirPatch<'tcx> {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn source_info_for_location(&self, body: &Body<'_>, loc: Location) -> SourceInfo {
|
||||
pub fn source_info_for_location(&self, body: &Body<'tcx>, loc: Location) -> SourceInfo {
|
||||
let data = match loc.block.index().checked_sub(body.basic_blocks().len()) {
|
||||
Some(new) => &self.new_blocks[new],
|
||||
None => &body[loc.block],
|
||||
|
|
|
@ -115,8 +115,6 @@ impl Hash for ObligationCause<'_> {
|
|||
}
|
||||
}
|
||||
|
||||
const MISC_OBLIGATION_CAUSE_CODE: ObligationCauseCode<'static> = MiscObligation;
|
||||
|
||||
impl<'tcx> ObligationCause<'tcx> {
|
||||
#[inline]
|
||||
pub fn new(
|
||||
|
@ -201,7 +199,7 @@ pub struct UnifyReceiverContext<'tcx> {
|
|||
|
||||
#[derive(Clone, Debug, PartialEq, Eq, Hash, Lift, Default)]
|
||||
pub struct InternedObligationCauseCode<'tcx> {
|
||||
/// `None` for `MISC_OBLIGATION_CAUSE_CODE` (a common case, occurs ~60% of
|
||||
/// `None` for `ObligationCauseCode::MiscObligation` (a common case, occurs ~60% of
|
||||
/// the time). `Some` otherwise.
|
||||
code: Option<Lrc<ObligationCauseCode<'tcx>>>,
|
||||
}
|
||||
|
@ -210,7 +208,11 @@ impl<'tcx> ObligationCauseCode<'tcx> {
|
|||
#[inline(always)]
|
||||
fn into(self) -> InternedObligationCauseCode<'tcx> {
|
||||
InternedObligationCauseCode {
|
||||
code: if let MISC_OBLIGATION_CAUSE_CODE = self { None } else { Some(Lrc::new(self)) },
|
||||
code: if let ObligationCauseCode::MiscObligation = self {
|
||||
None
|
||||
} else {
|
||||
Some(Lrc::new(self))
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -219,7 +221,7 @@ impl<'tcx> std::ops::Deref for InternedObligationCauseCode<'tcx> {
|
|||
type Target = ObligationCauseCode<'tcx>;
|
||||
|
||||
fn deref(&self) -> &Self::Target {
|
||||
self.code.as_deref().unwrap_or(&MISC_OBLIGATION_CAUSE_CODE)
|
||||
self.code.as_deref().unwrap_or(&ObligationCauseCode::MiscObligation)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -2163,7 +2163,7 @@ impl<'tcx> SizeSkeleton<'tcx> {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn same_size(self, other: SizeSkeleton<'_>) -> bool {
|
||||
pub fn same_size(self, other: SizeSkeleton<'tcx>) -> bool {
|
||||
match (self, other) {
|
||||
(SizeSkeleton::Known(a), SizeSkeleton::Known(b)) => a == b,
|
||||
(SizeSkeleton::Pointer { tail: a, .. }, SizeSkeleton::Pointer { tail: b, .. }) => {
|
||||
|
|
|
@ -109,13 +109,13 @@ impl<'tcx> fmt::Debug for GenericArg<'tcx> {
|
|||
}
|
||||
|
||||
impl<'tcx> Ord for GenericArg<'tcx> {
|
||||
fn cmp(&self, other: &GenericArg<'_>) -> Ordering {
|
||||
fn cmp(&self, other: &GenericArg<'tcx>) -> Ordering {
|
||||
self.unpack().cmp(&other.unpack())
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> PartialOrd for GenericArg<'tcx> {
|
||||
fn partial_cmp(&self, other: &GenericArg<'_>) -> Option<Ordering> {
|
||||
fn partial_cmp(&self, other: &GenericArg<'tcx>) -> Option<Ordering> {
|
||||
Some(self.cmp(&other))
|
||||
}
|
||||
}
|
||||
|
@ -233,7 +233,7 @@ pub type InternalSubsts<'tcx> = List<GenericArg<'tcx>>;
|
|||
|
||||
pub type SubstsRef<'tcx> = &'tcx InternalSubsts<'tcx>;
|
||||
|
||||
impl<'a, 'tcx> InternalSubsts<'tcx> {
|
||||
impl<'tcx> InternalSubsts<'tcx> {
|
||||
/// Checks whether all elements of this list are types, if so, transmute.
|
||||
pub fn try_as_type_list(&'tcx self) -> Option<&'tcx List<Ty<'tcx>>> {
|
||||
if self.iter().all(|arg| matches!(arg.unpack(), GenericArgKind::Type(_))) {
|
||||
|
@ -249,7 +249,7 @@ impl<'a, 'tcx> InternalSubsts<'tcx> {
|
|||
/// Closure substitutions have a particular structure controlled by the
|
||||
/// compiler that encodes information like the signature and closure kind;
|
||||
/// see `ty::ClosureSubsts` struct for more comments.
|
||||
pub fn as_closure(&'a self) -> ClosureSubsts<'a> {
|
||||
pub fn as_closure(&'tcx self) -> ClosureSubsts<'tcx> {
|
||||
ClosureSubsts { substs: self }
|
||||
}
|
||||
|
||||
|
@ -330,20 +330,20 @@ impl<'a, 'tcx> InternalSubsts<'tcx> {
|
|||
}
|
||||
|
||||
#[inline]
|
||||
pub fn types(&'a self) -> impl DoubleEndedIterator<Item = Ty<'tcx>> + 'a {
|
||||
pub fn types(&'tcx self) -> impl DoubleEndedIterator<Item = Ty<'tcx>> + 'tcx {
|
||||
self.iter()
|
||||
.filter_map(|k| if let GenericArgKind::Type(ty) = k.unpack() { Some(ty) } else { None })
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn regions(&'a self) -> impl DoubleEndedIterator<Item = ty::Region<'tcx>> + 'a {
|
||||
pub fn regions(&'tcx self) -> impl DoubleEndedIterator<Item = ty::Region<'tcx>> + 'tcx {
|
||||
self.iter().filter_map(|k| {
|
||||
if let GenericArgKind::Lifetime(lt) = k.unpack() { Some(lt) } else { None }
|
||||
})
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn consts(&'a self) -> impl DoubleEndedIterator<Item = ty::Const<'tcx>> + 'a {
|
||||
pub fn consts(&'tcx self) -> impl DoubleEndedIterator<Item = ty::Const<'tcx>> + 'tcx {
|
||||
self.iter().filter_map(|k| {
|
||||
if let GenericArgKind::Const(ct) = k.unpack() { Some(ct) } else { None }
|
||||
})
|
||||
|
@ -351,8 +351,8 @@ impl<'a, 'tcx> InternalSubsts<'tcx> {
|
|||
|
||||
#[inline]
|
||||
pub fn non_erasable_generics(
|
||||
&'a self,
|
||||
) -> impl DoubleEndedIterator<Item = GenericArgKind<'tcx>> + 'a {
|
||||
&'tcx self,
|
||||
) -> impl DoubleEndedIterator<Item = GenericArgKind<'tcx>> + 'tcx {
|
||||
self.iter().filter_map(|k| match k.unpack() {
|
||||
GenericArgKind::Lifetime(_) => None,
|
||||
generic => Some(generic),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue