about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorscalexm <alexandre@scalexm.fr>2018-11-15 20:05:36 +0100
committerscalexm <alexandre@scalexm.fr>2018-11-29 21:57:40 +0100
commitb2b82f790b0342fa7eb4e3b81bf1ae00681b4543 (patch)
tree71771c60f396f5f12e29be7e7b5bf1041ddfe406 /src
parent0169dc3f36aec63e5926f2d69e788a396fd10f82 (diff)
downloadrust-b2b82f790b0342fa7eb4e3b81bf1ae00681b4543.tar.gz
rust-b2b82f790b0342fa7eb4e3b81bf1ae00681b4543.zip
Implement `AggregateOps`
`make_solution` does not return any guidance for now
Diffstat (limited to 'src')
-rw-r--r--src/librustc_traits/chalk_context/mod.rs30
1 files changed, 28 insertions, 2 deletions
diff --git a/src/librustc_traits/chalk_context/mod.rs b/src/librustc_traits/chalk_context/mod.rs
index bc3f2fd951b..58a8d2abd99 100644
--- a/src/librustc_traits/chalk_context/mod.rs
+++ b/src/librustc_traits/chalk_context/mod.rs
@@ -26,6 +26,7 @@ use rustc::infer::canonical::{
     CanonicalVarValues,
     OriginalQueryValues,
     QueryResponse,
+    Certainty,
 };
 use rustc::traits::{
     DomainGoal,
@@ -132,9 +133,34 @@ impl context::AggregateOps<ChalkArenas<'gcx>> for ChalkContext<'cx, 'gcx> {
     fn make_solution(
         &self,
         _root_goal: &Canonical<'gcx, InEnvironment<'gcx, Goal<'gcx>>>,
-        _simplified_answers: impl context::AnswerStream<ChalkArenas<'gcx>>,
+        mut simplified_answers: impl context::AnswerStream<ChalkArenas<'gcx>>,
     ) -> Option<Canonical<'gcx, QueryResponse<'gcx, ()>>> {
-        unimplemented!()
+        use chalk_engine::SimplifiedAnswer;
+
+        if simplified_answers.peek_answer().is_none() {
+            return None;
+        }
+
+        let SimplifiedAnswer { subst, ambiguous } = simplified_answers
+            .next_answer()
+            .unwrap();
+
+        let ambiguous = simplified_answers.peek_answer().is_some() || ambiguous;
+
+        Some(subst.unchecked_map(|subst| {
+            QueryResponse {
+                var_values: subst.subst,
+                region_constraints: subst.constraints
+                    .into_iter()
+                    .map(|c| ty::Binder::bind(c))
+                    .collect(),
+                certainty: match ambiguous {
+                    true => Certainty::Ambiguous,
+                    false => Certainty::Proven,
+                },
+                value: (),
+            }
+        }))
     }
 }