@@ -67,9 +67,9 @@ use crate::{
67
67
} ,
68
68
AliasEq , AliasTy , Binders , BoundVar , CallableSig , Const , ConstScalar , DebruijnIndex , DynTy ,
69
69
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 ,
73
73
} ;
74
74
75
75
#[ derive( Debug ) ]
@@ -1052,11 +1052,11 @@ impl<'a> TyLoweringContext<'a> {
1052
1052
self_ty : Ty ,
1053
1053
ignore_bindings : bool ,
1054
1054
) -> 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 ( ) {
1057
1057
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
1060
1060
. clone ( )
1061
1061
. filter ( |tr| {
1062
1062
// ignore `T: Drop` or `T: Destruct` bounds.
@@ -1092,8 +1092,8 @@ impl<'a> TyLoweringContext<'a> {
1092
1092
}
1093
1093
TypeBound :: ForLifetime ( _, path) => {
1094
1094
// 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)
1097
1097
}
1098
1098
TypeBound :: Lifetime ( l) => {
1099
1099
let lifetime = self . lower_lifetime ( l) ;
@@ -1104,8 +1104,8 @@ impl<'a> TyLoweringContext<'a> {
1104
1104
}
1105
1105
TypeBound :: Error => None ,
1106
1106
} ;
1107
- trait_ref . into_iter ( ) . chain (
1108
- bindings
1107
+ clause . into_iter ( ) . chain (
1108
+ trait_ref
1109
1109
. into_iter ( )
1110
1110
. filter ( move |_| !ignore_bindings)
1111
1111
. 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(
1624
1624
1625
1625
let subst = generics. bound_vars_subst ( db, DebruijnIndex :: INNERMOST ) ;
1626
1626
let explicitly_unsized_tys = ctx. unsized_types . into_inner ( ) ;
1627
- let implicitly_sized_predicates =
1627
+ if let Some ( implicitly_sized_predicates) =
1628
1628
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
+ }
1631
1635
predicates. into ( )
1632
1636
}
1633
1637
@@ -1685,24 +1689,23 @@ pub(crate) fn trait_environment_query(
1685
1689
let substs = TyBuilder :: placeholder_subst ( db, trait_id) ;
1686
1690
let trait_ref = TraitRef { trait_id : to_chalk_trait_id ( trait_id) , substitution : substs } ;
1687
1691
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 ) ) ;
1690
1693
}
1691
1694
1692
1695
let subst = generics ( db. upcast ( ) , def) . placeholder_subst ( db) ;
1693
1696
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
+ }
1702
1705
1703
1706
let env = chalk_ir:: Environment :: new ( Interner ) . add_clauses ( Interner , clauses) ;
1704
1707
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)
1706
1709
}
1707
1710
1708
1711
/// Resolve the where clause(s) of an item with generics.
@@ -1730,10 +1733,14 @@ pub(crate) fn generic_predicates_query(
1730
1733
1731
1734
let subst = generics. bound_vars_subst ( db, DebruijnIndex :: INNERMOST ) ;
1732
1735
let explicitly_unsized_tys = ctx. unsized_types . into_inner ( ) ;
1733
- let implicitly_sized_predicates =
1736
+ if let Some ( implicitly_sized_predicates) =
1734
1737
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
+ }
1737
1744
predicates. into ( )
1738
1745
}
1739
1746
@@ -1745,24 +1752,24 @@ fn implicitly_sized_clauses<'a>(
1745
1752
explicitly_unsized_tys : & ' a FxHashSet < Ty > ,
1746
1753
substitution : & ' a Substitution ,
1747
1754
resolver : & Resolver ,
1748
- ) -> impl Iterator < Item = WhereClause > + ' a {
1755
+ ) -> Option < impl Iterator < Item = WhereClause > + ' a > {
1749
1756
let is_trait_def = matches ! ( def, GenericDefId :: TraitId ( ..) ) ;
1750
1757
let generic_args = & substitution. as_slice ( Interner ) [ is_trait_def as usize ..] ;
1751
1758
let sized_trait = db
1752
1759
. lang_item ( resolver. krate ( ) , LangItem :: Sized )
1753
1760
. and_then ( |lang_item| lang_item. as_trait ( ) . map ( to_chalk_trait_id) ) ;
1754
1761
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
1757
1764
. iter ( )
1758
1765
. 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
+ } )
1764
1772
} )
1765
- } )
1766
1773
} )
1767
1774
}
1768
1775
0 commit comments