Track names of existentials

This commit is contained in:
Amanda Stjerna 2025-08-06 16:58:42 +02:00
parent 61e8869ed9
commit 648e3fc393
6 changed files with 8 additions and 6 deletions

View file

@ -157,7 +157,7 @@ fn region_definitions<'tcx>(
for info in var_infos.iter() {
let origin = match info.origin {
RegionVariableOrigin::Nll(origin) => origin,
_ => NllRegionVariableOrigin::Existential { from_forall: false },
_ => NllRegionVariableOrigin::Existential { from_forall: false, name: None },
};
let definition = RegionDefinition { origin, universe: info.universe, external_name: None };

View file

@ -52,7 +52,8 @@ fn render_region_vid<'tcx>(
bug!("only used for pretty printing")
}
},
NllRegionVariableOrigin::Existential { .. } => " (ex<'?>)".to_string(),
NllRegionVariableOrigin::Existential { name: Some(name), .. } => format!(" (ex<{name}>)"),
NllRegionVariableOrigin::Existential { .. } => format!(" (ex<'_>)"),
};
format!("{:?}{universe_str}{external_name_str}{extra_info}", rvid)

View file

@ -1940,9 +1940,9 @@ impl<'tcx> RegionInferenceContext<'tcx> {
// and here we prefer to blame the source (the y = x statement).
let blame_source = match from_region_origin {
NllRegionVariableOrigin::FreeRegion
| NllRegionVariableOrigin::Existential { from_forall: false } => true,
| NllRegionVariableOrigin::Existential { from_forall: false, name: _ } => true,
NllRegionVariableOrigin::Placeholder(_)
| NllRegionVariableOrigin::Existential { from_forall: true } => false,
| NllRegionVariableOrigin::Existential { from_forall: true, name: _ } => false,
};
// To pick a constraint to blame, we organize constraints by how interesting we expect them

View file

@ -66,7 +66,7 @@ impl<'a, 'tcx> RegionRenumberer<'a, 'tcx> {
T: TypeFoldable<TyCtxt<'tcx>>,
F: Fn() -> RegionCtxt,
{
let origin = NllRegionVariableOrigin::Existential { from_forall: false };
let origin = NllRegionVariableOrigin::Existential { from_forall: false, name: None };
fold_regions(self.infcx.tcx, value, |_region, _depth| {
self.infcx.next_nll_region_var(origin, || region_ctxt_fn())
})

View file

@ -249,7 +249,7 @@ impl<'a, 'b, 'tcx> NllTypeRelating<'a, 'b, 'tcx> {
from_forall: bool,
name: Option<Symbol>,
) -> ty::Region<'tcx> {
let origin = NllRegionVariableOrigin::Existential { from_forall };
let origin = NllRegionVariableOrigin::Existential { name, from_forall };
let reg_var =
self.type_checker.infcx.next_nll_region_var(origin, || RegionCtxt::Existential(name));

View file

@ -484,6 +484,7 @@ pub enum NllRegionVariableOrigin {
Placeholder(ty::PlaceholderRegion),
Existential {
name: Option<Symbol>,
/// If this is true, then this variable was created to represent a lifetime
/// bound in a `for` binder. For example, it might have been created to
/// represent the lifetime `'a` in a type like `for<'a> fn(&'a u32)`.