diff options
| author | Esteban Küber <esteban@kuber.com.ar> | 2023-01-12 21:32:06 +0000 | 
|---|---|---|
| committer | Esteban Küber <esteban@kuber.com.ar> | 2023-01-13 18:20:23 +0000 | 
| commit | 3d6b09e53e0b1d5920fe3c6106f676b7b95f4a70 (patch) | |
| tree | 3f53fe89cbc4a44fa82c70f4d695b7c7d482bcd9 /compiler/rustc_infer/src | |
| parent | f6e6d2a035d9e86e7053847aa60a99940f41064c (diff) | |
| download | rust-3d6b09e53e0b1d5920fe3c6106f676b7b95f4a70.tar.gz rust-3d6b09e53e0b1d5920fe3c6106f676b7b95f4a70.zip | |
Keep obligation chain when elaborating obligations
Diffstat (limited to 'compiler/rustc_infer/src')
| -rw-r--r-- | compiler/rustc_infer/src/traits/util.rs | 18 | 
1 files changed, 15 insertions, 3 deletions
| diff --git a/compiler/rustc_infer/src/traits/util.rs b/compiler/rustc_infer/src/traits/util.rs index 8f0bd3a9abe..1817bbf9228 100644 --- a/compiler/rustc_infer/src/traits/util.rs +++ b/compiler/rustc_infer/src/traits/util.rs @@ -1,7 +1,7 @@ use smallvec::smallvec; use crate::infer::outlives::components::{push_outlives_components, Component}; -use crate::traits::{Obligation, ObligationCause, PredicateObligation}; +use crate::traits::{self, Obligation, ObligationCause, PredicateObligation}; use rustc_data_structures::fx::{FxHashSet, FxIndexSet}; use rustc_middle::ty::{self, ToPredicate, TyCtxt}; use rustc_span::symbol::Ident; @@ -145,16 +145,28 @@ impl<'tcx> Elaborator<'tcx> { // Get predicates declared on the trait. let predicates = tcx.super_predicates_of(data.def_id()); - let obligations = predicates.predicates.iter().map(|&(mut pred, _)| { + let obligations = predicates.predicates.iter().map(|&(mut pred, span)| { // when parent predicate is non-const, elaborate it to non-const predicates. if data.constness == ty::BoundConstness::NotConst { pred = pred.without_const(tcx); } + let cause = obligation.cause.clone().derived_cause( + bound_predicate.rebind(data), + |derived| { + traits::ImplDerivedObligation(Box::new( + traits::ImplDerivedObligationCause { + derived, + impl_def_id: data.def_id(), + span, + }, + )) + }, + ); predicate_obligation( pred.subst_supertrait(tcx, &bound_predicate.rebind(data.trait_ref)), obligation.param_env, - obligation.cause.clone(), + cause, ) }); debug!(?data, ?obligations, "super_predicates"); | 
