@@ -67,9 +67,9 @@ use crate::{
6767 } ,
6868 AliasEq , AliasTy , Binders , BoundVar , CallableSig , Const , ConstScalar , DebruijnIndex , DynTy ,
6969 FnAbi , FnPointer , FnSig , FnSubst , ImplTrait , ImplTraitId , ImplTraits , Interner , Lifetime ,
70- LifetimeData , LifetimeOutlives , ParamKind , PolyFnSig , ProjectionTy , QuantifiedWhereClause ,
71- QuantifiedWhereClauses , Substitution , TraitEnvironment , TraitRef , TraitRefExt , Ty , TyBuilder ,
72- TyKind , WhereClause ,
70+ LifetimeData , LifetimeOutlives , ParamKind , PolyFnSig , ProgramClause , ProjectionTy ,
71+ QuantifiedWhereClause , QuantifiedWhereClauses , Substitution , TraitEnvironment , TraitRef ,
72+ TraitRefExt , Ty , TyBuilder , TyKind , WhereClause ,
7373} ;
7474
7575#[ derive( Debug ) ]
@@ -1052,11 +1052,11 @@ impl<'a> TyLoweringContext<'a> {
10521052 self_ty : Ty ,
10531053 ignore_bindings : bool ,
10541054 ) -> impl Iterator < Item = QuantifiedWhereClause > + ' a {
1055- let mut bindings = None ;
1056- let trait_ref = match bound. as_ref ( ) {
1055+ let mut trait_ref = None ;
1056+ let clause = match bound. as_ref ( ) {
10571057 TypeBound :: Path ( path, TraitBoundModifier :: None ) => {
1058- bindings = self . lower_trait_ref_from_path ( path, Some ( self_ty) ) ;
1059- bindings
1058+ trait_ref = self . lower_trait_ref_from_path ( path, Some ( self_ty) ) ;
1059+ trait_ref
10601060 . clone ( )
10611061 . filter ( |tr| {
10621062 // ignore `T: Drop` or `T: Destruct` bounds.
@@ -1092,8 +1092,8 @@ impl<'a> TyLoweringContext<'a> {
10921092 }
10931093 TypeBound :: ForLifetime ( _, path) => {
10941094 // FIXME Don't silently drop the hrtb lifetimes here
1095- bindings = self . lower_trait_ref_from_path ( path, Some ( self_ty) ) ;
1096- bindings . clone ( ) . map ( WhereClause :: Implemented ) . map ( crate :: wrap_empty_binders)
1095+ trait_ref = self . lower_trait_ref_from_path ( path, Some ( self_ty) ) ;
1096+ trait_ref . clone ( ) . map ( WhereClause :: Implemented ) . map ( crate :: wrap_empty_binders)
10971097 }
10981098 TypeBound :: Lifetime ( l) => {
10991099 let lifetime = self . lower_lifetime ( l) ;
@@ -1104,8 +1104,8 @@ impl<'a> TyLoweringContext<'a> {
11041104 }
11051105 TypeBound :: Error => None ,
11061106 } ;
1107- trait_ref . into_iter ( ) . chain (
1108- bindings
1107+ clause . into_iter ( ) . chain (
1108+ trait_ref
11091109 . into_iter ( )
11101110 . filter ( move |_| !ignore_bindings)
11111111 . flat_map ( move |tr| self . assoc_type_bindings_from_type_bound ( bound, tr) ) ,
@@ -1624,10 +1624,14 @@ pub(crate) fn generic_predicates_for_param_query(
16241624
16251625 let subst = generics. bound_vars_subst ( db, DebruijnIndex :: INNERMOST ) ;
16261626 let explicitly_unsized_tys = ctx. unsized_types . into_inner ( ) ;
1627- let implicitly_sized_predicates =
1627+ if let Some ( implicitly_sized_predicates) =
16281628 implicitly_sized_clauses ( db, param_id. parent , & explicitly_unsized_tys, & subst, & resolver)
1629- . map ( |p| make_binders ( db, & generics, crate :: wrap_empty_binders ( p) ) ) ;
1630- predicates. extend ( implicitly_sized_predicates) ;
1629+ {
1630+ predicates. extend (
1631+ implicitly_sized_predicates
1632+ . map ( |p| make_binders ( db, & generics, crate :: wrap_empty_binders ( p) ) ) ,
1633+ ) ;
1634+ }
16311635 predicates. into ( )
16321636}
16331637
@@ -1685,24 +1689,23 @@ pub(crate) fn trait_environment_query(
16851689 let substs = TyBuilder :: placeholder_subst ( db, trait_id) ;
16861690 let trait_ref = TraitRef { trait_id : to_chalk_trait_id ( trait_id) , substitution : substs } ;
16871691 let pred = WhereClause :: Implemented ( trait_ref) ;
1688- let program_clause: chalk_ir:: ProgramClause < Interner > = pred. cast ( Interner ) ;
1689- clauses. push ( program_clause. into_from_env_clause ( Interner ) ) ;
1692+ clauses. push ( pred. cast :: < ProgramClause > ( Interner ) . into_from_env_clause ( Interner ) ) ;
16901693 }
16911694
16921695 let subst = generics ( db. upcast ( ) , def) . placeholder_subst ( db) ;
16931696 let explicitly_unsized_tys = ctx. unsized_types . into_inner ( ) ;
1694- let implicitly_sized_clauses =
1695- implicitly_sized_clauses ( db, def, & explicitly_unsized_tys, & subst, & resolver) . map ( |pred| {
1696- let program_clause : chalk_ir :: ProgramClause < Interner > = pred . cast ( Interner ) ;
1697- program_clause . into_from_env_clause ( Interner )
1698- } ) ;
1699- clauses . extend ( implicitly_sized_clauses ) ;
1700-
1701- let krate = def . module ( db . upcast ( ) ) . krate ( ) ;
1697+ if let Some ( implicitly_sized_clauses) =
1698+ implicitly_sized_clauses ( db, def, & explicitly_unsized_tys, & subst, & resolver)
1699+ {
1700+ clauses . extend (
1701+ implicitly_sized_clauses
1702+ . map ( |pred| pred . cast :: < ProgramClause > ( Interner ) . into_from_env_clause ( Interner ) ) ,
1703+ ) ;
1704+ }
17021705
17031706 let env = chalk_ir:: Environment :: new ( Interner ) . add_clauses ( Interner , clauses) ;
17041707
1705- TraitEnvironment :: new ( krate, None , traits_in_scope. into_boxed_slice ( ) , env)
1708+ TraitEnvironment :: new ( resolver . krate ( ) , None , traits_in_scope. into_boxed_slice ( ) , env)
17061709}
17071710
17081711/// Resolve the where clause(s) of an item with generics.
@@ -1730,10 +1733,14 @@ pub(crate) fn generic_predicates_query(
17301733
17311734 let subst = generics. bound_vars_subst ( db, DebruijnIndex :: INNERMOST ) ;
17321735 let explicitly_unsized_tys = ctx. unsized_types . into_inner ( ) ;
1733- let implicitly_sized_predicates =
1736+ if let Some ( implicitly_sized_predicates) =
17341737 implicitly_sized_clauses ( db, def, & explicitly_unsized_tys, & subst, & resolver)
1735- . map ( |p| make_binders ( db, & generics, crate :: wrap_empty_binders ( p) ) ) ;
1736- predicates. extend ( implicitly_sized_predicates) ;
1738+ {
1739+ predicates. extend (
1740+ implicitly_sized_predicates
1741+ . map ( |p| make_binders ( db, & generics, crate :: wrap_empty_binders ( p) ) ) ,
1742+ ) ;
1743+ }
17371744 predicates. into ( )
17381745}
17391746
@@ -1745,24 +1752,24 @@ fn implicitly_sized_clauses<'a>(
17451752 explicitly_unsized_tys : & ' a FxHashSet < Ty > ,
17461753 substitution : & ' a Substitution ,
17471754 resolver : & Resolver ,
1748- ) -> impl Iterator < Item = WhereClause > + ' a {
1755+ ) -> Option < impl Iterator < Item = WhereClause > + ' a > {
17491756 let is_trait_def = matches ! ( def, GenericDefId :: TraitId ( ..) ) ;
17501757 let generic_args = & substitution. as_slice ( Interner ) [ is_trait_def as usize ..] ;
17511758 let sized_trait = db
17521759 . lang_item ( resolver. krate ( ) , LangItem :: Sized )
17531760 . and_then ( |lang_item| lang_item. as_trait ( ) . map ( to_chalk_trait_id) ) ;
17541761
1755- sized_trait. into_iter ( ) . flat_map ( move |sized_trait| {
1756- let implicitly_sized_tys = generic_args
1762+ sized_trait. map ( move |sized_trait| {
1763+ generic_args
17571764 . iter ( )
17581765 . filter_map ( |generic_arg| generic_arg. ty ( Interner ) )
1759- . filter ( move |& self_ty| !explicitly_unsized_tys. contains ( self_ty) ) ;
1760- implicitly_sized_tys. map ( move |self_ty| {
1761- WhereClause :: Implemented ( TraitRef {
1762- trait_id : sized_trait,
1763- substitution : Substitution :: from1 ( Interner , self_ty. clone ( ) ) ,
1766+ . filter ( move |& self_ty| !explicitly_unsized_tys. contains ( self_ty) )
1767+ . map ( move |self_ty| {
1768+ WhereClause :: Implemented ( TraitRef {
1769+ trait_id : sized_trait,
1770+ substitution : Substitution :: from1 ( Interner , self_ty. clone ( ) ) ,
1771+ } )
17641772 } )
1765- } )
17661773 } )
17671774}
17681775
0 commit comments