@@ -1020,10 +1020,12 @@ pub trait PrettyPrinter<'tcx>: Printer<'tcx> + fmt::Write {
1020
1020
let mut fn_traits = FxIndexMap :: default ( ) ;
1021
1021
let mut lifetimes = SmallVec :: < [ ty:: Region < ' tcx > ; 1 ] > :: new ( ) ;
1022
1022
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 ;
1027
1029
1028
1030
for ( predicate, _) in bounds. iter_instantiated_copied ( tcx, args) {
1029
1031
let bound_predicate = predicate. kind ( ) ;
@@ -1035,17 +1037,17 @@ pub trait PrettyPrinter<'tcx>: Printer<'tcx> + fmt::Write {
1035
1037
if tcx. is_lang_item ( pred. def_id ( ) , LangItem :: Sized ) {
1036
1038
match pred. polarity {
1037
1039
ty:: PredicatePolarity :: Positive => {
1038
- has_sized_bound = true ;
1040
+ has_sized_pred = true ;
1039
1041
continue ;
1040
1042
}
1041
- ty:: PredicatePolarity :: Negative => has_negative_sized_bound = true ,
1043
+ ty:: PredicatePolarity :: Negative => has_negative_sized_pred = true ,
1042
1044
}
1043
1045
} else if tcx. is_lang_item ( pred. def_id ( ) , LangItem :: MetaSized ) {
1044
- has_metasized_bound = true ;
1046
+ has_metasized_pred = true ;
1045
1047
continue ;
1046
1048
} else if tcx. is_lang_item ( pred. def_id ( ) , LangItem :: PointeeSized ) {
1047
1049
// Unexpected - `PointeeSized` is the absence of bounds.
1048
- has_pointeesized_bound = true ;
1050
+ has_pointeesized_pred = true ;
1049
1051
continue ;
1050
1052
}
1051
1053
@@ -1073,6 +1075,13 @@ pub trait PrettyPrinter<'tcx>: Printer<'tcx> + fmt::Write {
1073
1075
ty:: ClauseKind :: TypeOutlives ( outlives) => {
1074
1076
lifetimes. push ( outlives. 1 ) ;
1075
1077
}
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
+ }
1076
1085
_ => { }
1077
1086
}
1078
1087
}
@@ -1081,7 +1090,7 @@ pub trait PrettyPrinter<'tcx>: Printer<'tcx> + fmt::Write {
1081
1090
1082
1091
let mut first = true ;
1083
1092
// 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 ;
1085
1094
1086
1095
for ( ( bound_args_and_self_ty, is_async) , entry) in fn_traits {
1087
1096
write ! ( self , "{}" , if first { "" } else { " + " } ) ?;
@@ -1216,24 +1225,31 @@ pub trait PrettyPrinter<'tcx>: Printer<'tcx> + fmt::Write {
1216
1225
}
1217
1226
1218
1227
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;
1221
1231
// 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) ;
1223
1234
if add_sized || add_maybe_sized {
1224
1235
if !first {
1225
1236
write ! ( self , " + " ) ?;
1226
1237
}
1227
1238
if add_maybe_sized {
1228
1239
write ! ( self , "?" ) ?;
1240
+ } else if has_const_sized_pred && using_sized_hierarchy {
1241
+ write ! ( self , "const " ) ?;
1229
1242
}
1230
1243
write ! ( self , "Sized" ) ?;
1231
- } else if has_metasized_bound && using_sized_hierarchy {
1244
+ } else if has_metasized_pred && using_sized_hierarchy {
1232
1245
if !first {
1233
1246
write ! ( self , " + " ) ?;
1234
1247
}
1248
+ if has_const_metasized_pred && using_sized_hierarchy {
1249
+ write ! ( self , "const " ) ?;
1250
+ }
1235
1251
write ! ( self , "MetaSized" ) ?;
1236
- } else if has_pointeesized_bound && using_sized_hierarchy {
1252
+ } else if has_pointeesized_pred && using_sized_hierarchy {
1237
1253
if !first {
1238
1254
write ! ( self , " + " ) ?;
1239
1255
}
0 commit comments