Remove DefId from EarlyParamRegion (type system)

This commit is contained in:
Boxy 2024-05-23 23:53:56 +01:00
parent b7b350cff7
commit bd6344d829
5 changed files with 38 additions and 44 deletions

View File

@ -538,11 +538,9 @@ fn check_opaque_precise_captures<'tcx>(tcx: TyCtxt<'tcx>, opaque_def_id: LocalDe
// the cases that were stabilized with the `impl_trait_projection` // the cases that were stabilized with the `impl_trait_projection`
// feature -- see <https://github.com/rust-lang/rust/pull/115659>. // feature -- see <https://github.com/rust-lang/rust/pull/115659>.
if let DefKind::LifetimeParam = tcx.def_kind(def_id) if let DefKind::LifetimeParam = tcx.def_kind(def_id)
&& let ty::ReEarlyParam(ty::EarlyParamRegion { def_id, .. }) && let Some(def_id) = tcx
| ty::ReLateParam(ty::LateParamRegion { .map_opaque_lifetime_to_parent_lifetime(def_id.expect_local())
bound_region: ty::BoundRegionKind::BrNamed(def_id, _), .opt_param_def_id(tcx, tcx.parent(opaque_def_id.to_def_id()))
..
}) = *tcx.map_opaque_lifetime_to_parent_lifetime(def_id.expect_local())
{ {
shadowed_captures.insert(def_id); shadowed_captures.insert(def_id);
} }
@ -585,12 +583,9 @@ fn check_opaque_precise_captures<'tcx>(tcx: TyCtxt<'tcx>, opaque_def_id: LocalDe
// Check if the lifetime param was captured but isn't named in the precise captures list. // Check if the lifetime param was captured but isn't named in the precise captures list.
if variances[param.index as usize] == ty::Invariant { if variances[param.index as usize] == ty::Invariant {
if let DefKind::OpaqueTy = tcx.def_kind(tcx.parent(param.def_id)) if let DefKind::OpaqueTy = tcx.def_kind(tcx.parent(param.def_id))
&& let ty::ReEarlyParam(ty::EarlyParamRegion { def_id, .. }) && let Some(def_id) = tcx
| ty::ReLateParam(ty::LateParamRegion {
bound_region: ty::BoundRegionKind::BrNamed(def_id, _),
..
}) = *tcx
.map_opaque_lifetime_to_parent_lifetime(param.def_id.expect_local()) .map_opaque_lifetime_to_parent_lifetime(param.def_id.expect_local())
.opt_param_def_id(tcx, tcx.parent(opaque_def_id.to_def_id()))
{ {
tcx.dcx().emit_err(errors::LifetimeNotCaptured { tcx.dcx().emit_err(errors::LifetimeNotCaptured {
opaque_span, opaque_span,

View File

@ -876,7 +876,8 @@ impl<'tcx> ty::FallibleTypeFolder<TyCtxt<'tcx>> for RemapHiddenTyRegions<'tcx> {
ty::ReLateParam(_) => {} ty::ReLateParam(_) => {}
// Remap early-bound regions as long as they don't come from the `impl` itself, // Remap early-bound regions as long as they don't come from the `impl` itself,
// in which case we don't really need to renumber them. // in which case we don't really need to renumber them.
ty::ReEarlyParam(ebr) if self.tcx.parent(ebr.def_id) != self.impl_def_id => {} ty::ReEarlyParam(ebr)
if ebr.index >= self.tcx.generics_of(self.impl_def_id).count() as u32 => {}
_ => return Ok(region), _ => return Ok(region),
} }
@ -889,12 +890,8 @@ impl<'tcx> ty::FallibleTypeFolder<TyCtxt<'tcx>> for RemapHiddenTyRegions<'tcx> {
); );
} }
} else { } else {
let guar = match region.kind() { let guar = match region.opt_param_def_id(self.tcx, self.tcx.parent(self.def_id)) {
ty::ReEarlyParam(ty::EarlyParamRegion { def_id, .. }) Some(def_id) => {
| ty::ReLateParam(ty::LateParamRegion {
bound_region: ty::BoundRegionKind::BrNamed(def_id, _),
..
}) => {
let return_span = if let ty::Alias(ty::Opaque, opaque_ty) = self.ty.kind() { let return_span = if let ty::Alias(ty::Opaque, opaque_ty) = self.ty.kind() {
self.tcx.def_span(opaque_ty.def_id) self.tcx.def_span(opaque_ty.def_id)
} else { } else {
@ -914,7 +911,7 @@ impl<'tcx> ty::FallibleTypeFolder<TyCtxt<'tcx>> for RemapHiddenTyRegions<'tcx> {
.with_note(format!("hidden type inferred to be `{}`", self.ty)) .with_note(format!("hidden type inferred to be `{}`", self.ty))
.emit() .emit()
} }
_ => { None => {
// This code path is not reached in any tests, but may be // This code path is not reached in any tests, but may be
// reachable. If this is triggered, it should be converted // reachable. If this is triggered, it should be converted
// to `delayed_bug` and the triggering case turned into a // to `delayed_bug` and the triggering case turned into a

View File

@ -2101,16 +2101,14 @@ fn lint_redundant_lifetimes<'tcx>(
} }
for &victim in &lifetimes[(idx + 1)..] { for &victim in &lifetimes[(idx + 1)..] {
// We should only have late-bound lifetimes of the `BrNamed` variety, // All region parameters should have a `DefId` available as:
// since we get these signatures straight from `hir_lowering`. And any // - Late-bound parameters should be of the`BrNamed` variety,
// other regions (ReError/ReStatic/etc.) shouldn't matter, since we // since we get these signatures straight from `hir_lowering`.
// - Early-bound parameters unconditionally have a `DefId` available.
//
// Any other regions (ReError/ReStatic/etc.) shouldn't matter, since we
// can't really suggest to remove them. // can't really suggest to remove them.
let (ty::ReEarlyParam(ty::EarlyParamRegion { def_id, .. }) let Some(def_id) = victim.opt_param_def_id(tcx, owner_id.to_def_id()) else {
| ty::ReLateParam(ty::LateParamRegion {
bound_region: ty::BoundRegionKind::BrNamed(def_id, _),
..
})) = victim.kind()
else {
continue; continue;
}; };

View File

@ -5,11 +5,11 @@ use rustc_hir as hir;
use rustc_hir::def::DefKind; use rustc_hir::def::DefKind;
use rustc_hir::def_id::{DefId, LocalDefId}; use rustc_hir::def_id::{DefId, LocalDefId};
use rustc_macros::LintDiagnostic; use rustc_macros::LintDiagnostic;
use rustc_middle::bug;
use rustc_middle::middle::resolve_bound_vars::ResolvedArg; use rustc_middle::middle::resolve_bound_vars::ResolvedArg;
use rustc_middle::ty::{ use rustc_middle::ty::{
self, Ty, TyCtxt, TypeSuperVisitable, TypeVisitable, TypeVisitableExt, TypeVisitor, self, Ty, TyCtxt, TypeSuperVisitable, TypeVisitable, TypeVisitableExt, TypeVisitor,
}; };
use rustc_middle::{bug, span_bug};
use rustc_session::{declare_lint, declare_lint_pass}; use rustc_session::{declare_lint, declare_lint_pass};
use rustc_span::{sym, BytePos, Span}; use rustc_span::{sym, BytePos, Span};
@ -303,20 +303,12 @@ impl<'tcx> TypeVisitor<TyCtxt<'tcx>> for VisitOpaqueTypes<'tcx> {
ResolvedArg::EarlyBound(def_id) | ResolvedArg::LateBound(_, _, def_id), ResolvedArg::EarlyBound(def_id) | ResolvedArg::LateBound(_, _, def_id),
) => { ) => {
if self.tcx.def_kind(self.tcx.parent(def_id)) == DefKind::OpaqueTy { if self.tcx.def_kind(self.tcx.parent(def_id)) == DefKind::OpaqueTy {
let (ty::ReEarlyParam(ty::EarlyParamRegion { def_id, .. }) let def_id = self
| ty::ReLateParam(ty::LateParamRegion {
bound_region: ty::BoundRegionKind::BrNamed(def_id, _),
..
})) = self
.tcx .tcx
.map_opaque_lifetime_to_parent_lifetime(def_id.expect_local()) .map_opaque_lifetime_to_parent_lifetime(def_id.expect_local())
.kind() .opt_param_def_id(self.tcx, self.parent_def_id.to_def_id())
else { .expect("variable should have been duplicated from parent");
span_bug!(
self.tcx.def_span(def_id),
"variable should have been duplicated from a parent"
);
};
explicitly_captured.insert(def_id); explicitly_captured.insert(def_id);
} else { } else {
explicitly_captured.insert(def_id); explicitly_captured.insert(def_id);

View File

@ -321,6 +321,21 @@ impl<'tcx> Region<'tcx> {
_ => bug!("expected region {:?} to be of kind ReVar", self), _ => bug!("expected region {:?} to be of kind ReVar", self),
} }
} }
/// Given some item `binding_item`, check if this region is a generic parameter introduced by it
/// or one of the parent generics. Returns the `DefId` of the parameter definition if so.
pub fn opt_param_def_id(self, tcx: TyCtxt<'tcx>, binding_item: DefId) -> Option<DefId> {
match self.kind() {
ty::ReEarlyParam(ebr) => {
Some(tcx.generics_of(binding_item).region_param(ebr, tcx).def_id)
}
ty::ReLateParam(ty::LateParamRegion {
bound_region: ty::BoundRegionKind::BrNamed(def_id, _),
..
}) => Some(def_id),
_ => None,
}
}
} }
impl<'tcx> Deref for Region<'tcx> { impl<'tcx> Deref for Region<'tcx> {
@ -335,16 +350,13 @@ impl<'tcx> Deref for Region<'tcx> {
#[derive(Copy, Clone, PartialEq, Eq, Hash, TyEncodable, TyDecodable)] #[derive(Copy, Clone, PartialEq, Eq, Hash, TyEncodable, TyDecodable)]
#[derive(HashStable)] #[derive(HashStable)]
pub struct EarlyParamRegion { pub struct EarlyParamRegion {
pub def_id: DefId,
pub index: u32, pub index: u32,
pub name: Symbol, pub name: Symbol,
} }
impl std::fmt::Debug for EarlyParamRegion { impl std::fmt::Debug for EarlyParamRegion {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
// FIXME(BoxyUwU): self.def_id goes first because of `erased-regions-in-hidden-ty.rs` being impossible to write write!(f, "{}/#{}", self.name, self.index)
// error annotations for otherwise. :). Ideally this would be `self.name, self.index, self.def_id`.
write!(f, "{:?}_{}/#{}", self.def_id, self.name, self.index)
} }
} }