Skip to content

Commit 674c657

Browse files
committed
more directly handle member constraints
1 parent 37e7459 commit 674c657

File tree

4 files changed

+375
-71
lines changed

4 files changed

+375
-71
lines changed

compiler/rustc_borrowck/src/member_constraints.rs

+25-21
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,9 @@ use std::ops::Index;
44
use rustc_data_structures::captures::Captures;
55
use rustc_data_structures::fx::FxIndexMap;
66
use rustc_index::{IndexSlice, IndexVec};
7-
use rustc_middle::infer::MemberConstraint;
87
use rustc_middle::ty::{self, Ty};
98
use rustc_span::Span;
10-
use tracing::debug;
9+
use tracing::instrument;
1110

1211
/// Compactly stores a set of `R0 member of [R1...Rn]` constraints,
1312
/// indexed by the region `R0`.
@@ -70,37 +69,42 @@ impl Default for MemberConstraintSet<'_, ty::RegionVid> {
7069
}
7170

7271
impl<'tcx> MemberConstraintSet<'tcx, ty::RegionVid> {
72+
pub(crate) fn is_empty(&self) -> bool {
73+
self.constraints.is_empty()
74+
}
75+
7376
/// Pushes a member constraint into the set.
74-
///
75-
/// The input member constraint `m_c` is in the form produced by
76-
/// the `rustc_middle::infer` code.
77-
///
78-
/// The `to_region_vid` callback fn is used to convert the regions
79-
/// within into `RegionVid` format -- it typically consults the
80-
/// `UniversalRegions` data structure that is known to the caller
81-
/// (but which this code is unaware of).
82-
pub(crate) fn push_constraint(
77+
#[instrument(level = "debug", skip(self))]
78+
pub(crate) fn add_member_constraint(
8379
&mut self,
84-
m_c: &MemberConstraint<'tcx>,
85-
mut to_region_vid: impl FnMut(ty::Region<'tcx>) -> ty::RegionVid,
80+
key: ty::OpaqueTypeKey<'tcx>,
81+
hidden_ty: Ty<'tcx>,
82+
definition_span: Span,
83+
member_region_vid: ty::RegionVid,
84+
choice_regions: &[ty::RegionVid],
8685
) {
87-
debug!("push_constraint(m_c={:?})", m_c);
88-
let member_region_vid: ty::RegionVid = to_region_vid(m_c.member_region);
8986
let next_constraint = self.first_constraints.get(&member_region_vid).cloned();
9087
let start_index = self.choice_regions.len();
91-
let end_index = start_index + m_c.choice_regions.len();
92-
debug!("push_constraint: member_region_vid={:?}", member_region_vid);
88+
self.choice_regions.extend(choice_regions);
89+
let end_index = self.choice_regions.len();
9390
let constraint_index = self.constraints.push(NllMemberConstraint {
9491
next_constraint,
9592
member_region_vid,
96-
definition_span: m_c.definition_span,
97-
hidden_ty: m_c.hidden_ty,
98-
key: m_c.key,
93+
definition_span,
94+
hidden_ty,
95+
key,
9996
start_index,
10097
end_index,
10198
});
10299
self.first_constraints.insert(member_region_vid, constraint_index);
103-
self.choice_regions.extend(m_c.choice_regions.iter().map(|&r| to_region_vid(r)));
100+
}
101+
102+
// TODO: removed in the next commit
103+
pub(crate) fn push_constraint(
104+
&mut self,
105+
_: &rustc_middle::infer::MemberConstraint<'tcx>,
106+
_: impl FnMut(ty::Region<'tcx>) -> ty::RegionVid,
107+
) {
104108
}
105109
}
106110

compiler/rustc_borrowck/src/region_infer/mod.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -571,7 +571,9 @@ impl<'tcx> RegionInferenceContext<'tcx> {
571571
/// Given a universal region in scope on the MIR, returns the
572572
/// corresponding index.
573573
///
574-
/// (Panics if `r` is not a registered universal region.)
574+
/// Panics if `r` is not a registered universal region, most notably
575+
/// if it is a placeholder. Handling placeholders requires access to the
576+
/// `MirTypeckRegionConstraints`.
575577
pub(crate) fn to_region_vid(&self, r: ty::Region<'tcx>) -> RegionVid {
576578
self.universal_regions().to_region_vid(r)
577579
}

compiler/rustc_borrowck/src/type_check/mod.rs

+12-49
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,7 @@ use rustc_mir_dataflow::points::DenseLocationMap;
4040
use rustc_span::def_id::CRATE_DEF_ID;
4141
use rustc_span::source_map::Spanned;
4242
use rustc_span::{DUMMY_SP, Span, sym};
43-
use rustc_trait_selection::traits::query::type_op::custom::{
44-
CustomTypeOp, scrape_region_constraints,
45-
};
43+
use rustc_trait_selection::traits::query::type_op::custom::scrape_region_constraints;
4644
use rustc_trait_selection::traits::query::type_op::{TypeOp, TypeOpOutput};
4745
use tracing::{debug, instrument, trace};
4846

@@ -89,6 +87,7 @@ mod constraint_conversion;
8987
pub(crate) mod free_region_relations;
9088
mod input_output;
9189
pub(crate) mod liveness;
90+
mod opaque_types;
9291
mod relate_tys;
9392

9493
/// Type checks the given `mir` in the context of the inference
@@ -179,52 +178,8 @@ pub(crate) fn type_check<'a, 'tcx>(
179178

180179
liveness::generate(&mut typeck, body, &elements, flow_inits, move_data);
181180

182-
let opaque_type_values = infcx
183-
.take_opaque_types()
184-
.into_iter()
185-
.map(|(opaque_type_key, decl)| {
186-
let _: Result<_, ErrorGuaranteed> = typeck.fully_perform_op(
187-
Locations::All(body.span),
188-
ConstraintCategory::OpaqueType,
189-
CustomTypeOp::new(
190-
|ocx| {
191-
ocx.infcx.register_member_constraints(
192-
opaque_type_key,
193-
decl.hidden_type.ty,
194-
decl.hidden_type.span,
195-
);
196-
Ok(())
197-
},
198-
"opaque_type_map",
199-
),
200-
);
201-
let hidden_type = infcx.resolve_vars_if_possible(decl.hidden_type);
202-
trace!("finalized opaque type {:?} to {:#?}", opaque_type_key, hidden_type.ty.kind());
203-
if hidden_type.has_non_region_infer() {
204-
infcx.dcx().span_bug(
205-
decl.hidden_type.span,
206-
format!("could not resolve {:#?}", hidden_type.ty.kind()),
207-
);
208-
}
209-
210-
// Convert all regions to nll vars.
211-
let (opaque_type_key, hidden_type) =
212-
fold_regions(infcx.tcx, (opaque_type_key, hidden_type), |region, _| {
213-
match region.kind() {
214-
ty::ReVar(_) => region,
215-
ty::RePlaceholder(placeholder) => {
216-
typeck.constraints.placeholder_region(infcx, placeholder)
217-
}
218-
_ => ty::Region::new_var(
219-
infcx.tcx,
220-
typeck.universal_regions.to_region_vid(region),
221-
),
222-
}
223-
});
224-
225-
(opaque_type_key, hidden_type)
226-
})
227-
.collect();
181+
let opaque_type_values =
182+
opaque_types::take_opaques_and_register_member_constraints(&mut typeck);
228183

229184
MirTypeckResults { constraints, universal_region_relations, opaque_type_values }
230185
}
@@ -955,6 +910,14 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
955910
self.body
956911
}
957912

913+
fn to_region_vid(&mut self, r: ty::Region<'tcx>) -> RegionVid {
914+
if let ty::RePlaceholder(placeholder) = r.kind() {
915+
self.constraints.placeholder_region(self.infcx, placeholder).as_var()
916+
} else {
917+
self.universal_regions.to_region_vid(r)
918+
}
919+
}
920+
958921
fn unsized_feature_enabled(&self) -> bool {
959922
let features = self.tcx().features();
960923
features.unsized_locals() || features.unsized_fn_params()

0 commit comments

Comments
 (0)