about summary refs log tree commit diff
path: root/compiler/rustc_traits/src/chalk/mod.rs
diff options
context:
space:
mode:
authorJack Huey <jack.huey@umassmed.edu>2021-01-01 13:44:31 -0500
committerJack Huey <jack.huey@umassmed.edu>2021-02-01 10:37:45 -0500
commit4b64bc1fc9a48064c0571ad231add94c98673d8c (patch)
tree1ebb1471adf81db1409c0eb296e09819396a4f63 /compiler/rustc_traits/src/chalk/mod.rs
parente0d9f793990d20f8f640097e28556886ba5362f0 (diff)
downloadrust-4b64bc1fc9a48064c0571ad231add94c98673d8c.tar.gz
rust-4b64bc1fc9a48064c0571ad231add94c98673d8c.zip
Upgrade Chalk
Diffstat (limited to 'compiler/rustc_traits/src/chalk/mod.rs')
-rw-r--r--compiler/rustc_traits/src/chalk/mod.rs39
1 files changed, 34 insertions, 5 deletions
diff --git a/compiler/rustc_traits/src/chalk/mod.rs b/compiler/rustc_traits/src/chalk/mod.rs
index bd2f87f70a2..240807d72e4 100644
--- a/compiler/rustc_traits/src/chalk/mod.rs
+++ b/compiler/rustc_traits/src/chalk/mod.rs
@@ -97,6 +97,7 @@ crate fn evaluate_goal<'tcx>(
     use chalk_solve::Solver;
     let mut solver = chalk_engine::solve::SLGSolver::new(32, None);
     let db = ChalkRustIrDatabase { interner, reempty_placeholder };
+    //dbg!("evaluate_goal_pre", &obligation, &lowered_goal);
     let solution = solver.solve(&db, &lowered_goal);
     debug!(?obligation, ?solution, "evaluate goal");
 
@@ -105,14 +106,40 @@ crate fn evaluate_goal<'tcx>(
     // really need this and so it's really minimal.
     // Right now, we also treat a `Unique` solution the same as
     // `Ambig(Definite)`. This really isn't right.
-    let make_solution = |subst: chalk_ir::Substitution<_>| {
+    let make_solution = |subst: chalk_ir::Substitution<_>,
+                         binders: chalk_ir::CanonicalVarKinds<_>| {
+        use rustc_middle::infer::canonical::CanonicalVarInfo;
+
         let mut var_values: IndexVec<BoundVar, GenericArg<'tcx>> = IndexVec::new();
         subst.as_slice(&interner).iter().for_each(|p| {
             var_values.push(p.lower_into(&interner));
         });
+        let variables: Vec<_> = binders
+            .iter(&interner)
+            .map(|var| {
+                let kind = match var.kind {
+                    chalk_ir::VariableKind::Ty(ty_kind) => CanonicalVarKind::Ty(match ty_kind {
+                        chalk_ir::TyVariableKind::General => CanonicalTyVarKind::General(
+                            ty::UniverseIndex::from_usize(var.skip_kind().counter),
+                        ),
+                        chalk_ir::TyVariableKind::Integer => CanonicalTyVarKind::Int,
+                        chalk_ir::TyVariableKind::Float => CanonicalTyVarKind::Float,
+                    }),
+                    chalk_ir::VariableKind::Lifetime => CanonicalVarKind::Region(
+                        ty::UniverseIndex::from_usize(var.skip_kind().counter),
+                    ),
+                    chalk_ir::VariableKind::Const(_) => CanonicalVarKind::Const(
+                        ty::UniverseIndex::from_usize(var.skip_kind().counter),
+                    ),
+                };
+                CanonicalVarInfo { kind }
+            })
+            .collect();
+        let max_universe =
+            binders.iter(&interner).map(|v| v.skip_kind().counter).max().unwrap_or(0);
         let sol = Canonical {
-            max_universe: ty::UniverseIndex::from_usize(0),
-            variables: obligation.variables.clone(),
+            max_universe: ty::UniverseIndex::from_usize(max_universe),
+            variables: tcx.intern_canonical_var_infos(&variables),
             value: QueryResponse {
                 var_values: CanonicalVarValues { var_values },
                 region_constraints: QueryRegionConstraints::default(),
@@ -126,11 +153,13 @@ crate fn evaluate_goal<'tcx>(
         .map(|s| match s {
             Solution::Unique(subst) => {
                 // FIXME(chalk): handle constraints
-                make_solution(subst.value.subst)
+                make_solution(subst.value.subst, subst.binders)
             }
             Solution::Ambig(guidance) => {
                 match guidance {
-                    chalk_solve::Guidance::Definite(subst) => make_solution(subst.value),
+                    chalk_solve::Guidance::Definite(subst) => {
+                        make_solution(subst.value, subst.binders)
+                    }
                     chalk_solve::Guidance::Suggested(_) => unimplemented!(),
                     chalk_solve::Guidance::Unknown => {
                         // chalk_fulfill doesn't use the var_values here, so