@@ -1071,10 +1071,12 @@ pub trait PrettyPrinter<'tcx>: Printer<'tcx> + fmt::Write {
10711071 let mut fn_traits = FxIndexMap :: default ( ) ;
10721072 let mut lifetimes = SmallVec :: < [ ty:: Region < ' tcx > ; 1 ] > :: new ( ) ;
10731073
1074- let mut has_sized_bound = false ;
1075- let mut has_negative_sized_bound = false ;
1076- let mut has_meta_sized_bound = false ;
1077- let mut has_pointee_sized_bound = false ;
1074+ let mut has_sized_pred = false ;
1075+ let mut has_const_sized_pred = false ;
1076+ let mut has_negative_sized_pred = false ;
1077+ let mut has_meta_sized_pred = false ;
1078+ let mut has_const_meta_sized_pred = false ;
1079+ let mut has_pointee_sized_pred = false ;
10781080
10791081 for ( predicate, _) in bounds. iter_instantiated_copied ( tcx, args) {
10801082 let bound_predicate = predicate. kind ( ) ;
@@ -1086,17 +1088,17 @@ pub trait PrettyPrinter<'tcx>: Printer<'tcx> + fmt::Write {
10861088 if tcx. is_lang_item ( pred. def_id ( ) , LangItem :: Sized ) {
10871089 match pred. polarity {
10881090 ty:: PredicatePolarity :: Positive => {
1089- has_sized_bound = true ;
1091+ has_sized_pred = true ;
10901092 continue ;
10911093 }
1092- ty:: PredicatePolarity :: Negative => has_negative_sized_bound = true ,
1094+ ty:: PredicatePolarity :: Negative => has_negative_sized_pred = true ,
10931095 }
10941096 } else if tcx. is_lang_item ( pred. def_id ( ) , LangItem :: MetaSized ) {
1095- has_meta_sized_bound = true ;
1097+ has_meta_sized_pred = true ;
10961098 continue ;
10971099 } else if tcx. is_lang_item ( pred. def_id ( ) , LangItem :: PointeeSized ) {
10981100 // Unexpected - `PointeeSized` is the absence of bounds.
1099- has_pointee_sized_bound = true ;
1101+ has_pointee_sized_pred = true ;
11001102 continue ;
11011103 }
11021104
@@ -1124,6 +1126,13 @@ pub trait PrettyPrinter<'tcx>: Printer<'tcx> + fmt::Write {
11241126 ty:: ClauseKind :: TypeOutlives ( outlives) => {
11251127 lifetimes. push ( outlives. 1 ) ;
11261128 }
1129+ ty:: ClauseKind :: HostEffect ( pred) => {
1130+ if tcx. is_lang_item ( pred. def_id ( ) , LangItem :: Sized ) {
1131+ has_const_sized_pred = true ;
1132+ } else if tcx. is_lang_item ( pred. def_id ( ) , LangItem :: MetaSized ) {
1133+ has_const_meta_sized_pred = true ;
1134+ }
1135+ }
11271136 _ => { }
11281137 }
11291138 }
@@ -1132,7 +1141,7 @@ pub trait PrettyPrinter<'tcx>: Printer<'tcx> + fmt::Write {
11321141
11331142 let mut first = true ;
11341143 // Insert parenthesis around (Fn(A, B) -> C) if the opaque ty has more than one other trait
1135- let paren_needed = fn_traits. len ( ) > 1 || traits. len ( ) > 0 || !has_sized_bound ;
1144+ let paren_needed = fn_traits. len ( ) > 1 || traits. len ( ) > 0 || !has_sized_pred ;
11361145
11371146 for ( ( bound_args_and_self_ty, is_async) , entry) in fn_traits {
11381147 write ! ( self , "{}" , if first { "" } else { " + " } ) ?;
@@ -1267,26 +1276,31 @@ pub trait PrettyPrinter<'tcx>: Printer<'tcx> + fmt::Write {
12671276 }
12681277
12691278 let using_sized_hierarchy = self . tcx ( ) . features ( ) . sized_hierarchy ( ) ;
1270- let add_sized = has_sized_bound && ( first || has_negative_sized_bound ) ;
1279+ let add_sized = has_sized_pred && ( first || has_negative_sized_pred ) ;
12711280 let add_maybe_sized =
1272- has_meta_sized_bound && !has_negative_sized_bound && !using_sized_hierarchy;
1281+ has_meta_sized_pred && !has_negative_sized_pred && !using_sized_hierarchy;
12731282 // Set `has_pointee_sized_bound` if there were no `Sized` or `MetaSized` bounds.
1274- has_pointee_sized_bound = has_pointee_sized_bound
1275- || ( !has_sized_bound && !has_meta_sized_bound && !has_negative_sized_bound ) ;
1283+ has_pointee_sized_pred = has_pointee_sized_pred
1284+ || ( !has_sized_pred && !has_meta_sized_pred && !has_negative_sized_pred ) ;
12761285 if add_sized || add_maybe_sized {
12771286 if !first {
12781287 write ! ( self , " + " ) ?;
12791288 }
12801289 if add_maybe_sized {
12811290 write ! ( self , "?" ) ?;
1291+ } else if has_const_sized_pred && using_sized_hierarchy {
1292+ write ! ( self , "const " ) ?;
12821293 }
12831294 write ! ( self , "Sized" ) ?;
1284- } else if has_meta_sized_bound && using_sized_hierarchy {
1295+ } else if has_meta_sized_pred && using_sized_hierarchy {
12851296 if !first {
12861297 write ! ( self , " + " ) ?;
12871298 }
1299+ if has_const_meta_sized_pred && using_sized_hierarchy {
1300+ write ! ( self , "const " ) ?;
1301+ }
12881302 write ! ( self , "MetaSized" ) ?;
1289- } else if has_pointee_sized_bound && using_sized_hierarchy {
1303+ } else if has_pointee_sized_pred && using_sized_hierarchy {
12901304 if !first {
12911305 write ! ( self , " + " ) ?;
12921306 }
0 commit comments