@@ -464,10 +464,14 @@ impl<'a> TyLoweringContext<'a> {
464
464
self . lower_trait_ref_from_path ( trait_ref. path , explicit_self_ty) . map ( |it| it. 0 )
465
465
}
466
466
467
+ /// When lowering predicates from parents (impl, traits) for children defs (fns, consts, types), `generics` should
468
+ /// contain the `Generics` for the **child**, while `predicate_owner` should contain the `GenericDefId` of the
469
+ /// **parent**. This is important so we generate the correct bound var/placeholder.
467
470
pub ( crate ) fn lower_where_predicate < ' b > (
468
471
& ' b mut self ,
469
472
where_predicate : & ' b WherePredicate ,
470
473
generics : & ' b Generics ,
474
+ predicate_owner : GenericDefId ,
471
475
ignore_bindings : bool ,
472
476
) -> impl Iterator < Item = QuantifiedWhereClause > + use < ' a , ' b > {
473
477
match where_predicate {
@@ -477,7 +481,7 @@ impl<'a> TyLoweringContext<'a> {
477
481
WherePredicateTypeTarget :: TypeRef ( type_ref) => self . lower_ty ( * type_ref) ,
478
482
& WherePredicateTypeTarget :: TypeOrConstParam ( local_id) => {
479
483
let param_id =
480
- hir_def:: TypeOrConstParamId { parent : generics . def ( ) , local_id } ;
484
+ hir_def:: TypeOrConstParamId { parent : predicate_owner , local_id } ;
481
485
match self . type_param_mode {
482
486
ParamLoweringMode :: Placeholder => {
483
487
TyKind :: Placeholder ( to_placeholder_idx ( self . db , param_id) )
@@ -887,7 +891,7 @@ pub(crate) fn generic_predicates_for_param_query(
887
891
if invalid_target {
888
892
// If this is filtered out without lowering, `?Sized` is not gathered into `ctx.unsized_types`
889
893
if let TypeBound :: Path ( _, TraitBoundModifier :: Maybe ) = bound {
890
- ctx. lower_where_predicate ( pred, generics, true ) . for_each ( drop) ;
894
+ ctx. lower_where_predicate ( pred, generics, generics . def ( ) , true ) . for_each ( drop) ;
891
895
}
892
896
return false ;
893
897
}
@@ -924,7 +928,7 @@ pub(crate) fn generic_predicates_for_param_query(
924
928
for pred in maybe_parent_generics. where_predicates ( ) {
925
929
if predicate ( pred, maybe_parent_generics, & mut ctx) {
926
930
predicates. extend (
927
- ctx. lower_where_predicate ( pred, maybe_parent_generics, true )
931
+ ctx. lower_where_predicate ( pred, & generics , maybe_parent_generics. def ( ) , true )
928
932
. map ( |p| make_binders ( db, & generics, p) ) ,
929
933
) ;
930
934
}
@@ -987,7 +991,9 @@ pub(crate) fn trait_environment_query(
987
991
{
988
992
ctx. store = maybe_parent_generics. store ( ) ;
989
993
for pred in maybe_parent_generics. where_predicates ( ) {
990
- for pred in ctx. lower_where_predicate ( pred, maybe_parent_generics, false ) {
994
+ for pred in
995
+ ctx. lower_where_predicate ( pred, & generics, maybe_parent_generics. def ( ) , false )
996
+ {
991
997
if let WhereClause :: Implemented ( tr) = pred. skip_binders ( ) {
992
998
traits_in_scope
993
999
. push ( ( tr. self_type_parameter ( Interner ) . clone ( ) , tr. hir_trait_id ( ) ) ) ;
@@ -1085,8 +1091,10 @@ where
1085
1091
ctx. store = maybe_parent_generics. store ( ) ;
1086
1092
for pred in maybe_parent_generics. where_predicates ( ) {
1087
1093
if filter ( pred, maybe_parent_generics. def ( ) ) {
1094
+ // We deliberately use `generics` and not `maybe_parent_generics` here. This is not a mistake!
1095
+ // If we use the parent generics
1088
1096
predicates. extend (
1089
- ctx. lower_where_predicate ( pred, maybe_parent_generics, false )
1097
+ ctx. lower_where_predicate ( pred, & generics , maybe_parent_generics. def ( ) , false )
1090
1098
. map ( |p| make_binders ( db, & generics, p) ) ,
1091
1099
) ;
1092
1100
}
0 commit comments