about summary refs log tree commit diff
diff options
context:
space:
mode:
authorscalexm <martin.alex32@hotmail.fr>2017-08-10 15:02:41 +0200
committerscalexm <martin.alex32@hotmail.fr>2017-08-10 15:02:41 +0200
commit488dccbe877f82e9a665aa39aa521e142fcf6efb (patch)
treeb3376b52ebbb417fcefb3f4892469f4f3492b7ab
parent1ebc7eff46fb01c625ecce55a0537dcc78e58756 (diff)
downloadrust-488dccbe877f82e9a665aa39aa521e142fcf6efb.tar.gz
rust-488dccbe877f82e9a665aa39aa521e142fcf6efb.zip
Elaborate trait obligations when typechecking impls
Fixes #43784.
-rw-r--r--src/librustc/ty/wf.rs13
1 files changed, 6 insertions, 7 deletions
diff --git a/src/librustc/ty/wf.rs b/src/librustc/ty/wf.rs
index 580a3aec3e8..0ff94097c8e 100644
--- a/src/librustc/ty/wf.rs
+++ b/src/librustc/ty/wf.rs
@@ -137,20 +137,19 @@ impl<'a, 'gcx, 'tcx> WfPredicates<'a, 'gcx, 'tcx> {
     /// `self.out`.
     fn compute_trait_ref(&mut self, trait_ref: &ty::TraitRef<'tcx>) {
         let obligations = self.nominal_obligations(trait_ref.def_id, trait_ref.substs);
-        self.out.extend(obligations);
 
         let cause = self.cause(traits::MiscObligation);
         let param_env = self.param_env;
 
-        let implied_obligations = traits::elaborate_predicates(self.infcx.tcx, vec![
-            ty::Predicate::Trait(ty::Binder(
-                ty::TraitPredicate { trait_ref: *trait_ref }
-            ))
-        ]);
+        let predicates = obligations.iter()
+                                    .map(|obligation| obligation.predicate.clone())
+                                    .collect();
+        let implied_obligations = traits::elaborate_predicates(self.infcx.tcx, predicates);
         let implied_obligations = implied_obligations.map(|pred| {
             traits::Obligation::new(cause.clone(), param_env, pred)
         });
-        self.out.extend(implied_obligations);
+
+        self.out.extend(implied_obligations.chain(obligations));
 
         self.out.extend(
             trait_ref.substs.types()