11use super :: { builder:: ClauseBuilder , generalize} ;
22use crate :: { Interner , RustIrDatabase , TraitRef , WellKnownTrait } ;
3- use chalk_ir:: { ProjectionTy , Substitution , Ty } ;
3+ use chalk_ir:: { ProjectionTy , Substitution , Ty , AliasTy } ;
44
55mod clone;
66mod copy;
7- mod fn_ ;
7+ mod fn_family ;
88mod sized;
99
1010/// For well known traits we have special hard-coded impls, either as an
@@ -34,7 +34,7 @@ pub fn add_builtin_program_clauses<I: Interner>(
3434 WellKnownTrait :: Copy => copy:: add_copy_program_clauses ( db, builder, & trait_ref, ty) ,
3535 WellKnownTrait :: Clone => clone:: add_clone_program_clauses ( db, builder, & trait_ref, ty) ,
3636 WellKnownTrait :: FnOnce | WellKnownTrait :: FnMut | WellKnownTrait :: Fn => {
37- fn_ :: add_fn_trait_program_clauses ( db, builder, trait_ref. trait_id , ty, false )
37+ fn_family :: add_fn_trait_program_clauses ( db, builder, trait_ref. trait_id , ty)
3838 }
3939 // Drop impls are provided explicitly
4040 WellKnownTrait :: Drop => ( ) ,
@@ -53,13 +53,9 @@ pub fn add_builtin_assoc_program_clauses<I: Interner>(
5353 match well_known {
5454 WellKnownTrait :: FnOnce => {
5555 let interner = db. interner ( ) ;
56- let self_ty = proj
57- . substitution
58- . at ( interner, 0 )
59- . assert_ty_ref ( interner)
60- . data ( interner) ;
56+ let self_ty = AliasTy :: Projection ( proj. clone ( ) ) . self_type_parameter ( interner) ;
6157 let trait_id = db. well_known_trait_id ( well_known) . unwrap ( ) ;
62- fn_ :: add_fn_trait_program_clauses ( db, builder, trait_id, self_ty, true ) ;
58+ fn_family :: add_fn_trait_program_clauses ( db, builder, trait_id, self_ty. data ( interner ) ) ;
6359 }
6460 _ => { }
6561 }
0 commit comments