1
Fork 0

Elaborate trait obligations when typechecking impls

Fixes #43784.
This commit is contained in:
scalexm 2017-08-10 15:02:41 +02:00
parent 1ebc7eff46
commit 488dccbe87

View file

@ -137,20 +137,19 @@ impl<'a, 'gcx, 'tcx> WfPredicates<'a, 'gcx, 'tcx> {
/// `self.out`. /// `self.out`.
fn compute_trait_ref(&mut self, trait_ref: &ty::TraitRef<'tcx>) { fn compute_trait_ref(&mut self, trait_ref: &ty::TraitRef<'tcx>) {
let obligations = self.nominal_obligations(trait_ref.def_id, trait_ref.substs); let obligations = self.nominal_obligations(trait_ref.def_id, trait_ref.substs);
self.out.extend(obligations);
let cause = self.cause(traits::MiscObligation); let cause = self.cause(traits::MiscObligation);
let param_env = self.param_env; let param_env = self.param_env;
let implied_obligations = traits::elaborate_predicates(self.infcx.tcx, vec![ let predicates = obligations.iter()
ty::Predicate::Trait(ty::Binder( .map(|obligation| obligation.predicate.clone())
ty::TraitPredicate { trait_ref: *trait_ref } .collect();
)) let implied_obligations = traits::elaborate_predicates(self.infcx.tcx, predicates);
]);
let implied_obligations = implied_obligations.map(|pred| { let implied_obligations = implied_obligations.map(|pred| {
traits::Obligation::new(cause.clone(), param_env, pred) traits::Obligation::new(cause.clone(), param_env, pred)
}); });
self.out.extend(implied_obligations);
self.out.extend(implied_obligations.chain(obligations));
self.out.extend( self.out.extend(
trait_ref.substs.types() trait_ref.substs.types()