@@ -1743,24 +1743,48 @@ fn implicitly_sized_clauses<'a, 'subst: 'a>(
17431743 substitution : & ' subst Substitution ,
17441744 resolver : & Resolver ,
17451745) -> 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 ..] ;
17481746 let sized_trait = db
17491747 . 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) ) ? ;
17511749
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+ )
17551779 . filter_map ( |generic_arg| generic_arg. ty ( Interner ) )
17561780 . filter ( move |& self_ty| !explicitly_unsized_tys. contains ( self_ty) )
17571781 . map ( move |self_ty| {
17581782 WhereClause :: Implemented ( TraitRef {
17591783 trait_id : sized_trait,
17601784 substitution : Substitution :: from1 ( Interner , self_ty. clone ( ) ) ,
17611785 } )
1762- } )
1763- } )
1786+ } ) ,
1787+ )
17641788}
17651789
17661790#[ derive( Debug , Clone , PartialEq , Eq , Hash ) ]
0 commit comments