remove from_forall

This commit is contained in:
lcnr
2025-08-08 14:02:42 +02:00
parent 53af067bb0
commit e1e1385ce0
5 changed files with 15 additions and 29 deletions

View File

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

View File

@@ -1939,10 +1939,15 @@ impl<'tcx> RegionInferenceContext<'tcx> {
// //
// and here we prefer to blame the source (the y = x statement). // and here we prefer to blame the source (the y = x statement).
let blame_source = match from_region_origin { let blame_source = match from_region_origin {
NllRegionVariableOrigin::FreeRegion NllRegionVariableOrigin::FreeRegion => true,
| NllRegionVariableOrigin::Existential { from_forall: false, name: _ } => true, NllRegionVariableOrigin::Placeholder(_) => false,
NllRegionVariableOrigin::Placeholder(_) // `'existential: 'whatever` never results in a region error by itself.
| NllRegionVariableOrigin::Existential { from_forall: true, name: _ } => false, // We may always infer it to `'static` afterall. This means while an error
// path may go through an existential, these existentials are never the
// `from_region`.
NllRegionVariableOrigin::Existential { name: _ } => {
unreachable!("existentials can outlive everything")
}
}; };
// To pick a constraint to blame, we organize constraints by how interesting we expect them // 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>>, T: TypeFoldable<TyCtxt<'tcx>>,
F: Fn() -> RegionCtxt, F: Fn() -> RegionCtxt,
{ {
let origin = NllRegionVariableOrigin::Existential { from_forall: false, name: None }; let origin = NllRegionVariableOrigin::Existential { name: None };
fold_regions(self.infcx.tcx, value, |_region, _depth| { fold_regions(self.infcx.tcx, value, |_region, _depth| {
self.infcx.next_nll_region_var(origin, || region_ctxt_fn()) self.infcx.next_nll_region_var(origin, || region_ctxt_fn())
}) })

View File

@@ -216,7 +216,7 @@ impl<'a, 'b, 'tcx> NllTypeRelating<'a, 'b, 'tcx> {
*ex_reg_var *ex_reg_var
} else { } else {
let ex_reg_var = let ex_reg_var =
self.next_existential_region_var(true, br.kind.get_name(infcx.infcx.tcx)); self.next_existential_region_var(br.kind.get_name(infcx.infcx.tcx));
debug!(?ex_reg_var); debug!(?ex_reg_var);
reg_map.insert(br, ex_reg_var); reg_map.insert(br, ex_reg_var);
@@ -244,17 +244,9 @@ impl<'a, 'b, 'tcx> NllTypeRelating<'a, 'b, 'tcx> {
} }
#[instrument(skip(self), level = "debug")] #[instrument(skip(self), level = "debug")]
fn next_existential_region_var( fn next_existential_region_var(&mut self, name: Option<Symbol>) -> ty::Region<'tcx> {
&mut self, let origin = NllRegionVariableOrigin::Existential { name };
from_forall: bool, self.type_checker.infcx.next_nll_region_var(origin, || RegionCtxt::Existential(name))
name: Option<Symbol>,
) -> ty::Region<'tcx> {
let origin = NllRegionVariableOrigin::Existential { name, from_forall };
let reg_var =
self.type_checker.infcx.next_nll_region_var(origin, || RegionCtxt::Existential(name));
reg_var
} }
#[instrument(skip(self), level = "debug")] #[instrument(skip(self), level = "debug")]

View File

@@ -485,17 +485,6 @@ pub enum NllRegionVariableOrigin {
Existential { Existential {
name: Option<Symbol>, 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)`.
/// Such variables are created when we are trying to figure out if there
/// is any valid instantiation of `'a` that could fit into some scenario.
///
/// This is used to inform error reporting: in the case that we are trying to
/// determine whether there is any valid instantiation of a `'a` variable that meets
/// some constraint C, we want to blame the "source" of that `for` type,
/// rather than blaming the source of the constraint C.
from_forall: bool,
}, },
} }