diff options
| author | Niko Matsakis <niko@alum.mit.edu> | 2015-01-02 13:59:32 -0500 |
|---|---|---|
| committer | Jorge Aparicio <japaricious@gmail.com> | 2015-01-02 14:22:00 -0500 |
| commit | fc7d8faba87716bbcaa43c3747fb8a98dc0c041a (patch) | |
| tree | 93f058806607737a57a80477f66004ea5ef48b4f /src | |
| parent | 45468f37c85adb6e1339af33c2f18770b4ac9dac (diff) | |
| download | rust-fc7d8faba87716bbcaa43c3747fb8a98dc0c041a.tar.gz rust-fc7d8faba87716bbcaa43c3747fb8a98dc0c041a.zip | |
Handle recursive obligations without exiting the inference probe
Conflicts: src/librustc/middle/traits/select.rs
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustc/middle/traits/select.rs | 29 |
1 files changed, 13 insertions, 16 deletions
diff --git a/src/librustc/middle/traits/select.rs b/src/librustc/middle/traits/select.rs index 5b5cb8ae13e..a7eb883f337 100644 --- a/src/librustc/middle/traits/select.rs +++ b/src/librustc/middle/traits/select.rs @@ -338,24 +338,21 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { } ty::Predicate::Projection(ref data) => { - let result = self.infcx.probe(|_| { + self.infcx.probe(|_| { let project_obligation = obligation.with(data.clone()); - project::poly_project_and_unify_type(self, &project_obligation) - }); - match result { - Ok(Some(_subobligations)) => { - // TODO we should evaluate _subobligations, but doing so leads to an ICE - // self.evaluate_predicates_recursively(previous_stack, - // subobligations.iter()) - EvaluatedToAmbig - } - Ok(None) => { - EvaluatedToAmbig - } - Err(_) => { - EvaluatedToErr(Unimplemented) + match project::poly_project_and_unify_type(self, &project_obligation) { + Ok(Some(subobligations)) => { + self.evaluate_predicates_recursively(previous_stack, + subobligations.iter()) + } + Ok(None) => { + EvaluatedToAmbig + } + Err(_) => { + EvaluatedToErr(Unimplemented) + } } - } + }) } } } |
