From 1b51e1ad2071a5cd31013a75df653b64dc6ca9c5 Mon Sep 17 00:00:00 2001 From: Oli Scherer Date: Tue, 10 May 2022 11:14:07 +0000 Subject: [PATCH] Don't allocate misc obligation parents of derived obligations --- compiler/rustc_middle/src/traits/mod.rs | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/compiler/rustc_middle/src/traits/mod.rs b/compiler/rustc_middle/src/traits/mod.rs index be2d8def954..04e3daf3045 100644 --- a/compiler/rustc_middle/src/traits/mod.rs +++ b/compiler/rustc_middle/src/traits/mod.rs @@ -191,9 +191,10 @@ impl<'tcx> ObligationCause<'tcx> { // NOTE(flaper87): As of now, it keeps track of the whole error // chain. Ideally, we should have a way to configure this either // by using -Z verbose or just a CLI argument. - self.map_code(|parent_code| { - variant(DerivedObligationCause { parent_trait_pred, parent_code }).into() - }); + self.code = Some( + variant(DerivedObligationCause { parent_trait_pred, parent_code: self.code.take() }) + .into(), + ); self } } @@ -443,7 +444,7 @@ impl<'tcx> ObligationCauseCode<'tcx> { BuiltinDerivedObligation(derived) | DerivedObligation(derived) | ImplDerivedObligation(box ImplDerivedObligationCause { derived, .. }) => { - Some((&derived.parent_code, Some(derived.parent_trait_pred))) + Some((derived.parent_code(), Some(derived.parent_trait_pred))) } _ => None, } @@ -497,14 +498,14 @@ pub struct DerivedObligationCause<'tcx> { pub parent_trait_pred: ty::PolyTraitPredicate<'tcx>, /// The parent trait had this cause. - parent_code: Lrc>, + parent_code: Option>>, } impl<'tcx> DerivedObligationCause<'tcx> { /// Get a reference to the derived obligation cause's parent code. #[must_use] pub fn parent_code(&self) -> &ObligationCauseCode<'tcx> { - self.parent_code.as_ref() + self.parent_code.as_deref().unwrap_or(&MISC_OBLIGATION_CAUSE_CODE) } }