Skip to content

Commit 2cb4b58

Browse files
committed
Remove unnecessary allocation
1 parent e9232b2 commit 2cb4b58

File tree

1 file changed

+25
-26
lines changed
  • src/librustc_trait_selection/traits

1 file changed

+25
-26
lines changed

src/librustc_trait_selection/traits/wf.rs

+25-26
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ fn extend_cause_with_original_assoc_item_obligation<'tcx>(
140140
item: Option<&hir::Item<'tcx>>,
141141
cause: &mut traits::ObligationCause<'tcx>,
142142
pred: &ty::Predicate<'_>,
143-
mut trait_assoc_items: impl Iterator<Item = ty::AssocItem>,
143+
mut trait_assoc_items: impl Iterator<Item = &'tcx ty::AssocItem>,
144144
) {
145145
debug!(
146146
"extended_cause_with_original_assoc_item_obligation {:?} {:?} {:?} {:?}",
@@ -232,35 +232,34 @@ impl<'a, 'tcx> WfPredicates<'a, 'tcx> {
232232

233233
let item = self.item;
234234

235+
let extend = |obligation: traits::PredicateObligation<'tcx>| {
236+
let mut cause = cause.clone();
237+
if let Some(parent_trait_ref) = obligation.predicate.to_opt_poly_trait_ref() {
238+
let derived_cause = traits::DerivedObligationCause {
239+
parent_trait_ref,
240+
parent_code: Rc::new(obligation.cause.code.clone()),
241+
};
242+
cause.code = traits::ObligationCauseCode::DerivedObligation(derived_cause);
243+
}
244+
extend_cause_with_original_assoc_item_obligation(
245+
tcx,
246+
trait_ref,
247+
item,
248+
&mut cause,
249+
&obligation.predicate,
250+
tcx.associated_items(trait_ref.def_id).in_definition_order(),
251+
);
252+
traits::Obligation::new(cause, param_env, obligation.predicate)
253+
};
254+
235255
if let Elaborate::All = elaborate {
236-
let implied_obligations = traits::util::elaborate_obligations(tcx, obligations.clone());
237-
let implied_obligations = implied_obligations.map(|obligation| {
238-
debug!("compute_trait_ref implied_obligation {:?}", obligation);
239-
debug!("compute_trait_ref implied_obligation cause {:?}", obligation.cause);
240-
let mut cause = cause.clone();
241-
if let Some(parent_trait_ref) = obligation.predicate.to_opt_poly_trait_ref() {
242-
let derived_cause = traits::DerivedObligationCause {
243-
parent_trait_ref,
244-
parent_code: Rc::new(obligation.cause.code.clone()),
245-
};
246-
cause.code = traits::ObligationCauseCode::DerivedObligation(derived_cause);
247-
}
248-
extend_cause_with_original_assoc_item_obligation(
249-
tcx,
250-
trait_ref,
251-
item,
252-
&mut cause,
253-
&obligation.predicate,
254-
tcx.associated_items(trait_ref.def_id).in_definition_order().copied(),
255-
);
256-
debug!("compute_trait_ref new cause {:?}", cause);
257-
traits::Obligation::new(cause, param_env, obligation.predicate)
258-
});
256+
let implied_obligations = traits::util::elaborate_obligations(tcx, obligations);
257+
let implied_obligations = implied_obligations.map(extend);
259258
self.out.extend(implied_obligations);
259+
} else {
260+
self.out.extend(obligations);
260261
}
261262

262-
self.out.extend(obligations);
263-
264263
self.out.extend(trait_ref.substs.types().filter(|ty| !ty.has_escaping_bound_vars()).map(
265264
|ty| traits::Obligation::new(cause.clone(), param_env, ty::Predicate::WellFormed(ty)),
266265
));

0 commit comments

Comments
 (0)