Skip to content

Commit 960ebaf

Browse files
committed
collect existentials and placeholders
1 parent 2f79f73 commit 960ebaf

File tree

5 files changed

+76
-20
lines changed

5 files changed

+76
-20
lines changed

compiler/rustc_borrowck/src/renumber.rs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
1-
<<<<<<< HEAD
21
#![deny(rustc::untranslatable_diagnostic)]
32
#![deny(rustc::diagnostic_outside_of_impl)]
4-
=======
53
use crate::BorrowckInferCtxt;
6-
>>>>>>> 2464f768a17 (collect region contexts during mir renumbering)
74
use rustc_index::vec::IndexVec;
85
use rustc_infer::infer::NllRegionVariableOrigin;
96
use rustc_middle::mir::visit::{MutVisitor, TyContext};

compiler/rustc_borrowck/src/type_check/mod.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ use crate::{
6464
region_infer::TypeTest,
6565
type_check::free_region_relations::{CreateResult, UniversalRegionRelations},
6666
universal_regions::{DefiningTy, UniversalRegions},
67-
Upvar,
67+
BorrowckInferCtxt, Upvar,
6868
};
6969

7070
macro_rules! span_mirbug {
@@ -123,7 +123,7 @@ mod relate_tys;
123123
/// - `move_data` -- move-data constructed when performing the maybe-init dataflow analysis
124124
/// - `elements` -- MIR region map
125125
pub(crate) fn type_check<'mir, 'tcx>(
126-
infcx: &InferCtxt<'tcx>,
126+
infcx: &BorrowckInferCtxt<'_, 'tcx>,
127127
param_env: ty::ParamEnv<'tcx>,
128128
body: &Body<'tcx>,
129129
promoted: &IndexVec<Promoted, Body<'tcx>>,
@@ -845,7 +845,7 @@ impl<'a, 'b, 'tcx> TypeVerifier<'a, 'b, 'tcx> {
845845
/// way, it accrues region constraints -- these can later be used by
846846
/// NLL region checking.
847847
struct TypeChecker<'a, 'tcx> {
848-
infcx: &'a InferCtxt<'tcx>,
848+
infcx: &'a BorrowckInferCtxt<'a, 'tcx>,
849849
param_env: ty::ParamEnv<'tcx>,
850850
last_span: Span,
851851
body: &'a Body<'tcx>,
@@ -998,7 +998,7 @@ impl Locations {
998998

999999
impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
10001000
fn new(
1001-
infcx: &'a InferCtxt<'tcx>,
1001+
infcx: &'a BorrowckInferCtxt<'a, 'tcx>,
10021002
body: &'a Body<'tcx>,
10031003
param_env: ty::ParamEnv<'tcx>,
10041004
region_bound_pairs: &'a RegionBoundPairs<'tcx>,

compiler/rustc_borrowck/src/type_check/relate_tys.rs

Lines changed: 54 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@ use rustc_infer::traits::PredicateObligations;
44
use rustc_middle::mir::ConstraintCategory;
55
use rustc_middle::ty::relate::TypeRelation;
66
use rustc_middle::ty::{self, Ty};
7-
use rustc_span::Span;
7+
use rustc_span::{Span, Symbol};
88
use rustc_trait_selection::traits::query::Fallible;
99

1010
use crate::constraints::OutlivesConstraint;
1111
use crate::diagnostics::UniverseInfo;
12+
use crate::renumber::RegionCtxt;
1213
use crate::type_check::{InstantiateOpaqueType, Locations, TypeChecker};
1314

1415
impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
@@ -100,23 +101,69 @@ impl<'tcx> TypeRelatingDelegate<'tcx> for NllTypeRelatingDelegate<'_, '_, 'tcx>
100101
universe
101102
}
102103

103-
fn next_existential_region_var(&mut self, from_forall: bool) -> ty::Region<'tcx> {
104+
#[instrument(skip(self), level = "debug")]
105+
fn next_existential_region_var(
106+
&mut self,
107+
from_forall: bool,
108+
_name: Option<Symbol>,
109+
) -> ty::Region<'tcx> {
104110
let origin = NllRegionVariableOrigin::Existential { from_forall };
105-
self.type_checker.infcx.next_nll_region_var(origin)
111+
112+
#[cfg(not(debug_assertions))]
113+
let reg_var = self.type_checker.infcx.next_nll_region_var(origin);
114+
115+
#[cfg(debug_assertions)]
116+
let reg_var =
117+
self.type_checker.infcx.next_nll_region_var(origin, RegionCtxt::Existential(_name));
118+
119+
reg_var
106120
}
107121

122+
#[instrument(skip(self), level = "debug")]
108123
fn next_placeholder_region(&mut self, placeholder: ty::PlaceholderRegion) -> ty::Region<'tcx> {
109-
self.type_checker
124+
let reg = self
125+
.type_checker
110126
.borrowck_context
111127
.constraints
112-
.placeholder_region(self.type_checker.infcx, placeholder)
128+
.placeholder_region(self.type_checker.infcx, placeholder);
129+
130+
#[cfg(debug_assertions)]
131+
{
132+
let name = match placeholder.name {
133+
ty::BoundRegionKind::BrAnon(_) => Symbol::intern("anon"),
134+
ty::BoundRegionKind::BrNamed(_, name) => name,
135+
ty::BoundRegionKind::BrEnv => Symbol::intern("env"),
136+
};
137+
138+
let reg_var = reg
139+
.try_get_var()
140+
.unwrap_or_else(|| bug!("expected region {:?} to be of kind ReVar", reg));
141+
let mut var_to_origin = self.type_checker.infcx.reg_var_to_origin.borrow_mut();
142+
let prev = var_to_origin.insert(reg_var, RegionCtxt::Placeholder(name));
143+
assert!(matches!(prev, None));
144+
}
145+
146+
reg
113147
}
114148

149+
#[instrument(skip(self), level = "debug")]
115150
fn generalize_existential(&mut self, universe: ty::UniverseIndex) -> ty::Region<'tcx> {
116-
self.type_checker.infcx.next_nll_region_var_in_universe(
151+
let reg = self.type_checker.infcx.next_nll_region_var_in_universe(
117152
NllRegionVariableOrigin::Existential { from_forall: false },
118153
universe,
119-
)
154+
);
155+
156+
#[cfg(debug_assertions)]
157+
{
158+
let reg_var = reg
159+
.try_get_var()
160+
.unwrap_or_else(|| bug!("expected region {:?} to be of kind ReVar", reg));
161+
let mut var_to_origin = self.type_checker.infcx.reg_var_to_origin.borrow_mut();
162+
let prev = var_to_origin.insert(reg_var, RegionCtxt::Existential(None));
163+
assert!(matches!(prev, None));
164+
}
165+
166+
reg
120167
}
121168

122169
fn push_outlives(

compiler/rustc_infer/src/infer/canonical/query_response.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ use rustc_middle::ty::fold::TypeFoldable;
2727
use rustc_middle::ty::relate::TypeRelation;
2828
use rustc_middle::ty::subst::{GenericArg, GenericArgKind};
2929
use rustc_middle::ty::{self, BoundVar, ToPredicate, Ty, TyCtxt};
30-
use rustc_span::Span;
30+
use rustc_span::{Span, Symbol};
3131
use std::fmt::Debug;
3232
use std::iter;
3333

@@ -318,7 +318,11 @@ impl<'tcx> InferCtxt<'tcx> {
318318

319319
// Screen out `'a: 'a` cases.
320320
let ty::OutlivesPredicate(k1, r2) = r_c.0;
321-
if k1 != r2.into() { Some(r_c) } else { None }
321+
if k1 != r2.into() {
322+
Some(r_c)
323+
} else {
324+
None
325+
}
322326
}),
323327
);
324328

@@ -683,7 +687,11 @@ impl<'tcx> TypeRelatingDelegate<'tcx> for QueryTypeRelatingDelegate<'_, 'tcx> {
683687
self.infcx.create_next_universe()
684688
}
685689

686-
fn next_existential_region_var(&mut self, from_forall: bool) -> ty::Region<'tcx> {
690+
fn next_existential_region_var(
691+
&mut self,
692+
from_forall: bool,
693+
_name: Option<Symbol>,
694+
) -> ty::Region<'tcx> {
687695
let origin = NllRegionVariableOrigin::Existential { from_forall };
688696
self.infcx.next_nll_region_var(origin)
689697
}

