diff options
| author | scalexm <alexandre@scalexm.fr> | 2018-11-15 20:05:36 +0100 |
|---|---|---|
| committer | scalexm <alexandre@scalexm.fr> | 2018-11-29 21:57:40 +0100 |
| commit | b2b82f790b0342fa7eb4e3b81bf1ae00681b4543 (patch) | |
| tree | 71771c60f396f5f12e29be7e7b5bf1041ddfe406 /src | |
| parent | 0169dc3f36aec63e5926f2d69e788a396fd10f82 (diff) | |
| download | rust-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.rs | 30 |
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: (), + } + })) } } |
