@@ -1020,10 +1020,12 @@ pub trait PrettyPrinter<'tcx>: Printer<'tcx> + fmt::Write {
10201020 let mut fn_traits = FxIndexMap :: default ( ) ;
10211021 let mut lifetimes = SmallVec :: < [ ty:: Region < ' tcx > ; 1 ] > :: new ( ) ;
10221022
1023- let mut has_sized_bound = false ;
1024- let mut has_negative_sized_bound = false ;
1025- let mut has_metasized_bound = false ;
1026- let mut has_pointeesized_bound = false ;
1023+ let mut has_sized_pred = false ;
1024+ let mut has_const_sized_pred = false ;
1025+ let mut has_negative_sized_pred = false ;
1026+ let mut has_metasized_pred = false ;
1027+ let mut has_const_metasized_pred = false ;
1028+ let mut has_pointeesized_pred = false ;
10271029
10281030 for ( predicate, _) in bounds. iter_instantiated_copied ( tcx, args) {
10291031 let bound_predicate = predicate. kind ( ) ;
@@ -1035,17 +1037,17 @@ pub trait PrettyPrinter<'tcx>: Printer<'tcx> + fmt::Write {
10351037 if tcx. is_lang_item ( pred. def_id ( ) , LangItem :: Sized ) {
10361038 match pred. polarity {
10371039 ty:: PredicatePolarity :: Positive => {
1038- has_sized_bound = true ;
1040+ has_sized_pred = true ;
10391041 continue ;
10401042 }
1041- ty:: PredicatePolarity :: Negative => has_negative_sized_bound = true ,
1043+ ty:: PredicatePolarity :: Negative => has_negative_sized_pred = true ,
10421044 }
10431045 } else if tcx. is_lang_item ( pred. def_id ( ) , LangItem :: MetaSized ) {
1044- has_metasized_bound = true ;
1046+ has_metasized_pred = true ;
10451047 continue ;
10461048 } else if tcx. is_lang_item ( pred. def_id ( ) , LangItem :: PointeeSized ) {
10471049 // Unexpected - `PointeeSized` is the absence of bounds.
1048- has_pointeesized_bound = true ;
1050+ has_pointeesized_pred = true ;
10491051 continue ;
10501052 }
10511053
@@ -1073,6 +1075,13 @@ pub trait PrettyPrinter<'tcx>: Printer<'tcx> + fmt::Write {
10731075 ty:: ClauseKind :: TypeOutlives ( outlives) => {
10741076 lifetimes. push ( outlives. 1 ) ;
10751077 }
1078+ ty:: ClauseKind :: HostEffect ( pred) => {
1079+ if tcx. is_lang_item ( pred. def_id ( ) , LangItem :: Sized ) {
1080+ has_const_sized_pred = true ;
1081+ } else if tcx. is_lang_item ( pred. def_id ( ) , LangItem :: MetaSized ) {
1082+ has_const_metasized_pred = true ;
1083+ }
1084+ }
10761085 _ => { }
10771086 }
10781087 }
@@ -1081,7 +1090,7 @@ pub trait PrettyPrinter<'tcx>: Printer<'tcx> + fmt::Write {
10811090
10821091 let mut first = true ;
10831092 // Insert parenthesis around (Fn(A, B) -> C) if the opaque ty has more than one other trait
1084- let paren_needed = fn_traits. len ( ) > 1 || traits. len ( ) > 0 || !has_sized_bound ;
1093+ let paren_needed = fn_traits. len ( ) > 1 || traits. len ( ) > 0 || !has_sized_pred ;
10851094
10861095 for ( ( bound_args_and_self_ty, is_async) , entry) in fn_traits {
10871096 write ! ( self , "{}" , if first { "" } else { " + " } ) ?;
@@ -1216,24 +1225,31 @@ pub trait PrettyPrinter<'tcx>: Printer<'tcx> + fmt::Write {
12161225 }
12171226
12181227 let using_sized_hierarchy = self . tcx ( ) . features ( ) . sized_hierarchy ( ) ;
1219- let add_sized = has_sized_bound && ( first || has_negative_sized_bound) ;
1220- let add_maybe_sized = has_metasized_bound && !has_negative_sized_bound && !using_sized_hierarchy;
1228+ let add_sized = has_sized_pred && ( first || has_negative_sized_pred) ;
1229+ let add_maybe_sized =
1230+ has_metasized_pred && !has_negative_sized_pred && !using_sized_hierarchy;
12211231 // Set `has_pointeesized_bound` if there were no `Sized` or `MetaSized` bounds.
1222- has_pointeesized_bound = has_pointeesized_bound || ( !has_sized_bound && !has_metasized_bound && !has_negative_sized_bound) ;
1232+ has_pointeesized_pred = has_pointeesized_pred
1233+ || ( !has_sized_pred && !has_metasized_pred && !has_negative_sized_pred) ;
12231234 if add_sized || add_maybe_sized {
12241235 if !first {
12251236 write ! ( self , " + " ) ?;
12261237 }
12271238 if add_maybe_sized {
12281239 write ! ( self , "?" ) ?;
1240+ } else if has_const_sized_pred && using_sized_hierarchy {
1241+ write ! ( self , "const " ) ?;
12291242 }
12301243 write ! ( self , "Sized" ) ?;
1231- } else if has_metasized_bound && using_sized_hierarchy {
1244+ } else if has_metasized_pred && using_sized_hierarchy {
12321245 if !first {
12331246 write ! ( self , " + " ) ?;
12341247 }
1248+ if has_const_metasized_pred && using_sized_hierarchy {
1249+ write ! ( self , "const " ) ?;
1250+ }
12351251 write ! ( self , "MetaSized" ) ?;
1236- } else if has_pointeesized_bound && using_sized_hierarchy {
1252+ } else if has_pointeesized_pred && using_sized_hierarchy {
12371253 if !first {
12381254 write ! ( self , " + " ) ?;
12391255 }
0 commit comments