compiler/rustc_infer/src/infer/nll_relate/mod.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ use rustc_middle::ty::error::TypeError;
3131
use rustc_middle::ty::relate::{self, Relate, RelateResult, TypeRelation};
3232
use rustc_middle::ty::visit::{ir::TypeVisitor, TypeSuperVisitable, TypeVisitable};
3333
use rustc_middle::ty::{self, InferConst, Ty, TyCtxt};
34-
use rustc_span::Span;
34+
use rustc_span::{Span, Symbol};
3535
use std::fmt::Debug;
3636
use std::ops::ControlFlow;
3737

@@ -100,7 +100,11 @@ pub trait TypeRelatingDelegate<'tcx> {
100100
/// we will invoke this method to instantiate `'a` with an
101101
/// inference variable (though `'b` would be instantiated first,
102102
/// as a placeholder).
103-
fn next_existential_region_var(&mut self, was_placeholder: bool) -> ty::Region<'tcx>;
103+
fn next_existential_region_var(
104+
&mut self,
105+
was_placeholder: bool,
106+
name: Option<Symbol>,
107+
) -> ty::Region<'tcx>;
104108

105109
/// Creates a new region variable representing a
106110
/// higher-ranked region that is instantiated universally.
@@ -188,7 +192,7 @@ where
188192
let placeholder = ty::PlaceholderRegion { universe, name: br.kind };
189193
delegate.next_placeholder_region(placeholder)
190194
} else {
191-
delegate.next_existential_region_var(true)
195+
delegate.next_existential_region_var(true, br.kind.get_name())
192196
}
193197
}
194198
};

0 commit comments

Comments
 (0)