Make const bound handling more like types/regions.
Currently there is `Ty` and `BoundTy`, and `Region` and `BoundRegion`, and `Const` and... `BoundVar`. An annoying inconsistency. This commit repurposes the existing `BoundConst`, which was barely used, so it's the partner to `Const`. Unlike `BoundTy`/`BoundRegion` it lacks a `kind` field but it's still nice to have because it makes the const code more similar to the ty/region code everywhere. The commit also removes `impl From<BoundVar> for BoundTy`, which has a single use and doesn't seem worth it. These changes fix the "FIXME: We really should have a separate `BoundConst` for consts".
This commit is contained in:
@@ -752,7 +752,8 @@ impl<'cx, 'tcx> Canonicalizer<'cx, 'tcx> {
|
||||
) -> Ty<'tcx> {
|
||||
debug_assert!(!self.infcx.is_some_and(|infcx| ty_var != infcx.shallow_resolve(ty_var)));
|
||||
let var = self.canonical_var(var_kind, ty_var.into());
|
||||
Ty::new_bound(self.tcx, self.binder_index, var.into())
|
||||
let bt = ty::BoundTy { var, kind: ty::BoundTyKind::Anon };
|
||||
Ty::new_bound(self.tcx, self.binder_index, bt)
|
||||
}
|
||||
|
||||
/// Given a type variable `const_var` of the given kind, first check
|
||||
@@ -768,6 +769,7 @@ impl<'cx, 'tcx> Canonicalizer<'cx, 'tcx> {
|
||||
!self.infcx.is_some_and(|infcx| ct_var != infcx.shallow_resolve_const(ct_var))
|
||||
);
|
||||
let var = self.canonical_var(var_kind, ct_var.into());
|
||||
ty::Const::new_bound(self.tcx, self.binder_index, var)
|
||||
let bc = ty::BoundConst { var };
|
||||
ty::Const::new_bound(self.tcx, self.binder_index, bc)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -133,7 +133,7 @@ impl<'tcx> TypeFolder<TyCtxt<'tcx>> for CanonicalInstantiator<'tcx> {
|
||||
fn fold_const(&mut self, ct: ty::Const<'tcx>) -> ty::Const<'tcx> {
|
||||
match ct.kind() {
|
||||
ty::ConstKind::Bound(debruijn, bound_const) if debruijn == self.current_index => {
|
||||
self.var_values[bound_const.as_usize()].expect_const()
|
||||
self.var_values[bound_const.var.as_usize()].expect_const()
|
||||
}
|
||||
_ => ct.super_fold_with(self),
|
||||
}
|
||||
@@ -217,7 +217,7 @@ fn highest_var_in_clauses<'tcx>(c: ty::Clauses<'tcx>) -> usize {
|
||||
if let ty::ConstKind::Bound(debruijn, bound_const) = ct.kind()
|
||||
&& debruijn == self.current_index
|
||||
{
|
||||
self.max_var = self.max_var.max(bound_const.as_usize());
|
||||
self.max_var = self.max_var.max(bound_const.var.as_usize());
|
||||
} else if ct.has_vars_bound_at_or_above(self.current_index) {
|
||||
ct.super_visit_with(self);
|
||||
}
|
||||
|
||||
@@ -433,12 +433,12 @@ impl<'tcx> InferCtxt<'tcx> {
|
||||
}
|
||||
GenericArgKind::Lifetime(result_value) => {
|
||||
// e.g., here `result_value` might be `'?1` in the example above...
|
||||
if let ty::ReBound(debruijn, br) = result_value.kind() {
|
||||
if let ty::ReBound(debruijn, b) = result_value.kind() {
|
||||
// ... in which case we would set `canonical_vars[0]` to `Some('static)`.
|
||||
|
||||
// We only allow a `ty::INNERMOST` index in generic parameters.
|
||||
assert_eq!(debruijn, ty::INNERMOST);
|
||||
opt_values[br.var] = Some(*original_value);
|
||||
opt_values[b.var] = Some(*original_value);
|
||||
}
|
||||
}
|
||||
GenericArgKind::Const(result_value) => {
|
||||
@@ -447,7 +447,7 @@ impl<'tcx> InferCtxt<'tcx> {
|
||||
|
||||
// We only allow a `ty::INNERMOST` index in generic parameters.
|
||||
assert_eq!(debruijn, ty::INNERMOST);
|
||||
opt_values[b] = Some(*original_value);
|
||||
opt_values[b.var] = Some(*original_value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1208,8 +1208,8 @@ impl<'tcx> InferCtxt<'tcx> {
|
||||
fn replace_ty(&mut self, bt: ty::BoundTy) -> Ty<'tcx> {
|
||||
self.args[bt.var.index()].expect_ty()
|
||||
}
|
||||
fn replace_const(&mut self, bv: ty::BoundVar) -> ty::Const<'tcx> {
|
||||
self.args[bv.index()].expect_const()
|
||||
fn replace_const(&mut self, bc: ty::BoundConst) -> ty::Const<'tcx> {
|
||||
self.args[bc.var.index()].expect_const()
|
||||
}
|
||||
}
|
||||
let delegate = ToFreshVars { args };
|
||||
|
||||
@@ -45,10 +45,10 @@ impl<'tcx> InferCtxt<'tcx> {
|
||||
ty::PlaceholderType { universe: next_universe, bound: bound_ty },
|
||||
)
|
||||
},
|
||||
consts: &mut |bound_var: ty::BoundVar| {
|
||||
consts: &mut |bound_const: ty::BoundConst| {
|
||||
ty::Const::new_placeholder(
|
||||
self.tcx,
|
||||
ty::PlaceholderConst { universe: next_universe, bound: bound_var },
|
||||
ty::PlaceholderConst { universe: next_universe, bound: bound_const },
|
||||
)
|
||||
},
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user