]> git.lizzy.rs Git - rust.git/commitdiff
correctly set the `reached_depth` field
authorNiko Matsakis <niko@alum.mit.edu>
Wed, 12 Jun 2019 21:55:10 +0000 (17:55 -0400)
committerNiko Matsakis <niko@alum.mit.edu>
Wed, 12 Jun 2019 21:55:10 +0000 (17:55 -0400)
src/librustc/traits/select.rs

index 5a59a13a37c5233ffded421b417b4a451e9e9b25..be7765c02462672ebc2066a4f2a7e0b4e3f2ba97 100644 (file)
@@ -4084,7 +4084,6 @@ fn update_reached_depth(&self, reached_depth: usize) {
 /// provisional results added from the subtree that encountered the
 /// error.  When we pop the node at `reached_depth` from the stack, we
 /// can commit all the things that remain in the provisional cache.
-#[derive(Default)]
 struct ProvisionalEvaluationCache<'tcx> {
     /// next "depth first number" to issue -- just a counter
     dfn: Cell<usize>,
@@ -4132,6 +4131,16 @@ struct ProvisionalEvaluation {
     result: EvaluationResult,
 }
 
+impl<'tcx> Default for ProvisionalEvaluationCache<'tcx> {
+    fn default() -> Self {
+        Self {
+            dfn: Cell::new(0),
+            reached_depth: Cell::new(std::usize::MAX),
+            map: Default::default(),
+        }
+    }
+}
+
 impl<'tcx> ProvisionalEvaluationCache<'tcx> {
     /// Get the next DFN in sequence (basically a counter).
     fn next_dfn(&self) -> usize {
@@ -4146,9 +4155,10 @@ fn next_dfn(&self) -> usize {
     /// `self.current_reached_depth()` and above.
     fn get_provisional(&self, fresh_trait_ref: ty::PolyTraitRef<'tcx>) -> Option<EvaluationResult> {
         debug!(
-            "get_provisional(fresh_trait_ref={:?}) = {:#?}",
+            "get_provisional(fresh_trait_ref={:?}) = {:#?} with reached-depth {}",
             fresh_trait_ref,
             self.map.borrow().get(&fresh_trait_ref),
+            self.reached_depth.get(),
         );
         Some(self.map.borrow().get(&fresh_trait_ref)?.result)
     }
@@ -4240,7 +4250,7 @@ fn on_completion(
             op(fresh_trait_ref, eval.result);
         }
 
-        self.reached_depth.set(depth);
+        self.reached_depth.set(std::usize::MAX);
     }
 }