@@ -1004,10 +1004,12 @@ pub trait PrettyPrinter<'tcx>: Printer<'tcx> + fmt::Write {
10041004 let mut fn_traits = FxIndexMap :: default ( ) ;
10051005 let mut lifetimes = SmallVec :: < [ ty:: Region < ' tcx > ; 1 ] > :: new ( ) ;
10061006
1007- let mut has_sized_bound = false ;
1008- let mut has_negative_sized_bound = false ;
1009- let mut has_metasized_bound = false ;
1010- let mut has_pointeesized_bound = false ;
1007+ let mut has_sized_pred = false ;
1008+ let mut has_const_sized_pred = false ;
1009+ let mut has_negative_sized_pred = false ;
1010+ let mut has_metasized_pred = false ;
1011+ let mut has_const_metasized_pred = false ;
1012+ let mut has_pointeesized_pred = false ;
10111013
10121014 for ( predicate, _) in bounds. iter_instantiated_copied ( tcx, args) {
10131015 let bound_predicate = predicate. kind ( ) ;
@@ -1019,17 +1021,17 @@ pub trait PrettyPrinter<'tcx>: Printer<'tcx> + fmt::Write {
10191021 if tcx. is_lang_item ( pred. def_id ( ) , LangItem :: Sized ) {
10201022 match pred. polarity {
10211023 ty:: PredicatePolarity :: Positive => {
1022- has_sized_bound = true ;
1024+ has_sized_pred = true ;
10231025 continue ;
10241026 }
1025- ty:: PredicatePolarity :: Negative => has_negative_sized_bound = true ,
1027+ ty:: PredicatePolarity :: Negative => has_negative_sized_pred = true ,
10261028 }
10271029 } else if tcx. is_lang_item ( pred. def_id ( ) , LangItem :: MetaSized ) {
1028- has_metasized_bound = true ;
1030+ has_metasized_pred = true ;
10291031 continue ;
10301032 } else if tcx. is_lang_item ( pred. def_id ( ) , LangItem :: PointeeSized ) {
10311033 // Unexpected - `PointeeSized` is the absence of bounds.
1032- has_pointeesized_bound = true ;
1034+ has_pointeesized_pred = true ;
10331035 continue ;
10341036 }
10351037
@@ -1057,6 +1059,13 @@ pub trait PrettyPrinter<'tcx>: Printer<'tcx> + fmt::Write {
10571059 ty:: ClauseKind :: TypeOutlives ( outlives) => {
10581060 lifetimes. push ( outlives. 1 ) ;
10591061 }
1062+ ty:: ClauseKind :: HostEffect ( pred) => {
1063+ if tcx. is_lang_item ( pred. def_id ( ) , LangItem :: Sized ) {
1064+ has_const_sized_pred = true ;
1065+ } else if tcx. is_lang_item ( pred. def_id ( ) , LangItem :: MetaSized ) {
1066+ has_const_metasized_pred = true ;
1067+ }
1068+ }
10601069 _ => { }
10611070 }
10621071 }
@@ -1065,7 +1074,7 @@ pub trait PrettyPrinter<'tcx>: Printer<'tcx> + fmt::Write {
10651074
10661075 let mut first = true ;
10671076 // Insert parenthesis around (Fn(A, B) -> C) if the opaque ty has more than one other trait
1068- let paren_needed = fn_traits. len ( ) > 1 || traits. len ( ) > 0 || !has_sized_bound ;
1077+ let paren_needed = fn_traits. len ( ) > 1 || traits. len ( ) > 0 || !has_sized_pred ;
10691078
10701079 for ( ( bound_args_and_self_ty, is_async) , entry) in fn_traits {
10711080 write ! ( self , "{}" , if first { "" } else { " + " } ) ?;
@@ -1196,24 +1205,31 @@ pub trait PrettyPrinter<'tcx>: Printer<'tcx> + fmt::Write {
11961205 }
11971206
11981207 let using_sized_hierarchy = self . tcx ( ) . features ( ) . sized_hierarchy ( ) ;
1199- let add_sized = has_sized_bound && ( first || has_negative_sized_bound) ;
1200- let add_maybe_sized = has_metasized_bound && !has_negative_sized_bound && !using_sized_hierarchy;
1208+ let add_sized = has_sized_pred && ( first || has_negative_sized_pred) ;
1209+ let add_maybe_sized =
1210+ has_metasized_pred && !has_negative_sized_pred && !using_sized_hierarchy;
12011211 // Set `has_pointeesized_bound` if there were no `Sized` or `MetaSized` bounds.
1202- has_pointeesized_bound = has_pointeesized_bound || ( !has_sized_bound && !has_metasized_bound && !has_negative_sized_bound) ;
1212+ has_pointeesized_pred = has_pointeesized_pred
1213+ || ( !has_sized_pred && !has_metasized_pred && !has_negative_sized_pred) ;
12031214 if add_sized || add_maybe_sized {
12041215 if !first {
12051216 write ! ( self , " + " ) ?;
12061217 }
12071218 if add_maybe_sized {
12081219 write ! ( self , "?" ) ?;
1220+ } else if has_const_sized_pred && using_sized_hierarchy {
1221+ write ! ( self , "const " ) ?;
12091222 }
12101223 write ! ( self , "Sized" ) ?;
1211- } else if has_metasized_bound && using_sized_hierarchy {
1224+ } else if has_metasized_pred && using_sized_hierarchy {
12121225 if !first {
12131226 write ! ( self , " + " ) ?;
12141227 }
1228+ if has_const_metasized_pred && using_sized_hierarchy {
1229+ write ! ( self , "const " ) ?;
1230+ }
12151231 write ! ( self , "MetaSized" ) ?;
1216- } else if has_pointeesized_bound && using_sized_hierarchy {
1232+ } else if has_pointeesized_pred && using_sized_hierarchy {
12171233 if !first {
12181234 write ! ( self , " + " ) ?;
12191235 }
0 commit comments