@@ -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.
18981931fn implicitly_sized_clauses < ' a , ' subst , ' db > (
0 commit comments