1- use super :: builder:: ClauseBuilder ;
1+ use super :: { builder:: ClauseBuilder , generalize } ;
22use crate :: { Interner , RustIrDatabase , TraitRef , WellKnownTrait } ;
3- use chalk_ir:: { Substitution , Ty , TyData } ;
3+ use chalk_ir:: { Substitution , Ty } ;
44
55mod clone;
66mod copy;
@@ -13,22 +13,35 @@ pub fn add_builtin_program_clauses<I: Interner>(
1313 builder : & mut ClauseBuilder < ' _ , I > ,
1414 well_known : WellKnownTrait ,
1515 trait_ref : & TraitRef < I > ,
16- ty : & TyData < I > ,
1716) {
18- if let Some ( force_impl) = db. force_impl_for ( well_known, ty) {
19- if force_impl {
20- builder. push_fact ( trait_ref. clone ( ) ) ;
17+ // If `trait_ref` contains bound vars, we want to universally quantify them.
18+ // `Generalize` collects them for us.
19+ let generalized = generalize:: Generalize :: apply ( db. interner ( ) , trait_ref) ;
20+
21+ builder. push_binders ( & generalized, |builder, trait_ref| {
22+ let self_ty = trait_ref. self_type_parameter ( db. interner ( ) ) ;
23+ let ty = self_ty. data ( db. interner ( ) ) ;
24+ if let Some ( force_impl) = db. force_impl_for ( well_known, ty) {
25+ if force_impl {
26+ builder. push_fact ( trait_ref. clone ( ) ) ;
27+ }
28+ return ;
2129 }
22- return ;
23- }
2430
25- match well_known {
26- WellKnownTrait :: SizedTrait => sized:: add_sized_program_clauses ( db, builder, trait_ref, ty) ,
27- WellKnownTrait :: CopyTrait => copy:: add_copy_program_clauses ( db, builder, trait_ref, ty) ,
28- WellKnownTrait :: CloneTrait => clone:: add_clone_program_clauses ( db, builder, trait_ref, ty) ,
29- // Drop impls are provided explicitly
30- WellKnownTrait :: DropTrait => ( ) ,
31- }
31+ match well_known {
32+ WellKnownTrait :: SizedTrait => {
33+ sized:: add_sized_program_clauses ( db, builder, & trait_ref, ty)
34+ }
35+ WellKnownTrait :: CopyTrait => {
36+ copy:: add_copy_program_clauses ( db, builder, & trait_ref, ty)
37+ }
38+ WellKnownTrait :: CloneTrait => {
39+ clone:: add_clone_program_clauses ( db, builder, & trait_ref, ty)
40+ }
41+ // Drop impls are provided explicitly
42+ WellKnownTrait :: DropTrait => ( ) ,
43+ }
44+ } ) ;
3245}
3346
3447/// Given a trait ref `T0: Trait` and a list of types `U0..Un`, pushes a clause of the form
0 commit comments