about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--compiler/rustc_borrowck/src/renumber.rs20
-rw-r--r--compiler/rustc_borrowck/src/type_check/mod.rs20
-rw-r--r--compiler/rustc_borrowck/src/type_check/relate_tys.rs14
-rw-r--r--compiler/rustc_borrowck/src/universal_regions.rs119
4 files changed, 92 insertions, 81 deletions
diff --git a/compiler/rustc_borrowck/src/renumber.rs b/compiler/rustc_borrowck/src/renumber.rs
index cf0b944a4c5..c0cb74098fb 100644
--- a/compiler/rustc_borrowck/src/renumber.rs
+++ b/compiler/rustc_borrowck/src/renumber.rs
@@ -9,7 +9,7 @@ use rustc_middle::mir::{Body, Location, Promoted};
 use rustc_middle::ty::subst::SubstsRef;
 use rustc_middle::ty::{self, Ty, TyCtxt, TypeFoldable};
 #[cfg(debug_assertions)]
-use rustc_span::Symbol;
+use rustc_span::{Span, Symbol};
 
 /// Replaces all free regions appearing in the MIR with fresh
 /// inference variables, returning the number of variables created.
@@ -64,14 +64,21 @@ where
 
 #[cfg(debug_assertions)]
 #[derive(Copy, Clone, Debug, Eq, PartialEq, Hash)]
+pub(crate) enum BoundRegionInfo {
+    Name(Symbol),
+    Span(Span),
+}
+
+#[cfg(debug_assertions)]
+#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash)]
 pub(crate) enum RegionCtxt {
     Location(Location),
     TyContext(TyContext),
     Free(Symbol),
-    Bound(Symbol),
-    LateBound(Symbol),
+    Bound(BoundRegionInfo),
+    LateBound(BoundRegionInfo),
     Existential(Option<Symbol>),
-    Placeholder(Symbol),
+    Placeholder(BoundRegionInfo),
     Unknown,
 }
 
@@ -86,10 +93,7 @@ impl RegionCtxt {
         match self {
             RegionCtxt::Unknown => 1,
             RegionCtxt::Existential(None) => 2,
-            RegionCtxt::Existential(Some(_anon))
-            | RegionCtxt::Free(_anon)
-            | RegionCtxt::Bound(_anon)
-            | RegionCtxt::LateBound(_anon) => 2,
+            RegionCtxt::Existential(Some(_anon)) | RegionCtxt::Free(_anon) => 2,
             RegionCtxt::Location(_) => 3,
             RegionCtxt::TyContext(_) => 4,
             _ => 5,
diff --git a/compiler/rustc_borrowck/src/type_check/mod.rs b/compiler/rustc_borrowck/src/type_check/mod.rs
index 1232c524fe4..5d3828b14c9 100644
--- a/compiler/rustc_borrowck/src/type_check/mod.rs
+++ b/compiler/rustc_borrowck/src/type_check/mod.rs
@@ -1346,13 +1346,21 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
 
                     #[cfg(debug_assertions)]
                     {
-                        use crate::renumber::RegionCtxt;
+                        use crate::renumber::{BoundRegionInfo, RegionCtxt};
                         use rustc_span::Symbol;
 
-                        let name = match br.kind {
-                            ty::BoundRegionKind::BrAnon(_) => Symbol::intern("anon"),
-                            ty::BoundRegionKind::BrNamed(_, name) => name,
-                            ty::BoundRegionKind::BrEnv => Symbol::intern("env"),
+                        let reg_info = match br.kind {
+                            // FIXME Probably better to use the `Span` here
+                            ty::BoundRegionKind::BrAnon(_, Some(span)) => {
+                                BoundRegionInfo::Span(span)
+                            }
+                            ty::BoundRegionKind::BrAnon(..) => {
+                                BoundRegionInfo::Name(Symbol::intern("anon"))
+                            }
+                            ty::BoundRegionKind::BrNamed(_, name) => BoundRegionInfo::Name(name),
+                            ty::BoundRegionKind::BrEnv => {
+                                BoundRegionInfo::Name(Symbol::intern("env"))
+                            }
                         };
 
                         self.infcx.next_region_var(
@@ -1361,7 +1369,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
                                 br.kind,
                                 LateBoundRegionConversionTime::FnCall,
                             ),
-                            RegionCtxt::LateBound(name),
+                            RegionCtxt::LateBound(reg_info),
                         )
                     }
                 });
