@@ -15,14 +15,11 @@ use smallvec::{SmallVec, smallvec};
1515use thin_vec:: ThinVec ;
1616use tracing:: instrument;
1717
18- use super :: errors:: {
19- InvalidAbi , InvalidAbiSuggestion , MisplacedRelaxTraitBound , TupleStructWithDefault ,
20- UnionWithDefault ,
21- } ;
18+ use super :: errors:: { InvalidAbi , InvalidAbiSuggestion , TupleStructWithDefault , UnionWithDefault } ;
2219use super :: stability:: { enabled_names, gate_unstable_abi} ;
2320use super :: {
24- AstOwner , FnDeclKind , ImplTraitContext , ImplTraitPosition , LoweringContext , ParamMode ,
25- ResolverAstLoweringExt ,
21+ AstOwner , FnDeclKind , ImplTraitContext , ImplTraitPosition , LoweringContext ,
22+ MaybeBoundForbiddenReason , MaybeBoundPolicy , ParamMode , ResolverAstLoweringExt ,
2623} ;
2724
2825pub ( super ) struct ItemLowerer < ' a , ' hir > {
@@ -427,6 +424,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
427424 |this| {
428425 let bounds = this. lower_param_bounds (
429426 bounds,
427+ MaybeBoundPolicy :: Forbidden ( MaybeBoundForbiddenReason :: SuperTrait ) ,
430428 ImplTraitContext :: Disallowed ( ImplTraitPosition :: Bound ) ,
431429 ) ;
432430 let items = this. arena . alloc_from_iter (
@@ -447,6 +445,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
447445 |this| {
448446 this. lower_param_bounds (
449447 bounds,
448+ MaybeBoundPolicy :: Allowed ,
450449 ImplTraitContext :: Disallowed ( ImplTraitPosition :: Bound ) ,
451450 )
452451 } ,
@@ -938,6 +937,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
938937 hir:: TraitItemKind :: Type (
939938 this. lower_param_bounds (
940939 bounds,
940+ MaybeBoundPolicy :: Allowed ,
941941 ImplTraitContext :: Disallowed ( ImplTraitPosition :: Generic ) ,
942942 ) ,
943943 ty,
@@ -1703,61 +1703,6 @@ impl<'hir> LoweringContext<'_, 'hir> {
17031703 assert ! ( self . impl_trait_defs. is_empty( ) ) ;
17041704 assert ! ( self . impl_trait_bounds. is_empty( ) ) ;
17051705
1706- // Error if `?Trait` bounds in where clauses don't refer directly to type parameters.
1707- // Note: we used to clone these bounds directly onto the type parameter (and avoid lowering
1708- // these into hir when we lower thee where clauses), but this makes it quite difficult to
1709- // keep track of the Span info. Now, `<dyn HirTyLowerer>::add_implicit_sized_bound`
1710- // checks both param bounds and where clauses for `?Sized`.
1711- for pred in & generics. where_clause . predicates {
1712- let WherePredicateKind :: BoundPredicate ( bound_pred) = & pred. kind else {
1713- continue ;
1714- } ;
1715- let compute_is_param = || {
1716- // Check if the where clause type is a plain type parameter.
1717- match self
1718- . resolver
1719- . get_partial_res ( bound_pred. bounded_ty . id )
1720- . and_then ( |r| r. full_res ( ) )
1721- {
1722- Some ( Res :: Def ( DefKind :: TyParam , def_id) )
1723- if bound_pred. bound_generic_params . is_empty ( ) =>
1724- {
1725- generics
1726- . params
1727- . iter ( )
1728- . any ( |p| def_id == self . local_def_id ( p. id ) . to_def_id ( ) )
1729- }
1730- // Either the `bounded_ty` is not a plain type parameter, or
1731- // it's not found in the generic type parameters list.
1732- _ => false ,
1733- }
1734- } ;
1735- // We only need to compute this once per `WherePredicate`, but don't
1736- // need to compute this at all unless there is a Maybe bound.
1737- let mut is_param: Option < bool > = None ;
1738- for bound in & bound_pred. bounds {
1739- if !matches ! (
1740- * bound,
1741- GenericBound :: Trait ( PolyTraitRef {
1742- modifiers: TraitBoundModifiers { polarity: BoundPolarity :: Maybe ( _) , .. } ,
1743- ..
1744- } )
1745- ) {
1746- continue ;
1747- }
1748- let is_param = * is_param. get_or_insert_with ( compute_is_param) ;
1749- if !is_param && !self . tcx . features ( ) . more_maybe_bounds ( ) {
1750- self . tcx
1751- . sess
1752- . create_feature_err (
1753- MisplacedRelaxTraitBound { span : bound. span ( ) } ,
1754- sym:: more_maybe_bounds,
1755- )
1756- . emit ( ) ;
1757- }
1758- }
1759- }
1760-
17611706 let mut predicates: SmallVec < [ hir:: WherePredicate < ' hir > ; 4 ] > = SmallVec :: new ( ) ;
17621707 predicates. extend ( generics. params . iter ( ) . filter_map ( |param| {
17631708 self . lower_generic_bound_predicate (
@@ -1767,6 +1712,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
17671712 & param. bounds ,
17681713 param. colon_span ,
17691714 generics. span ,
1715+ MaybeBoundPolicy :: Allowed ,
17701716 itctx,
17711717 PredicateOrigin :: GenericParam ,
17721718 )
@@ -1776,7 +1722,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
17761722 . where_clause
17771723 . predicates
17781724 . iter ( )
1779- . map ( |predicate| self . lower_where_predicate ( predicate) ) ,
1725+ . map ( |predicate| self . lower_where_predicate ( predicate, & generics . params ) ) ,
17801726 ) ;
17811727
17821728 let mut params: SmallVec < [ hir:: GenericParam < ' hir > ; 4 ] > = self
@@ -1853,6 +1799,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
18531799 bounds : & [ GenericBound ] ,
18541800 colon_span : Option < Span > ,
18551801 parent_span : Span ,
1802+ mbp : MaybeBoundPolicy < ' _ > ,
18561803 itctx : ImplTraitContext ,
18571804 origin : PredicateOrigin ,
18581805 ) -> Option < hir:: WherePredicate < ' hir > > {
@@ -1861,7 +1808,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
18611808 return None ;
18621809 }
18631810
1864- let bounds = self . lower_param_bounds ( bounds, itctx) ;
1811+ let bounds = self . lower_param_bounds ( bounds, mbp , itctx) ;
18651812
18661813 let param_span = ident. span ;
18671814
@@ -1913,7 +1860,11 @@ impl<'hir> LoweringContext<'_, 'hir> {
19131860 Some ( hir:: WherePredicate { hir_id, span, kind } )
19141861 }
19151862
1916- fn lower_where_predicate ( & mut self , pred : & WherePredicate ) -> hir:: WherePredicate < ' hir > {
1863+ fn lower_where_predicate (
1864+ & mut self ,
1865+ pred : & WherePredicate ,
1866+ params : & [ ast:: GenericParam ] ,
1867+ ) -> hir:: WherePredicate < ' hir > {
19171868 let hir_id = self . lower_node_id ( pred. id ) ;
19181869 let span = self . lower_span ( pred. span ) ;
19191870 self . lower_attrs ( hir_id, & pred. attrs , span) ;
@@ -1922,17 +1873,28 @@ impl<'hir> LoweringContext<'_, 'hir> {
19221873 bound_generic_params,
19231874 bounded_ty,
19241875 bounds,
1925- } ) => hir:: WherePredicateKind :: BoundPredicate ( hir:: WhereBoundPredicate {
1926- bound_generic_params : self
1927- . lower_generic_params ( bound_generic_params, hir:: GenericParamSource :: Binder ) ,
1928- bounded_ty : self
1929- . lower_ty ( bounded_ty, ImplTraitContext :: Disallowed ( ImplTraitPosition :: Bound ) ) ,
1930- bounds : self . lower_param_bounds (
1931- bounds,
1932- ImplTraitContext :: Disallowed ( ImplTraitPosition :: Bound ) ,
1933- ) ,
1934- origin : PredicateOrigin :: WhereClause ,
1935- } ) ,
1876+ } ) => {
1877+ let mbp = match bound_generic_params. is_empty ( ) {
1878+ true => MaybeBoundPolicy :: AllowedIfOwnTyParam ( bounded_ty. id , params) ,
1879+ false => MaybeBoundPolicy :: Forbidden ( MaybeBoundForbiddenReason :: Other ) ,
1880+ } ;
1881+ hir:: WherePredicateKind :: BoundPredicate ( hir:: WhereBoundPredicate {
1882+ bound_generic_params : self . lower_generic_params (
1883+ bound_generic_params,
1884+ hir:: GenericParamSource :: Binder ,
1885+ ) ,
1886+ bounded_ty : self . lower_ty (
1887+ bounded_ty,
1888+ ImplTraitContext :: Disallowed ( ImplTraitPosition :: Bound ) ,
1889+ ) ,
1890+ bounds : self . lower_param_bounds (
1891+ bounds,
1892+ mbp,
1893+ ImplTraitContext :: Disallowed ( ImplTraitPosition :: Bound ) ,
1894+ ) ,
1895+ origin : PredicateOrigin :: WhereClause ,
1896+ } )
1897+ }
19361898 WherePredicateKind :: RegionPredicate ( WhereRegionPredicate { lifetime, bounds } ) => {
19371899 hir:: WherePredicateKind :: RegionPredicate ( hir:: WhereRegionPredicate {
19381900 lifetime : self . lower_lifetime (
@@ -1942,6 +1904,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
19421904 ) ,
19431905 bounds : self . lower_param_bounds (
19441906 bounds,
1907+ MaybeBoundPolicy :: Allowed ,
19451908 ImplTraitContext :: Disallowed ( ImplTraitPosition :: Bound ) ,
19461909 ) ,
19471910 in_where_clause : true ,
0 commit comments