about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorNiko Matsakis <niko@alum.mit.edu>2015-01-02 13:59:32 -0500
committerJorge Aparicio <japaricious@gmail.com>2015-01-02 14:22:00 -0500
commitfc7d8faba87716bbcaa43c3747fb8a98dc0c041a (patch)
tree93f058806607737a57a80477f66004ea5ef48b4f /src
parent45468f37c85adb6e1339af33c2f18770b4ac9dac (diff)
downloadrust-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.rs29
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)
+                        }
                     }
-                }
+                })
             }
         }
     }