Skip to content

Commit 2deeda4

Browse files
authored
Rollup merge of #157494 - Human9000-bit:queryregionconstrains-as-struct, r=ShoyuVanilla
Convert `QueryRegionConstraint` into a struct as per in fixme
2 parents d48970e + 36742d8 commit 2deeda4

6 files changed

Lines changed: 45 additions & 26 deletions

File tree

compiler/rustc_borrowck/src/type_check/constraint_conversion.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use rustc_data_structures::fx::FxHashSet;
22
use rustc_hir::def_id::LocalDefId;
33
use rustc_infer::infer::SubregionOrigin;
4-
use rustc_infer::infer::canonical::QueryRegionConstraints;
4+
use rustc_infer::infer::canonical::{QueryRegionConstraint, QueryRegionConstraints};
55
use rustc_infer::infer::outlives::env::RegionBoundPairs;
66
use rustc_infer::infer::outlives::obligations::{TypeOutlives, TypeOutlivesDelegate};
77
use rustc_infer::infer::region_constraints::{GenericKind, VerifyBound};
@@ -74,9 +74,9 @@ impl<'a, 'tcx> ConstraintConversion<'a, 'tcx> {
7474
let assumptions =
7575
elaborate::elaborate_outlives_assumptions(self.infcx.tcx, assumptions.iter().copied());
7676

77-
for &(constraint, constraint_category, _) in constraints {
77+
for &QueryRegionConstraint { constraint, category, .. } in constraints {
7878
constraint.iter_outlives().for_each(|predicate| {
79-
self.convert(predicate, constraint_category, &assumptions);
79+
self.convert(predicate, category, &assumptions);
8080
});
8181
}
8282
}
@@ -296,7 +296,7 @@ impl<'a, 'tcx> ConstraintConversion<'a, 'tcx> {
296296
// FIXME(higher_ranked_auto): What should we do with the assumptions here?
297297
if let Some(QueryRegionConstraints { constraints, assumptions: _ }) = constraints {
298298
next_outlives_predicates.extend(constraints.iter().flat_map(
299-
|(constraint, category, _)| {
299+
|QueryRegionConstraint { constraint, category, .. }| {
300300
constraint.iter_outlives().map(|outlives| (outlives, *category))
301301
},
302302
));

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

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use std::iter;
1313
use rustc_index::{Idx, IndexVec};
1414
use rustc_middle::arena::ArenaAllocatable;
1515
use rustc_middle::bug;
16-
use rustc_middle::infer::canonical::CanonicalVarKind;
16+
use rustc_middle::infer::canonical::{CanonicalVarKind, QueryRegionConstraint};
1717
use rustc_middle::ty::{self, BoundVar, GenericArg, GenericArgKind, Ty, TyCtxt, TypeFoldable};
1818
use tracing::{debug, instrument};
1919

@@ -188,7 +188,9 @@ impl<'tcx> InferCtxt<'tcx> {
188188
let InferOk { value: result_args, obligations } =
189189
self.query_response_instantiation(cause, param_env, original_values, query_response)?;
190190

191-
for (constraint, _category, vis) in &query_response.value.region_constraints.constraints {
191+
for QueryRegionConstraint { constraint, visible_for_leak_check: vis, .. } in
192+
&query_response.value.region_constraints.constraints
193+
{
192194
let constraint = instantiate_value(self.tcx, &result_args, *constraint);
193195
match constraint {
194196
ty::RegionConstraint::Outlives(predicate) => {
@@ -285,11 +287,12 @@ impl<'tcx> InferCtxt<'tcx> {
285287

286288
(GenericArgKind::Lifetime(v_o), GenericArgKind::Lifetime(v_r)) => {
287289
if v_o != v_r {
288-
output_query_region_constraints.constraints.push((
289-
ty::RegionEqPredicate(v_o, v_r).into(),
290-
constraint_category,
291-
ty::VisibleForLeakCheck::Yes,
292-
));
290+
let constraint = QueryRegionConstraint {
291+
constraint: ty::RegionEqPredicate(v_o, v_r).into(),
292+
category: constraint_category,
293+
visible_for_leak_check: ty::VisibleForLeakCheck::Yes,
294+
};
295+
output_query_region_constraints.constraints.push(constraint);
293296
}
294297
}
295298

@@ -321,7 +324,7 @@ impl<'tcx> InferCtxt<'tcx> {
321324
let r_c = instantiate_value(self.tcx, &result_args, r_c);
322325

323326
// Screen out `'a: 'a` or `'a == 'a` cases.
324-
if r_c.0.is_trivial() { None } else { Some(r_c) }
327+
if r_c.constraint.is_trivial() { None } else { Some(r_c) }
325328
}),
326329
);
327330

@@ -616,7 +619,7 @@ pub fn make_query_region_constraints<'tcx>(
616619

617620
debug!(?constraints);
618621

619-
let constraints: Vec<_> = constraints
622+
let constraints: Vec<QueryRegionConstraint<'tcx>> = constraints
620623
.iter()
621624
.map(|(c, origin)| match c.kind {
622625
ConstraintKind::VarSubVar
@@ -625,22 +628,30 @@ pub fn make_query_region_constraints<'tcx>(
625628
| ConstraintKind::RegSubReg => {
626629
// Swap regions because we are going from sub (<=) to outlives (>=).
627630
let constraint = ty::OutlivesPredicate(c.sup.into(), c.sub).into();
628-
(constraint, origin.to_constraint_category(), c.visible_for_leak_check)
631+
QueryRegionConstraint {
632+
constraint,
633+
category: origin.to_constraint_category(),
634+
visible_for_leak_check: c.visible_for_leak_check,
635+
}
629636
}
630637

631638
ConstraintKind::VarEqVar | ConstraintKind::VarEqReg | ConstraintKind::RegEqReg => {
632639
let constraint = ty::RegionEqPredicate(c.sup, c.sub).into();
633-
(constraint, origin.to_constraint_category(), c.visible_for_leak_check)
640+
QueryRegionConstraint {
641+
constraint,
642+
category: origin.to_constraint_category(),
643+
visible_for_leak_check: c.visible_for_leak_check,
644+
}
634645
}
635646
})
636647
.chain(outlives_obligations.into_iter().map(
637648
|TypeOutlivesConstraint { sub_region, sup_type, origin }| {
638-
(
639-
ty::OutlivesPredicate(sup_type.into(), sub_region).into(),
640-
origin.to_constraint_category(),
649+
QueryRegionConstraint {
650+
constraint: ty::OutlivesPredicate(sup_type.into(), sub_region).into(),
651+
category: origin.to_constraint_category(),
641652
// We don't do leak checks for type outlives
642-
ty::VisibleForLeakCheck::Unreachable,
643-
)
653+
visible_for_leak_check: ty::VisibleForLeakCheck::Unreachable,
654+
}
644655
},
645656
))
646657
.collect();

compiler/rustc_middle/src/infer/canonical.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -135,9 +135,12 @@ impl<'tcx, R> QueryResponse<'tcx, R> {
135135
}
136136
}
137137

138-
// FIXME: Convert this into a struct
139-
pub type QueryRegionConstraint<'tcx> =
140-
(ty::RegionConstraint<'tcx>, ConstraintCategory<'tcx>, ty::VisibleForLeakCheck);
138+
#[derive(Debug, StableHash, Hash, Eq, PartialEq, TypeVisitable, Clone, TypeFoldable, Copy)]
139+
pub struct QueryRegionConstraint<'tcx> {
140+
pub constraint: ty::RegionConstraint<'tcx>,
141+
pub category: ConstraintCategory<'tcx>,
142+
pub visible_for_leak_check: ty::VisibleForLeakCheck,
143+
}
141144

142145
#[derive(Default)]
143146
pub struct CanonicalParamEnvCache<'tcx> {

compiler/rustc_trait_selection/src/solve/delegate.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use rustc_hir::def_id::{CRATE_DEF_ID, DefId};
77
use rustc_infer::infer::canonical::query_response::make_query_region_constraints;
88
use rustc_infer::infer::canonical::{
99
Canonical, CanonicalExt as _, CanonicalQueryInput, CanonicalVarKind, CanonicalVarValues,
10+
QueryRegionConstraint,
1011
};
1112
use rustc_infer::infer::{InferCtxt, RegionVariableOrigin, SubregionOrigin, TyCtxtInferExt};
1213
use rustc_infer::traits::solve::{FetchEligibleAssocItemResponse, Goal};
@@ -262,7 +263,9 @@ impl<'tcx> rustc_next_trait_solver::delegate::SolverDelegate for SolverDelegate<
262263

263264
let mut seen = FxHashMap::default();
264265
let mut constraints = vec![];
265-
for (outlives, _, vis) in region_constraints.constraints {
266+
for QueryRegionConstraint { constraint: outlives, visible_for_leak_check: vis, .. } in
267+
region_constraints.constraints
268+
{
266269
match seen.entry(outlives) {
267270
Entry::Occupied(occupied) => {
268271
let idx = occupied.get();

compiler/rustc_trait_selection/src/traits/outlives_bounds.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use rustc_infer::infer::InferOk;
2+
use rustc_infer::infer::canonical::QueryRegionConstraint;
23
use rustc_infer::infer::resolve::OpportunisticRegionResolver;
34
use rustc_infer::traits::query::type_op::ImpliedOutlivesBounds;
45
use rustc_macros::extension;
@@ -83,7 +84,7 @@ fn implied_outlives_bounds<'a, 'tcx>(
8384
// outlives bound required proving some higher-ranked coroutine obl.
8485
let QueryRegionConstraints { constraints, assumptions: _ } = constraints;
8586
let cause = ObligationCause::misc(span, body_id);
86-
for &(constraint, _, vis) in &constraints {
87+
for &QueryRegionConstraint { constraint, visible_for_leak_check: vis, .. } in &constraints {
8788
match constraint {
8889
ty::RegionConstraint::Outlives(predicate) => {
8990
infcx.register_outlives_constraint(predicate, vis, &cause)

compiler/rustc_traits/src/coroutine_witnesses.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use rustc_infer::infer::TyCtxtInferExt;
2+
use rustc_infer::infer::canonical::QueryRegionConstraint;
23
use rustc_infer::infer::canonical::query_response::make_query_region_constraints;
34
use rustc_infer::infer::resolve::OpportunisticRegionResolver;
45
use rustc_infer::traits::{Obligation, ObligationCause};
@@ -80,7 +81,7 @@ fn compute_assumptions<'tcx>(
8081
tcx.mk_outlives_from_iter(
8182
constraints
8283
.into_iter()
83-
.flat_map(|(constraint, _, _)| constraint.iter_outlives())
84+
.flat_map(|QueryRegionConstraint { constraint, .. }| constraint.iter_outlives())
8485
// FIXME(higher_ranked_auto): We probably should deeply resolve these before
8586
// filtering out infers which only correspond to unconstrained infer regions
8687
// which we can sometimes get.

0 commit comments

Comments
 (0)