@@ -1743,24 +1743,48 @@ fn implicitly_sized_clauses<'a, 'subst: 'a>(
1743
1743
substitution : & ' subst Substitution ,
1744
1744
resolver : & Resolver ,
1745
1745
) -> Option < impl Iterator < Item = WhereClause > + Captures < ' a > + Captures < ' subst > > {
1746
- let is_trait_def = matches ! ( def, GenericDefId :: TraitId ( ..) ) ;
1747
- let generic_args = & substitution. as_slice ( Interner ) [ is_trait_def as usize ..] ;
1748
1746
let sized_trait = db
1749
1747
. lang_item ( resolver. krate ( ) , LangItem :: Sized )
1750
- . and_then ( |lang_item| lang_item. as_trait ( ) . map ( to_chalk_trait_id) ) ;
1748
+ . and_then ( |lang_item| lang_item. as_trait ( ) . map ( to_chalk_trait_id) ) ? ;
1751
1749
1752
- sized_trait. map ( move |sized_trait| {
1753
- generic_args
1754
- . iter ( )
1750
+ let get_trait_self_idx = |container : ItemContainerId | {
1751
+ if matches ! ( container, ItemContainerId :: TraitId ( _) ) {
1752
+ let generics = generics ( db. upcast ( ) , def) ;
1753
+ Some ( generics. len_self ( ) )
1754
+ } else {
1755
+ None
1756
+ }
1757
+ } ;
1758
+ let trait_self_idx = match def {
1759
+ GenericDefId :: TraitId ( _) => Some ( 0 ) ,
1760
+ GenericDefId :: FunctionId ( it) => get_trait_self_idx ( it. lookup ( db. upcast ( ) ) . container ) ,
1761
+ GenericDefId :: ConstId ( it) => get_trait_self_idx ( it. lookup ( db. upcast ( ) ) . container ) ,
1762
+ GenericDefId :: TypeAliasId ( it) => get_trait_self_idx ( it. lookup ( db. upcast ( ) ) . container ) ,
1763
+ _ => None ,
1764
+ } ;
1765
+
1766
+ Some (
1767
+ substitution
1768
+ . iter ( Interner )
1769
+ . enumerate ( )
1770
+ . filter_map (
1771
+ move |( idx, generic_arg) | {
1772
+ if Some ( idx) == trait_self_idx {
1773
+ None
1774
+ } else {
1775
+ Some ( generic_arg)
1776
+ }
1777
+ } ,
1778
+ )
1755
1779
. filter_map ( |generic_arg| generic_arg. ty ( Interner ) )
1756
1780
. filter ( move |& self_ty| !explicitly_unsized_tys. contains ( self_ty) )
1757
1781
. map ( move |self_ty| {
1758
1782
WhereClause :: Implemented ( TraitRef {
1759
1783
trait_id : sized_trait,
1760
1784
substitution : Substitution :: from1 ( Interner , self_ty. clone ( ) ) ,
1761
1785
} )
1762
- } )
1763
- } )
1786
+ } ) ,
1787
+ )
1764
1788
}
1765
1789
1766
1790
#[ derive( Debug , Clone , PartialEq , Eq , Hash ) ]
0 commit comments