@@ -1064,10 +1064,12 @@ pub trait PrettyPrinter<'tcx>: Printer<'tcx> + fmt::Write {
1064
1064
let mut fn_traits = FxIndexMap :: default ( ) ;
1065
1065
let mut lifetimes = SmallVec :: < [ ty:: Region < ' tcx > ; 1 ] > :: new ( ) ;
1066
1066
1067
- let mut has_sized_bound = false ;
1068
- let mut has_negative_sized_bound = false ;
1069
- let mut has_metasized_bound = false ;
1070
- let mut has_pointeesized_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_metasized_pred = false ;
1071
+ let mut has_const_metasized_pred = false ;
1072
+ let mut has_pointeesized_pred = false ;
1071
1073
1072
1074
for ( predicate, _) in bounds. iter_instantiated_copied ( tcx, args) {
1073
1075
let bound_predicate = predicate. kind ( ) ;
@@ -1079,17 +1081,17 @@ pub trait PrettyPrinter<'tcx>: Printer<'tcx> + fmt::Write {
1079
1081
if tcx. is_lang_item ( pred. def_id ( ) , LangItem :: Sized ) {
1080
1082
match pred. polarity {
1081
1083
ty:: PredicatePolarity :: Positive => {
1082
- has_sized_bound = true ;
1084
+ has_sized_pred = true ;
1083
1085
continue ;
1084
1086
}
1085
- ty:: PredicatePolarity :: Negative => has_negative_sized_bound = true ,
1087
+ ty:: PredicatePolarity :: Negative => has_negative_sized_pred = true ,
1086
1088
}
1087
1089
} else if tcx. is_lang_item ( pred. def_id ( ) , LangItem :: MetaSized ) {
1088
- has_metasized_bound = true ;
1090
+ has_metasized_pred = true ;
1089
1091
continue ;
1090
1092
} else if tcx. is_lang_item ( pred. def_id ( ) , LangItem :: PointeeSized ) {
1091
1093
// Unexpected - `PointeeSized` is the absence of bounds.
1092
- has_pointeesized_bound = true ;
1094
+ has_pointeesized_pred = true ;
1093
1095
continue ;
1094
1096
}
1095
1097
@@ -1117,6 +1119,13 @@ pub trait PrettyPrinter<'tcx>: Printer<'tcx> + fmt::Write {
1117
1119
ty:: ClauseKind :: TypeOutlives ( outlives) => {
1118
1120
lifetimes. push ( outlives. 1 ) ;
1119
1121
}
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_metasized_pred = true ;
1127
+ }
1128
+ }
1120
1129
_ => { }
1121
1130
}
1122
1131
}
@@ -1125,7 +1134,7 @@ pub trait PrettyPrinter<'tcx>: Printer<'tcx> + fmt::Write {
1125
1134
1126
1135
let mut first = true ;
1127
1136
// 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 ;
1129
1138
1130
1139
for ( ( bound_args_and_self_ty, is_async) , entry) in fn_traits {
1131
1140
write ! ( self , "{}" , if first { "" } else { " + " } ) ?;
@@ -1260,26 +1269,31 @@ pub trait PrettyPrinter<'tcx>: Printer<'tcx> + fmt::Write {
1260
1269
}
1261
1270
1262
1271
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 ) ;
1264
1273
let add_maybe_sized =
1265
- has_metasized_bound && !has_negative_sized_bound && !using_sized_hierarchy;
1274
+ has_metasized_pred && !has_negative_sized_pred && !using_sized_hierarchy;
1266
1275
// Set `has_pointeesized_bound` if there were no `Sized` or `MetaSized` bounds.
1267
- has_pointeesized_bound = has_pointeesized_bound
1268
- || ( !has_sized_bound && !has_metasized_bound && !has_negative_sized_bound ) ;
1276
+ has_pointeesized_pred = has_pointeesized_pred
1277
+ || ( !has_sized_pred && !has_metasized_pred && !has_negative_sized_pred ) ;
1269
1278
if add_sized || add_maybe_sized {
1270
1279
if !first {
1271
1280
write ! ( self , " + " ) ?;
1272
1281
}
1273
1282
if add_maybe_sized {
1274
1283
write ! ( self , "?" ) ?;
1284
+ } else if has_const_sized_pred && using_sized_hierarchy {
1285
+ write ! ( self , "const " ) ?;
1275
1286
}
1276
1287
write ! ( self , "Sized" ) ?;
1277
- } else if has_metasized_bound && using_sized_hierarchy {
1288
+ } else if has_metasized_pred && using_sized_hierarchy {
1278
1289
if !first {
1279
1290
write ! ( self , " + " ) ?;
1280
1291
}
1292
+ if has_const_metasized_pred && using_sized_hierarchy {
1293
+ write ! ( self , "const " ) ?;
1294
+ }
1281
1295
write ! ( self , "MetaSized" ) ?;
1282
- } else if has_pointeesized_bound && using_sized_hierarchy {
1296
+ } else if has_pointeesized_pred && using_sized_hierarchy {
1283
1297
if !first {
1284
1298
write ! ( self , " + " ) ?;
1285
1299
}
0 commit comments