Skip to content

Commit 3f0a563

Browse files
Lower ConstArgHasType predicate for each const param
This is required now that we send this clause to the solver.
1 parent 5038446 commit 3f0a563

File tree

1 file changed

+37
-4
lines changed

1 file changed

+37
-4
lines changed

crates/hir-ty/src/lower.rs

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,10 @@ use crate::{
5656
db::{HirDatabase, InternedOpaqueTyId},
5757
generics::{Generics, generics, trait_self_param_idx},
5858
next_solver::{
59-
AliasTy, Binder, BoundExistentialPredicates, Clause, Clauses, Const, DbInterner,
60-
EarlyBinder, EarlyParamRegion, ErrorGuaranteed, GenericArg, GenericArgs, ParamConst,
61-
ParamEnv, PolyFnSig, Predicate, Region, SolverDefId, TraitPredicate, TraitRef, Ty, Tys,
62-
UnevaluatedConst, abi::Safety,
59+
AliasTy, Binder, BoundExistentialPredicates, Clause, ClauseKind, Clauses, Const,
60+
DbInterner, EarlyBinder, EarlyParamRegion, ErrorGuaranteed, GenericArg, GenericArgs,
61+
ParamConst, ParamEnv, PolyFnSig, Predicate, Region, SolverDefId, TraitPredicate, TraitRef,
62+
Ty, Tys, UnevaluatedConst, abi::Safety,
6363
},
6464
};
6565

@@ -1651,6 +1651,8 @@ pub(crate) fn trait_environment_query<'db>(
16511651
clauses.push(pred);
16521652
}
16531653
}
1654+
1655+
push_const_arg_has_type_predicates(db, &mut clauses, maybe_parent_generics);
16541656
}
16551657

16561658
if let Some(trait_id) = def.assoc_trait_container(db) {
@@ -1788,6 +1790,8 @@ where
17881790
));
17891791
}
17901792

1793+
push_const_arg_has_type_predicates(db, &mut predicates, maybe_parent_generics);
1794+
17911795
if let Some(sized_trait) = sized_trait {
17921796
let mut add_sized_clause = |param_idx, param_id, param_data| {
17931797
let (
@@ -1893,6 +1897,35 @@ where
18931897
}
18941898
}
18951899

1900+
fn push_const_arg_has_type_predicates<'db>(
1901+
db: &'db dyn HirDatabase,
1902+
predicates: &mut Vec<Clause<'db>>,
1903+
generics: &Generics,
1904+
) {
1905+
let interner = DbInterner::new_with(db, None, None);
1906+
let const_params_offset = generics.len_parent() + generics.len_lifetimes_self();
1907+
for (param_index, (param_idx, param_data)) in generics.iter_self_type_or_consts().enumerate() {
1908+
if !matches!(param_data, TypeOrConstParamData::ConstParamData(_)) {
1909+
continue;
1910+
}
1911+
1912+
let param_id = ConstParamId::from_unchecked(TypeOrConstParamId {
1913+
parent: generics.def(),
1914+
local_id: param_idx,
1915+
});
1916+
predicates.push(Clause(
1917+
ClauseKind::ConstArgHasType(
1918+
Const::new_param(
1919+
interner,
1920+
ParamConst { id: param_id, index: (param_index + const_params_offset) as u32 },
1921+
),
1922+
db.const_param_ty_ns(param_id),
1923+
)
1924+
.upcast(interner),
1925+
));
1926+
}
1927+
}
1928+
18961929
/// Generate implicit `: Sized` predicates for all generics that has no `?Sized` bound.
18971930
/// Exception is Self of a trait def.
18981931
fn implicitly_sized_clauses<'a, 'subst, 'db>(

0 commit comments

Comments
 (0)