diff options
| author | Esteban Küber <esteban@kuber.com.ar> | 2020-04-18 11:07:41 -0700 |
|---|---|---|
| committer | Esteban Küber <esteban@kuber.com.ar> | 2020-04-20 10:42:25 -0700 |
| commit | faeb0404a5fb3719824cbdd6c1f0255f81c2cc25 (patch) | |
| tree | 980eacf623fac047466a1986451a226ac27895b9 | |
| parent | 2000f91f68d2218b01401b9b92177090d784e724 (diff) | |
| download | rust-faeb0404a5fb3719824cbdd6c1f0255f81c2cc25.tar.gz rust-faeb0404a5fb3719824cbdd6c1f0255f81c2cc25.zip | |
Remove unnecessary allocation
| -rw-r--r-- | src/librustc_trait_selection/traits/wf.rs | 51 |
1 files changed, 25 insertions, 26 deletions
diff --git a/src/librustc_trait_selection/traits/wf.rs b/src/librustc_trait_selection/traits/wf.rs index cf8c12eae0a..7eabdf706ef 100644 --- a/src/librustc_trait_selection/traits/wf.rs +++ b/src/librustc_trait_selection/traits/wf.rs @@ -140,7 +140,7 @@ fn extend_cause_with_original_assoc_item_obligation<'tcx>( item: Option<&hir::Item<'tcx>>, cause: &mut traits::ObligationCause<'tcx>, pred: &ty::Predicate<'_>, - mut trait_assoc_items: impl Iterator<Item = ty::AssocItem>, + mut trait_assoc_items: impl Iterator<Item = &'tcx ty::AssocItem>, ) { debug!( "extended_cause_with_original_assoc_item_obligation {:?} {:?} {:?} {:?}", @@ -232,35 +232,34 @@ impl<'a, 'tcx> WfPredicates<'a, 'tcx> { let item = self.item; + let extend = |obligation: traits::PredicateObligation<'tcx>| { + let mut cause = cause.clone(); + if let Some(parent_trait_ref) = obligation.predicate.to_opt_poly_trait_ref() { + let derived_cause = traits::DerivedObligationCause { + parent_trait_ref, + parent_code: Rc::new(obligation.cause.code.clone()), + }; + cause.code = traits::ObligationCauseCode::DerivedObligation(derived_cause); + } + extend_cause_with_original_assoc_item_obligation( + tcx, + trait_ref, + item, + &mut cause, + &obligation.predicate, + tcx.associated_items(trait_ref.def_id).in_definition_order(), + ); + traits::Obligation::new(cause, param_env, obligation.predicate) + }; + if let Elaborate::All = elaborate { - let implied_obligations = traits::util::elaborate_obligations(tcx, obligations.clone()); - let implied_obligations = implied_obligations.map(|obligation| { - debug!("compute_trait_ref implied_obligation {:?}", obligation); - debug!("compute_trait_ref implied_obligation cause {:?}", obligation.cause); - let mut cause = cause.clone(); - if let Some(parent_trait_ref) = obligation.predicate.to_opt_poly_trait_ref() { - let derived_cause = traits::DerivedObligationCause { - parent_trait_ref, - parent_code: Rc::new(obligation.cause.code.clone()), - }; - cause.code = traits::ObligationCauseCode::DerivedObligation(derived_cause); - } - extend_cause_with_original_assoc_item_obligation( - tcx, - trait_ref, - item, - &mut cause, - &obligation.predicate, - tcx.associated_items(trait_ref.def_id).in_definition_order().copied(), - ); - debug!("compute_trait_ref new cause {:?}", cause); - traits::Obligation::new(cause, param_env, obligation.predicate) - }); + let implied_obligations = traits::util::elaborate_obligations(tcx, obligations); + let implied_obligations = implied_obligations.map(extend); self.out.extend(implied_obligations); + } else { + self.out.extend(obligations); } - self.out.extend(obligations); - self.out.extend(trait_ref.substs.types().filter(|ty| !ty.has_escaping_bound_vars()).map( |ty| traits::Obligation::new(cause.clone(), param_env, ty::Predicate::WellFormed(ty)), )); |
