about summary refs log tree commit diff
path: root/src/librustc_traits/chalk_context
diff options
context:
space:
mode:
authorscalexm <alexandre@scalexm.fr>2018-11-23 21:03:27 +0100
committerscalexm <alexandre@scalexm.fr>2018-12-27 19:21:15 +0100
commitec7362442cb16902aec489b4536a81573ab4a35f (patch)
treef1eb2b526b494fbdce3324604eca5e8ef4b85fd7 /src/librustc_traits/chalk_context
parent8cadd59674be7211edf32485f562b6d75c578155 (diff)
downloadrust-ec7362442cb16902aec489b4536a81573ab4a35f.tar.gz
rust-ec7362442cb16902aec489b4536a81573ab4a35f.zip
Return an instantiated environment instead of a generic one
Diffstat (limited to 'src/librustc_traits/chalk_context')
-rw-r--r--src/librustc_traits/chalk_context/program_clauses.rs23
1 files changed, 15 insertions, 8 deletions
diff --git a/src/librustc_traits/chalk_context/program_clauses.rs b/src/librustc_traits/chalk_context/program_clauses.rs
index b685266947b..2b4970124e3 100644
--- a/src/librustc_traits/chalk_context/program_clauses.rs
+++ b/src/librustc_traits/chalk_context/program_clauses.rs
@@ -256,6 +256,8 @@ impl ChalkInferenceContext<'cx, 'gcx, 'tcx> {
     ) -> Vec<Clause<'tcx>> {
         use rustc::traits::WhereClause::*;
 
+        debug!("program_clauses(goal = {:?})", goal);
+
         let mut clauses = match goal {
             DomainGoal::Holds(Implemented(trait_predicate)) => {
                 // These come from:
@@ -345,20 +347,21 @@ impl ChalkInferenceContext<'cx, 'gcx, 'tcx> {
                         self.infcx.tcx.program_clauses_for(data.item_def_id)
                     }
 
-                    // These types are always WF and non-parametric.
+                    // These types are always WF.
                     ty::Bool |
                     ty::Char |
                     ty::Int(..) |
                     ty::Uint(..) |
                     ty::Float(..) |
                     ty::Str |
+                    ty::Param(..) |
                     ty::Never => {
                         let wf_clause = ProgramClause {
                             goal: DomainGoal::WellFormed(WellFormed::Ty(ty)),
                             hypotheses: ty::List::empty(),
                             category: ProgramClauseCategory::WellFormed,
                         };
-                        let wf_clause = Clause::ForAll(ty::Binder::dummy(wf_clause));
+                        let wf_clause = Clause::Implies(wf_clause);
 
                         self.infcx.tcx.mk_clauses(iter::once(wf_clause))
                     }
@@ -415,7 +418,6 @@ impl ChalkInferenceContext<'cx, 'gcx, 'tcx> {
                     ty::UnnormalizedProjection(..) |
                     ty::Infer(..) |
                     ty::Bound(..) |
-                    ty::Param(..) |
                     ty::Error => {
                         bug!("unexpected type {:?}", ty)
                     }
@@ -458,13 +460,18 @@ impl ChalkInferenceContext<'cx, 'gcx, 'tcx> {
             }
         };
 
+        debug!("program_clauses: clauses = {:?}", clauses);
+        debug!("program_clauses: adding clauses from environment = {:?}", environment);
+
         let environment = self.infcx.tcx.lift_to_global(environment)
             .expect("environment is not global");
-        clauses.extend(
-            self.infcx.tcx.program_clauses_for_env(environment)
-                .into_iter()
-                .cloned()
-        );
+
+        let env_clauses = self.infcx.tcx.program_clauses_for_env(environment);
+
+        debug!("program_clauses: env_clauses = {:?}", env_clauses);
+
+        clauses.extend(env_clauses.into_iter().cloned());
+        clauses.extend(environment.clauses.iter().cloned());
         clauses
     }
 }