mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-28 01:34:21 +00:00
Add some sanity assertions to make sure we use the opaque types correctly
This commit is contained in:
parent
d49b0746f6
commit
a4c1cec4f8
@ -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);
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user