@@ -1064,10 +1064,12 @@ pub trait PrettyPrinter<'tcx>: Printer<'tcx> + fmt::Write {
10641064 let mut fn_traits = FxIndexMap :: default ( ) ;
10651065 let mut lifetimes = SmallVec :: < [ ty:: Region < ' tcx > ; 1 ] > :: new ( ) ;
10661066
1067- let mut has_sized_bound = false ;
1068- let mut has_negative_sized_bound = false ;
1069- let mut has_meta_sized_bound = false ;
1070- let mut has_pointee_sized_bound = false ;
1067+ let mut has_sized_pred = false ;
1068+ let mut has_const_sized_pred = false ;
1069+ let mut has_negative_sized_pred = false ;
1070+ let mut has_meta_sized_pred = false ;
1071+ let mut has_const_meta_sized_pred = false ;
1072+ let mut has_pointee_sized_pred = false ;
10711073
10721074 for ( predicate, _) in bounds. iter_instantiated_copied ( tcx, args) {
10731075 let bound_predicate = predicate. kind ( ) ;
@@ -1079,17 +1081,17 @@ pub trait PrettyPrinter<'tcx>: Printer<'tcx> + fmt::Write {
10791081 if tcx. is_lang_item ( pred. def_id ( ) , LangItem :: Sized ) {
10801082 match pred. polarity {
10811083 ty:: PredicatePolarity :: Positive => {
1082- has_sized_bound = true ;
1084+ has_sized_pred = true ;
10831085 continue ;
10841086 }
1085- ty:: PredicatePolarity :: Negative => has_negative_sized_bound = true ,
1087+ ty:: PredicatePolarity :: Negative => has_negative_sized_pred = true ,
10861088 }
10871089 } else if tcx. is_lang_item ( pred. def_id ( ) , LangItem :: MetaSized ) {
1088- has_meta_sized_bound = true ;
1090+ has_meta_sized_pred = true ;
10891091 continue ;
10901092 } else if tcx. is_lang_item ( pred. def_id ( ) , LangItem :: PointeeSized ) {
10911093 // Unexpected - `PointeeSized` is the absence of bounds.
1092- has_pointee_sized_bound = true ;
1094+ has_pointee_sized_pred = true ;
10931095 continue ;
10941096 }
10951097
@@ -1117,6 +1119,13 @@ pub trait PrettyPrinter<'tcx>: Printer<'tcx> + fmt::Write {
11171119 ty:: ClauseKind :: TypeOutlives ( outlives) => {
11181120 lifetimes. push ( outlives. 1 ) ;
11191121 }
1122+ ty:: ClauseKind :: HostEffect ( pred) => {
1123+ if tcx. is_lang_item ( pred. def_id ( ) , LangItem :: Sized ) {
1124+ has_const_sized_pred = true ;
1125+ } else if tcx. is_lang_item ( pred. def_id ( ) , LangItem :: MetaSized ) {
1126+ has_const_meta_sized_pred = true ;
1127+ }
1128+ }
11201129 _ => { }
11211130 }
11221131 }
@@ -1125,7 +1134,7 @@ pub trait PrettyPrinter<'tcx>: Printer<'tcx> + fmt::Write {
11251134
11261135 let mut first = true ;
11271136 // Insert parenthesis around (Fn(A, B) -> C) if the opaque ty has more than one other trait
1128- let paren_needed = fn_traits. len ( ) > 1 || traits. len ( ) > 0 || !has_sized_bound ;
1137+ let paren_needed = fn_traits. len ( ) > 1 || traits. len ( ) > 0 || !has_sized_pred ;
11291138
11301139 for ( ( bound_args_and_self_ty, is_async) , entry) in fn_traits {
11311140 write ! ( self , "{}" , if first { "" } else { " + " } ) ?;
@@ -1260,26 +1269,31 @@ pub trait PrettyPrinter<'tcx>: Printer<'tcx> + fmt::Write {
12601269 }
12611270
12621271 let using_sized_hierarchy = self . tcx ( ) . features ( ) . sized_hierarchy ( ) ;
1263- let add_sized = has_sized_bound && ( first || has_negative_sized_bound ) ;
1272+ let add_sized = has_sized_pred && ( first || has_negative_sized_pred ) ;
12641273 let add_maybe_sized =
1265- has_meta_sized_bound && !has_negative_sized_bound && !using_sized_hierarchy;
1274+ has_meta_sized_pred && !has_negative_sized_pred && !using_sized_hierarchy;
12661275 // Set `has_pointee_sized_bound` if there were no `Sized` or `MetaSized` bounds.
1267- has_pointee_sized_bound = has_pointee_sized_bound
1268- || ( !has_sized_bound && !has_meta_sized_bound && !has_negative_sized_bound ) ;
1276+ has_pointee_sized_pred = has_pointee_sized_pred
1277+ || ( !has_sized_pred && !has_meta_sized_pred && !has_negative_sized_pred ) ;
12691278 if add_sized || add_maybe_sized {
12701279 if !first {
12711280 write ! ( self , " + " ) ?;
12721281 }
12731282 if add_maybe_sized {
12741283 write ! ( self , "?" ) ?;
1284+ } else if has_const_sized_pred && using_sized_hierarchy {
1285+ write ! ( self , "const " ) ?;
12751286 }
12761287 write ! ( self , "Sized" ) ?;
1277- } else if has_meta_sized_bound && using_sized_hierarchy {
1288+ } else if has_meta_sized_pred && using_sized_hierarchy {
12781289 if !first {
12791290 write ! ( self , " + " ) ?;
12801291 }
1292+ if has_const_meta_sized_pred && using_sized_hierarchy {
1293+ write ! ( self , "const " ) ?;
1294+ }
12811295 write ! ( self , "MetaSized" ) ?;
1282- } else if has_pointee_sized_bound && using_sized_hierarchy {
1296+ } else if has_pointee_sized_pred && using_sized_hierarchy {
12831297 if !first {
12841298 write ! ( self , " + " ) ?;
12851299 }
0 commit comments