about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--compiler/rustc_infer/src/infer/opaque_types/table.rs12
-rw-r--r--compiler/rustc_typeck/src/check/writeback.rs4
2 files changed, 14 insertions, 2 deletions
diff --git a/compiler/rustc_infer/src/infer/opaque_types/table.rs b/compiler/rustc_infer/src/infer/opaque_types/table.rs
index 11eeeb08c98..6b5d55784b2 100644
--- a/compiler/rustc_infer/src/infer/opaque_types/table.rs
+++ b/compiler/rustc_infer/src/infer/opaque_types/table.rs
@@ -6,7 +6,7 @@ use crate::infer::InferCtxtUndoLogs;
 
 use super::{OpaqueTypeDecl, OpaqueTypeMap};
 
-#[derive(Default)]
+#[derive(Default, Debug)]
 pub struct OpaqueTypeStorage<'tcx> {
     // Opaque types found in explicit return types and their
     // associated fresh inference variable. Writeback resolves these
@@ -23,6 +23,7 @@ pub struct OpaqueTypeStorage<'tcx> {
 }
 
 impl<'tcx> OpaqueTypeStorage<'tcx> {
+    #[instrument(level = "debug")]
     pub(crate) fn remove(&mut self, key: OpaqueTypeKey<'tcx>) {
         match self.opaque_types.remove(&key) {
             None => bug!("reverted opaque type inference that was never registered"),
@@ -42,6 +43,7 @@ impl<'tcx> OpaqueTypeStorage<'tcx> {
         self.opaque_types.clone()
     }
 
+    #[instrument(level = "debug")]
     pub fn take_opaque_types(&mut self) -> OpaqueTypeMap<'tcx> {
         std::mem::take(&mut self.opaque_types)
     }
@@ -54,6 +56,13 @@ impl<'tcx> OpaqueTypeStorage<'tcx> {
         OpaqueTypeTable { storage: self, undo_log }
     }
 }
+
+impl<'tcx> Drop for OpaqueTypeStorage<'tcx> {
+    fn drop(&mut self) {
+        assert!(self.opaque_types.is_empty(), "{:?}", self.opaque_types);
+    }
+}
+
 pub struct OpaqueTypeTable<'a, 'tcx> {
     storage: &'a mut OpaqueTypeStorage<'tcx>,
 
@@ -61,6 +70,7 @@ pub struct OpaqueTypeTable<'a, 'tcx> {
 }
 
 impl<'a, 'tcx> OpaqueTypeTable<'a, 'tcx> {
+    #[instrument(skip(self), level = "debug")]
     pub fn register(&mut self, key: OpaqueTypeKey<'tcx>, decl: OpaqueTypeDecl<'tcx>) {
         self.undo_log.push(key);
         self.storage.opaque_types.insert(key, decl);
diff --git a/compiler/rustc_typeck/src/check/writeback.rs b/compiler/rustc_typeck/src/check/writeback.rs
index 165ca1574cd..e4c9cdbeef3 100644
--- a/compiler/rustc_typeck/src/check/writeback.rs
+++ b/compiler/rustc_typeck/src/check/writeback.rs
@@ -498,7 +498,9 @@ impl<'cx, 'tcx> WritebackCx<'cx, 'tcx> {
 
     #[instrument(skip(self, span), level = "debug")]
     fn visit_opaque_types(&mut self, span: Span) {
-        for (opaque_type_key, opaque_defn) in self.fcx.infcx.opaque_types() {
+        let opaque_types =
+            self.fcx.infcx.inner.borrow_mut().opaque_type_storage.take_opaque_types();
+        for (opaque_type_key, opaque_defn) in opaque_types {
             let hir_id =
                 self.tcx().hir().local_def_id_to_hir_id(opaque_type_key.def_id.expect_local());
             let instantiated_ty = self.resolve(opaque_defn.concrete_ty, &hir_id);