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};
|
use super::{OpaqueTypeDecl, OpaqueTypeMap};
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default, Debug)]
|
||||||
pub struct OpaqueTypeStorage<'tcx> {
|
pub struct OpaqueTypeStorage<'tcx> {
|
||||||
// Opaque types found in explicit return types and their
|
// Opaque types found in explicit return types and their
|
||||||
// associated fresh inference variable. Writeback resolves these
|
// associated fresh inference variable. Writeback resolves these
|
||||||
@ -23,6 +23,7 @@ pub struct OpaqueTypeStorage<'tcx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> OpaqueTypeStorage<'tcx> {
|
impl<'tcx> OpaqueTypeStorage<'tcx> {
|
||||||
|
#[instrument(level = "debug")]
|
||||||
pub(crate) fn remove(&mut self, key: OpaqueTypeKey<'tcx>) {
|
pub(crate) fn remove(&mut self, key: OpaqueTypeKey<'tcx>) {
|
||||||
match self.opaque_types.remove(&key) {
|
match self.opaque_types.remove(&key) {
|
||||||
None => bug!("reverted opaque type inference that was never registered"),
|
None => bug!("reverted opaque type inference that was never registered"),
|
||||||
@ -42,6 +43,7 @@ impl<'tcx> OpaqueTypeStorage<'tcx> {
|
|||||||
self.opaque_types.clone()
|
self.opaque_types.clone()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[instrument(level = "debug")]
|
||||||
pub fn take_opaque_types(&mut self) -> OpaqueTypeMap<'tcx> {
|
pub fn take_opaque_types(&mut self) -> OpaqueTypeMap<'tcx> {
|
||||||
std::mem::take(&mut self.opaque_types)
|
std::mem::take(&mut self.opaque_types)
|
||||||
}
|
}
|
||||||
@ -54,6 +56,13 @@ impl<'tcx> OpaqueTypeStorage<'tcx> {
|
|||||||
OpaqueTypeTable { storage: self, undo_log }
|
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> {
|
pub struct OpaqueTypeTable<'a, 'tcx> {
|
||||||
storage: &'a mut OpaqueTypeStorage<'tcx>,
|
storage: &'a mut OpaqueTypeStorage<'tcx>,
|
||||||
|
|
||||||
@ -61,6 +70,7 @@ pub struct OpaqueTypeTable<'a, 'tcx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, 'tcx> 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>) {
|
pub fn register(&mut self, key: OpaqueTypeKey<'tcx>, decl: OpaqueTypeDecl<'tcx>) {
|
||||||
self.undo_log.push(key);
|
self.undo_log.push(key);
|
||||||
self.storage.opaque_types.insert(key, decl);
|
self.storage.opaque_types.insert(key, decl);
|
||||||
|
@ -498,7 +498,9 @@ impl<'cx, 'tcx> WritebackCx<'cx, 'tcx> {
|
|||||||
|
|
||||||
#[instrument(skip(self, span), level = "debug")]
|
#[instrument(skip(self, span), level = "debug")]
|
||||||
fn visit_opaque_types(&mut self, span: Span) {
|
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 =
|
let hir_id =
|
||||||
self.tcx().hir().local_def_id_to_hir_id(opaque_type_key.def_id.expect_local());
|
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);
|
let instantiated_ty = self.resolve(opaque_defn.concrete_ty, &hir_id);
|
||||||
|
Loading…
Reference in New Issue
Block a user