@@ -205,6 +205,7 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
205205 self . note_obligation_cause_code (
206206 & mut err,
207207 & obligation. predicate ,
208+ obligation. param_env ,
208209 obligation. cause . code ( ) ,
209210 & mut vec ! [ ] ,
210211 & mut Default :: default ( ) ,
@@ -288,7 +289,11 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
288289 match bound_predicate. skip_binder ( ) {
289290 ty:: PredicateKind :: Trait ( trait_predicate) => {
290291 let trait_predicate = bound_predicate. rebind ( trait_predicate) ;
291- let trait_predicate = self . resolve_vars_if_possible ( trait_predicate) ;
292+ let mut trait_predicate = self . resolve_vars_if_possible ( trait_predicate) ;
293+
294+ trait_predicate. remap_constness_diag ( obligation. param_env ) ;
295+ let predicate_is_const = ty:: BoundConstness :: ConstIfConst
296+ == trait_predicate. skip_binder ( ) . constness ;
292297
293298 if self . tcx . sess . has_errors ( ) && trait_predicate. references_error ( ) {
294299 return ;
@@ -332,11 +337,12 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
332337 span,
333338 E0277 ,
334339 "{}" ,
335- message. unwrap_or_else( || format!(
336- "the trait bound `{}` is not satisfied{}" ,
337- trait_ref. without_const( ) . to_predicate( tcx) ,
338- post_message,
339- ) )
340+ ( !predicate_is_const) . then( || message) . flatten( ) . unwrap_or_else(
341+ || format!(
342+ "the trait bound `{}` is not satisfied{}" ,
343+ trait_predicate, post_message,
344+ )
345+ )
340346 ) ;
341347
342348 if is_try_conversion {
@@ -384,15 +390,15 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
384390 format ! (
385391 "{}the trait `{}` is not implemented for `{}`" ,
386392 pre_message,
387- trait_ref . print_only_trait_path ( ) ,
393+ trait_predicate . print_modifiers_and_trait_path ( ) ,
388394 trait_ref. skip_binder( ) . self_ty( ) ,
389395 )
390396 } ;
391397
392398 if self . suggest_add_reference_to_arg (
393399 & obligation,
394400 & mut err,
395- & trait_ref ,
401+ trait_predicate ,
396402 have_alt_message,
397403 ) {
398404 self . note_obligation_cause ( & mut err, & obligation) ;
@@ -435,18 +441,28 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
435441 err. span_label ( enclosing_scope_span, s. as_str ( ) ) ;
436442 }
437443
438- self . suggest_dereferences ( & obligation, & mut err, trait_ref) ;
439- self . suggest_fn_call ( & obligation, & mut err, trait_ref) ;
440- self . suggest_remove_reference ( & obligation, & mut err, trait_ref) ;
441- self . suggest_semicolon_removal ( & obligation, & mut err, span, trait_ref) ;
444+ self . suggest_dereferences ( & obligation, & mut err, trait_predicate) ;
445+ self . suggest_fn_call ( & obligation, & mut err, trait_predicate) ;
446+ self . suggest_remove_reference ( & obligation, & mut err, trait_predicate) ;
447+ self . suggest_semicolon_removal (
448+ & obligation,
449+ & mut err,
450+ span,
451+ trait_predicate,
452+ ) ;
442453 self . note_version_mismatch ( & mut err, & trait_ref) ;
443454 self . suggest_remove_await ( & obligation, & mut err) ;
444455
445456 if Some ( trait_ref. def_id ( ) ) == tcx. lang_items ( ) . try_trait ( ) {
446- self . suggest_await_before_try ( & mut err, & obligation, trait_ref, span) ;
457+ self . suggest_await_before_try (
458+ & mut err,
459+ & obligation,
460+ trait_predicate,
461+ span,
462+ ) ;
447463 }
448464
449- if self . suggest_impl_trait ( & mut err, span, & obligation, trait_ref ) {
465+ if self . suggest_impl_trait ( & mut err, span, & obligation, trait_predicate ) {
450466 err. emit ( ) ;
451467 return ;
452468 }
@@ -494,7 +510,7 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
494510 // which is somewhat confusing.
495511 self . suggest_restricting_param_bound (
496512 & mut err,
497- trait_ref ,
513+ trait_predicate ,
498514 obligation. cause . body_id ,
499515 ) ;
500516 } else if !have_alt_message {
@@ -506,7 +522,7 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
506522 // Changing mutability doesn't make a difference to whether we have
507523 // an `Unsize` impl (Fixes ICE in #71036)
508524 if !is_unsize {
509- self . suggest_change_mut ( & obligation, & mut err, trait_ref ) ;
525+ self . suggest_change_mut ( & obligation, & mut err, trait_predicate ) ;
510526 }
511527
512528 // If this error is due to `!: Trait` not implemented but `(): Trait` is
@@ -1121,7 +1137,7 @@ trait InferCtxtPrivExt<'hir, 'tcx> {
11211137 fn mk_trait_obligation_with_new_self_ty (
11221138 & self ,
11231139 param_env : ty:: ParamEnv < ' tcx > ,
1124- trait_ref : ty:: PolyTraitRef < ' tcx > ,
1140+ trait_ref : ty:: PolyTraitPredicate < ' tcx > ,
11251141 new_self_ty : Ty < ' tcx > ,
11261142 ) -> PredicateObligation < ' tcx > ;
11271143
@@ -1540,7 +1556,7 @@ impl<'a, 'tcx> InferCtxtPrivExt<'a, 'tcx> for InferCtxt<'a, 'tcx> {
15401556 ) -> Option < ( String , Option < Span > ) > {
15411557 match code {
15421558 ObligationCauseCode :: BuiltinDerivedObligation ( data) => {
1543- let parent_trait_ref = self . resolve_vars_if_possible ( data. parent_trait_ref ) ;
1559+ let parent_trait_ref = self . resolve_vars_if_possible ( data. parent_trait_pred ) ;
15441560 match self . get_parent_trait_ref ( & data. parent_code ) {
15451561 Some ( t) => Some ( t) ,
15461562 None => {
@@ -1593,21 +1609,20 @@ impl<'a, 'tcx> InferCtxtPrivExt<'a, 'tcx> for InferCtxt<'a, 'tcx> {
15931609 fn mk_trait_obligation_with_new_self_ty (
15941610 & self ,
15951611 param_env : ty:: ParamEnv < ' tcx > ,
1596- trait_ref : ty:: PolyTraitRef < ' tcx > ,
1612+ trait_ref : ty:: PolyTraitPredicate < ' tcx > ,
15971613 new_self_ty : Ty < ' tcx > ,
15981614 ) -> PredicateObligation < ' tcx > {
15991615 assert ! ( !new_self_ty. has_escaping_bound_vars( ) ) ;
16001616
1601- let trait_ref = trait_ref. map_bound_ref ( |tr| ty:: TraitRef {
1602- substs : self . tcx . mk_substs_trait ( new_self_ty, & tr. substs [ 1 ..] ) ,
1617+ let trait_pred = trait_ref. map_bound_ref ( |tr| ty:: TraitPredicate {
1618+ trait_ref : ty:: TraitRef {
1619+ substs : self . tcx . mk_substs_trait ( new_self_ty, & tr. trait_ref . substs [ 1 ..] ) ,
1620+ ..tr. trait_ref
1621+ } ,
16031622 ..* tr
16041623 } ) ;
16051624
1606- Obligation :: new (
1607- ObligationCause :: dummy ( ) ,
1608- param_env,
1609- trait_ref. without_const ( ) . to_predicate ( self . tcx ) ,
1610- )
1625+ Obligation :: new ( ObligationCause :: dummy ( ) , param_env, trait_pred. to_predicate ( self . tcx ) )
16111626 }
16121627
16131628 #[ instrument( skip( self ) , level = "debug" ) ]
@@ -2008,6 +2023,7 @@ impl<'a, 'tcx> InferCtxtPrivExt<'a, 'tcx> for InferCtxt<'a, 'tcx> {
20082023 self . note_obligation_cause_code (
20092024 err,
20102025 & obligation. predicate ,
2026+ obligation. param_env ,
20112027 obligation. cause . code ( ) ,
20122028 & mut vec ! [ ] ,
20132029 & mut Default :: default ( ) ,
@@ -2155,7 +2171,7 @@ impl<'a, 'tcx> InferCtxtPrivExt<'a, 'tcx> for InferCtxt<'a, 'tcx> {
21552171 cause_code : & ObligationCauseCode < ' tcx > ,
21562172 ) -> bool {
21572173 if let ObligationCauseCode :: BuiltinDerivedObligation ( ref data) = cause_code {
2158- let parent_trait_ref = self . resolve_vars_if_possible ( data. parent_trait_ref ) ;
2174+ let parent_trait_ref = self . resolve_vars_if_possible ( data. parent_trait_pred ) ;
21592175 let self_ty = parent_trait_ref. skip_binder ( ) . self_ty ( ) ;
21602176 if obligated_types. iter ( ) . any ( |ot| ot == & self_ty) {
21612177 return true ;
0 commit comments