about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--compiler/rustc_borrowck/src/type_check/liveness/trace.rs22
-rw-r--r--compiler/rustc_infer/src/infer/mod.rs2
-rw-r--r--tests/ui/borrowck/bad-drop-side-effects.rs18
-rw-r--r--tests/ui/borrowck/bad-drop-side-effects.stderr9
4 files changed, 42 insertions, 9 deletions
diff --git a/compiler/rustc_borrowck/src/type_check/liveness/trace.rs b/compiler/rustc_borrowck/src/type_check/liveness/trace.rs
index 148e75aa84c..12e8be41614 100644
--- a/compiler/rustc_borrowck/src/type_check/liveness/trace.rs
+++ b/compiler/rustc_borrowck/src/type_check/liveness/trace.rs
@@ -613,9 +613,14 @@ impl<'tcx> LivenessContext<'_, '_, '_, 'tcx> {
                 // types, so there's no guarantee that it succeeds. We also
                 // can't rely on the the `ErrorGuaranteed` from `fully_perform` here
                 // because it comes from delay_span_bug.
-                let ocx = ObligationCtxt::new_with_diagnostics(&typeck.infcx);
-                let errors =
-                    match dropck_outlives::compute_dropck_outlives_with_errors(&ocx, op, span) {
+                //
+                // Do this inside of a probe because we don't particularly care (or want)
+                // any region side-effects of this operation in our infcx.
+                typeck.infcx.probe(|_| {
+                    let ocx = ObligationCtxt::new_with_diagnostics(&typeck.infcx);
+                    let errors = match dropck_outlives::compute_dropck_outlives_with_errors(
+                        &ocx, op, span,
+                    ) {
                         Ok(_) => ocx.select_all_or_error(),
                         Err(e) => {
                             if e.is_empty() {
@@ -626,11 +631,12 @@ impl<'tcx> LivenessContext<'_, '_, '_, 'tcx> {
                         }
                     };
 
-                if !errors.is_empty() {
-                    typeck.infcx.err_ctxt().report_fulfillment_errors(errors);
-                } else {
-                    span_bug!(span, "Rerunning drop data query produced no error.");
-                }
+                    if !errors.is_empty() {
+                        typeck.infcx.err_ctxt().report_fulfillment_errors(errors);
+                    } else {
+                        span_bug!(span, "Rerunning drop data query produced no error.");
+                    }
+                });
                 DropData { dropck_result: Default::default(), region_constraint_data: None }
             }
         }
diff --git a/compiler/rustc_infer/src/infer/mod.rs b/compiler/rustc_infer/src/infer/mod.rs
index c2513a1af19..88a325a39be 100644
--- a/compiler/rustc_infer/src/infer/mod.rs
+++ b/compiler/rustc_infer/src/infer/mod.rs
@@ -950,7 +950,7 @@ impl<'tcx> InferCtxt<'tcx> {
         let inner = self.inner.borrow();
         assert!(!UndoLogs::<UndoLog<'_>>::in_snapshot(&inner.undo_log));
         let storage = inner.region_constraint_storage.as_ref().expect("regions already resolved");
-        assert!(storage.data.is_empty());
+        assert!(storage.data.is_empty(), "{:#?}", storage.data);
         // We clone instead of taking because borrowck still wants to use the
         // inference context after calling this for diagnostics and the new
         // trait solver.
diff --git a/tests/ui/borrowck/bad-drop-side-effects.rs b/tests/ui/borrowck/bad-drop-side-effects.rs
new file mode 100644
index 00000000000..a09b7087608
--- /dev/null
+++ b/tests/ui/borrowck/bad-drop-side-effects.rs
@@ -0,0 +1,18 @@
+// Regression test for <https://github.com/rust-lang/rust/issues/137288>.
+
+trait B {
+    type C;
+}
+
+impl<U> B for &Missing {
+//~^ ERROR cannot find type `Missing` in this scope
+    type C = ();
+}
+
+struct E<T: B> {
+    g: <T as B>::C,
+}
+
+fn h(i: Box<E<&()>>) {}
+
+fn main() {}
diff --git a/tests/ui/borrowck/bad-drop-side-effects.stderr b/tests/ui/borrowck/bad-drop-side-effects.stderr
new file mode 100644
index 00000000000..0a5998c7e48
--- /dev/null
+++ b/tests/ui/borrowck/bad-drop-side-effects.stderr
@@ -0,0 +1,9 @@
+error[E0412]: cannot find type `Missing` in this scope
+  --> $DIR/bad-drop-side-effects.rs:7:16
+   |
+LL | impl<U> B for &Missing {
+   |                ^^^^^^^ not found in this scope
+
+error: aborting due to 1 previous error
+
+For more information about this error, try `rustc --explain E0412`.