diff --git a/compiler/rustc_borrowck/src/type_check/relate_tys.rs b/compiler/rustc_borrowck/src/type_check/relate_tys.rs
index bb05349b2e9..51ddf02629c 100644
--- a/compiler/rustc_borrowck/src/type_check/relate_tys.rs
+++ b/compiler/rustc_borrowck/src/type_check/relate_tys.rs
@@ -10,7 +10,7 @@ use rustc_trait_selection::traits::query::Fallible;
 use crate::constraints::OutlivesConstraint;
 use crate::diagnostics::UniverseInfo;
 #[cfg(debug_assertions)]
-use crate::renumber::RegionCtxt;
+use crate::renumber::{BoundRegionInfo, RegionCtxt};
 use crate::type_check::{InstantiateOpaqueType, Locations, TypeChecker};
 
 impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
@@ -130,17 +130,19 @@ impl<'tcx> TypeRelatingDelegate<'tcx> for NllTypeRelatingDelegate<'_, '_, 'tcx>
 
         #[cfg(debug_assertions)]
         {
-            let name = match placeholder.name {
-                ty::BoundRegionKind::BrAnon(_) => Symbol::intern("anon"),
-                ty::BoundRegionKind::BrNamed(_, name) => name,
-                ty::BoundRegionKind::BrEnv => Symbol::intern("env"),
+            let reg_info = match placeholder.name {
+                // FIXME Probably better to use the `Span` here
+                ty::BoundRegionKind::BrAnon(_, Some(span)) => BoundRegionInfo::Span(span),
+                ty::BoundRegionKind::BrAnon(..) => BoundRegionInfo::Name(Symbol::intern("anon")),
+                ty::BoundRegionKind::BrNamed(_, name) => BoundRegionInfo::Name(name),
+                ty::BoundRegionKind::BrEnv => BoundRegionInfo::Name(Symbol::intern("env")),
             };
 
             let reg_var = reg
                 .try_get_var()
                 .unwrap_or_else(|| bug!("expected region {:?} to be of kind ReVar", reg));
             let mut var_to_origin = self.type_checker.infcx.reg_var_to_origin.borrow_mut();
-            let prev = var_to_origin.insert(reg_var, RegionCtxt::Placeholder(name));
+            let prev = var_to_origin.insert(reg_var, RegionCtxt::Placeholder(reg_info));
             assert!(matches!(prev, None));
         }
 
diff --git a/compiler/rustc_borrowck/src/universal_regions.rs b/compiler/rustc_borrowck/src/universal_regions.rs
index e22b9de6fc1..e6abdd9b271 100644
--- a/compiler/rustc_borrowck/src/universal_regions.rs
+++ b/compiler/rustc_borrowck/src/universal_regions.rs
@@ -32,7 +32,7 @@ use std::iter;
 
 use crate::nll::ToRegionVid;
 #[cfg(debug_assertions)]
-use crate::renumber::RegionCtxt;
+use crate::renumber::{BoundRegionInfo, RegionCtxt};
 use crate::BorrowckInferCtxt;
 
 #[derive(Debug)]
@@ -446,7 +446,22 @@ impl<'cx, 'tcx> UniversalRegionsBuilder<'cx, 'tcx> {
                 |r| {
                     debug!(?r);
                     if !indices.indices.contains_key(&r) {
+                        #[cfg(not(debug_assertions))]
                         let region_vid = self.infcx.next_nll_region_var(FR);
+
+                        #[cfg(debug_assertions)]
+                        let region_vid = {
+                            let name = match r.get_name() {
+                                Some(name) => name,
+                                _ => Symbol::intern("anon"),
+                            };
+
+                            self.infcx.next_nll_region_var(
+                                FR,
+                                RegionCtxt::LateBound(BoundRegionInfo::Name(name)),
+                            )
+                        };
+
                         debug!(?region_vid);
                         indices.insert_late_bound_region(r, region_vid.to_region_vid());
                     }
@@ -474,7 +489,20 @@ impl<'cx, 'tcx> UniversalRegionsBuilder<'cx, 'tcx> {
         for_each_late_bound_region_in_item(self.infcx.tcx, self.mir_def.did, |r| {
             debug!(?r);
             if !indices.indices.contains_key(&r) {
+                #[cfg(not(debug_assertions))]
                 let region_vid = self.infcx.next_nll_region_var(FR);
+
+                #[cfg(debug_assertions)]
+                let region_vid = {
+                    let name = match r.get_name() {
+                        Some(name) => name,
+                        _ => Symbol::intern("anon"),
+                    };
+
+                    self.infcx
+                        .next_nll_region_var(FR, RegionCtxt::LateBound(BoundRegionInfo::Name(name)))
+                };
+
                 debug!(?region_vid);
                 indices.insert_late_bound_region(r, region_vid.to_region_vid());
             }
@@ -773,7 +801,6 @@ impl<'cx, 'tcx> InferCtxtExt<'tcx> for BorrowckInferCtxt<'cx, 'tcx> {
         })
     }
 
-    #[cfg(not(debug_assertions))]
     #[instrument(level = "debug", skip(self, indices))]
     fn replace_bound_regions_with_nll_infer_vars<T>(
         &self,
@@ -788,39 +815,19 @@ impl<'cx, 'tcx> InferCtxtExt<'tcx> for BorrowckInferCtxt<'cx, 'tcx> {
         let (value, _map) = self.tcx.replace_late_bound_regions(value, |br| {
             debug!(?br);
             let liberated_region = self.tcx.mk_re_free(all_outlive_scope.to_def_id(), br.kind);
+            #[cfg(not(debug_assertions))]
             let region_vid = self.next_nll_region_var(origin);
-            indices.insert_late_bound_region(liberated_region, region_vid.to_region_vid());
-            debug!(?liberated_region, ?region_vid);
-            region_vid
-        });
-        value
-    }
 
-    #[cfg(debug_assertions)]
-    #[instrument(level = "debug", skip(self, indices))]
-    fn replace_bound_regions_with_nll_infer_vars<T>(
-        &self,
-        origin: NllRegionVariableOrigin,
-        all_outlive_scope: LocalDefId,
-        value: ty::Binder<'tcx, T>,
-        indices: &mut UniversalRegionIndices<'tcx>,
-    ) -> T
-    where
-        T: TypeFoldable<'tcx>,
-    {
-        let (value, _map) = self.tcx.replace_late_bound_regions(value, |br| {
-            debug!(?br);
-            let liberated_region = self.tcx.mk_region(ty::ReFree(ty::FreeRegion {
-                scope: all_outlive_scope.to_def_id(),
-                bound_region: br.kind,
-            }));
+            #[cfg(debug_assertions)]
+            let region_vid = {
+                let name = match br.kind.get_name() {
+                    Some(name) => name,
+                    _ => Symbol::intern("anon"),
+                };
 
-            let name = match br.kind.get_name() {
-                Some(name) => name,
-                _ => Symbol::intern("anon"),
+                self.next_nll_region_var(origin, RegionCtxt::Bound(BoundRegionInfo::Name(name)))
             };
 
-            let region_vid = self.next_nll_region_var(origin, RegionCtxt::Bound(name));
             indices.insert_late_bound_region(liberated_region, region_vid.to_region_vid());
             debug!(?liberated_region, ?region_vid);
             region_vid
@@ -837,7 +844,6 @@ impl<'cx, 'tcx> InferCtxtExt<'tcx> for BorrowckInferCtxt<'cx, 'tcx> {
     /// entries for them and store them in the indices map. This code iterates over the complete
     /// set of late-bound regions and checks for any that we have not yet seen, adding them to the
     /// inputs vector.
-    #[cfg(not(debug_assertions))]
     #[instrument(skip(self, indices))]
     fn replace_late_bound_regions_with_nll_infer_vars_in_recursive_scope(
         &self,
@@ -847,7 +853,19 @@ impl<'cx, 'tcx> InferCtxtExt<'tcx> for BorrowckInferCtxt<'cx, 'tcx> {
         for_each_late_bound_region_in_recursive_scope(self.tcx, mir_def_id, |r| {
             debug!(?r);
             if !indices.indices.contains_key(&r) {
+                #[cfg(not(debug_assertions))]
                 let region_vid = self.next_nll_region_var(FR);
+
+                #[cfg(debug_assertions)]
+                let region_vid = {
+                    let name = match r.get_name() {
+                        Some(name) => name,
+                        _ => Symbol::intern("anon"),
+                    };
+
+                    self.next_nll_region_var(FR, RegionCtxt::LateBound(BoundRegionInfo::Name(name)))
+                };
+
                 debug!(?region_vid);
                 indices.insert_late_bound_region(r, region_vid.to_region_vid());
             }
@@ -863,40 +881,19 @@ impl<'cx, 'tcx> InferCtxtExt<'tcx> for BorrowckInferCtxt<'cx, 'tcx> {
         for_each_late_bound_region_in_item(self.tcx, mir_def_id, |r| {
             debug!(?r);
             if !indices.indices.contains_key(&r) {
+                #[cfg(not(debug_assertions))]
                 let region_vid = self.next_nll_region_var(FR);
-                debug!(?region_vid);
-                indices.insert_late_bound_region(r, region_vid.to_region_vid());
-            }
-        });
-    }
 
-    /// Finds late-bound regions that do not appear in the parameter listing and adds them to the
-    /// indices vector. Typically, we identify late-bound regions as we process the inputs and
-    /// outputs of the closure/function. However, sometimes there are late-bound regions which do
-    /// not appear in the fn parameters but which are nonetheless in scope. The simplest case of
-    /// this are unused functions, like fn foo<'a>() { } (see e.g., #51351). Despite not being used,
-    /// users can still reference these regions (e.g., let x: &'a u32 = &22;), so we need to create
-    /// entries for them and store them in the indices map. This code iterates over the complete
-    /// set of late-bound regions and checks for any that we have not yet seen, adding them to the
-    /// inputs vector.
-    #[cfg(debug_assertions)]
-    #[instrument(skip(self, indices))]
-    fn replace_late_bound_regions_with_nll_infer_vars(
-        &self,
-        mir_def_id: LocalDefId,
-        indices: &mut UniversalRegionIndices<'tcx>,
-    ) {
-        let typeck_root_def_id = self.tcx.typeck_root_def_id(mir_def_id.to_def_id());
-        for_each_late_bound_region_defined_on(self.tcx, typeck_root_def_id, |r| {
-            debug!(?r);
-            if !indices.indices.contains_key(&r) {
-                let name = match r.get_name() {
-                    Some(name) => name,
-                    _ => Symbol::intern("anon"),
+                #[cfg(debug_assertions)]
+                let region_vid = {
+                    let name = match r.get_name() {
+                        Some(name) => name,
+                        _ => Symbol::intern("anon"),
+                    };
+
+                    self.next_nll_region_var(FR, RegionCtxt::LateBound(BoundRegionInfo::Name(name)))
                 };
 
-                let region_vid = self.next_nll_region_var(FR, RegionCtxt::LateBound(name));
-                debug!(?region_vid);
                 indices.insert_late_bound_region(r, region_vid.to_region_vid());
             }
         });