Skip to content

Commit 54588cf

Browse files
committed
-Znext-solver Ignore region constraints from the nested goals in leakcheck
1 parent 7f82ec1 commit 54588cf

33 files changed

Lines changed: 519 additions & 172 deletions

File tree

compiler/rustc_borrowck/src/type_check/constraint_conversion.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ 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 &(constraint, constraint_category, _) in constraints {
7878
constraint.iter_outlives().for_each(|predicate| {
7979
self.convert(predicate, constraint_category, &assumptions);
8080
});
@@ -205,6 +205,7 @@ impl<'a, 'tcx> ConstraintConversion<'a, 'tcx> {
205205
t1,
206206
r2,
207207
constraint_category,
208+
ty::VisibleForLeakCheck::Yes,
208209
);
209210
}
210211

@@ -296,7 +297,7 @@ impl<'a, 'tcx> ConstraintConversion<'a, 'tcx> {
296297
// FIXME(higher_ranked_auto): What should we do with the assumptions here?
297298
if let Some(QueryRegionConstraints { constraints, assumptions: _ }) = constraints {
298299
next_outlives_predicates.extend(constraints.iter().flat_map(
299-
|(constraint, category)| {
300+
|(constraint, category, _)| {
300301
constraint.iter_outlives().map(|outlives| (outlives, *category))
301302
},
302303
));
@@ -315,6 +316,7 @@ impl<'a, 'b, 'tcx> TypeOutlivesDelegate<'tcx> for &'a mut ConstraintConversion<'
315316
a: ty::Region<'tcx>,
316317
b: ty::Region<'tcx>,
317318
constraint_category: ConstraintCategory<'tcx>,
319+
_vis: ty::VisibleForLeakCheck,
318320
) {
319321
let b = self.to_region_vid(b);
320322
let a = self.to_region_vid(a);

compiler/rustc_hir_analysis/src/check/wfcheck.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -709,6 +709,7 @@ fn ty_known_to_outlive<'tcx>(
709709
sub_region: region,
710710
sup_type: ty,
711711
origin: SubregionOrigin::RelateParamBound(DUMMY_SP, ty, None),
712+
visible_for_leak_check: ty::VisibleForLeakCheck::Yes,
712713
});
713714
})
714715
}
@@ -728,6 +729,7 @@ fn region_known_to_outlive<'tcx>(
728729
SubregionOrigin::RelateRegionParamBound(DUMMY_SP, None),
729730
region_b,
730731
region_a,
732+
ty::VisibleForLeakCheck::Yes,
731733
);
732734
})
733735
}

compiler/rustc_hir_analysis/src/coherence/builtin.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -490,7 +490,12 @@ pub(crate) fn coerce_unsized_info<'tcx>(
490490
}
491491

492492
(&ty::Ref(r_a, ty_a, mutbl_a), &ty::Ref(r_b, ty_b, mutbl_b)) => {
493-
infcx.sub_regions(SubregionOrigin::RelateObjectBound(span), r_b, r_a);
493+
infcx.sub_regions(
494+
SubregionOrigin::RelateObjectBound(span),
495+
r_b,
496+
r_a,
497+
ty::VisibleForLeakCheck::Yes,
498+
);
494499
let mt_a = ty::TypeAndMut { ty: ty_a, mutbl: mutbl_a };
495500
let mt_b = ty::TypeAndMut { ty: ty_b, mutbl: mutbl_b };
496501
check_mutbl(mt_a, mt_b, &|ty| Ty::new_imm_ref(tcx, r_b, ty))

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

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -188,14 +188,14 @@ 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) in &query_response.value.region_constraints.constraints {
191+
for (constraint, _category, vis) in &query_response.value.region_constraints.constraints {
192192
let constraint = instantiate_value(self.tcx, &result_args, *constraint);
193193
match constraint {
194194
ty::RegionConstraint::Outlives(predicate) => {
195-
self.register_outlives_constraint(predicate, cause);
195+
self.register_outlives_constraint(predicate, *vis, cause);
196196
}
197197
ty::RegionConstraint::Eq(predicate) => {
198-
self.register_region_eq_constraint(predicate, cause);
198+
self.register_region_eq_constraint(predicate, *vis, cause);
199199
}
200200
}
201201
}
@@ -288,6 +288,7 @@ impl<'tcx> InferCtxt<'tcx> {
288288
output_query_region_constraints.constraints.push((
289289
ty::RegionEqPredicate(v_o.into(), v_r).into(),
290290
constraint_category,
291+
ty::VisibleForLeakCheck::Yes,
291292
));
292293
}
293294
}
@@ -586,6 +587,7 @@ impl<'tcx> InferCtxt<'tcx> {
586587
SubregionOrigin::RelateRegionParamBound(cause.span, None),
587588
v1,
588589
v2,
590+
ty::VisibleForLeakCheck::Yes,
589591
);
590592
}
591593
(GenericArgKind::Const(v1), GenericArgKind::Const(v2)) => {
@@ -623,20 +625,23 @@ pub fn make_query_region_constraints<'tcx>(
623625
| ConstraintKind::RegSubReg => {
624626
// Swap regions because we are going from sub (<=) to outlives (>=).
625627
let constraint = ty::OutlivesPredicate(c.sup.into(), c.sub).into();
626-
(constraint, origin.to_constraint_category())
628+
(constraint, origin.to_constraint_category(), c.visible_for_leak_check)
627629
}
628630

629631
ConstraintKind::VarEqVar | ConstraintKind::VarEqReg | ConstraintKind::RegEqReg => {
630632
let constraint = ty::RegionEqPredicate(c.sup, c.sub).into();
631-
(constraint, origin.to_constraint_category())
633+
(constraint, origin.to_constraint_category(), c.visible_for_leak_check)
632634
}
633635
})
634-
.chain(outlives_obligations.into_iter().map(|obl| {
635-
(
636-
ty::OutlivesPredicate(obl.sup_type.into(), obl.sub_region).into(),
637-
obl.origin.to_constraint_category(),
638-
)
639-
}))
636+
.chain(outlives_obligations.into_iter().map(
637+
|TypeOutlivesConstraint { sub_region, sup_type, origin, visible_for_leak_check }| {
638+
(
639+
ty::OutlivesPredicate(sup_type.into(), sub_region).into(),
640+
origin.to_constraint_category(),
641+
visible_for_leak_check,
642+
)
643+
},
644+
))
640645
.collect();
641646

642647
QueryRegionConstraints { constraints, assumptions }

compiler/rustc_infer/src/infer/context.rs

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -256,24 +256,44 @@ impl<'tcx> rustc_type_ir::InferCtxtLike for InferCtxt<'tcx> {
256256
self.probe(|_| probe())
257257
}
258258

259-
fn sub_regions(&self, sub: ty::Region<'tcx>, sup: ty::Region<'tcx>, span: Span) {
259+
fn sub_regions(
260+
&self,
261+
sub: ty::Region<'tcx>,
262+
sup: ty::Region<'tcx>,
263+
vis: ty::VisibleForLeakCheck,
264+
span: Span,
265+
) {
260266
self.inner.borrow_mut().unwrap_region_constraints().make_subregion(
261267
SubregionOrigin::RelateRegionParamBound(span, None),
262268
sub,
263269
sup,
270+
vis,
264271
);
265272
}
266273

267-
fn equate_regions(&self, a: ty::Region<'tcx>, b: ty::Region<'tcx>, span: Span) {
274+
fn equate_regions(
275+
&self,
276+
a: ty::Region<'tcx>,
277+
b: ty::Region<'tcx>,
278+
vis: ty::VisibleForLeakCheck,
279+
span: Span,
280+
) {
268281
self.inner.borrow_mut().unwrap_region_constraints().make_eqregion(
269282
SubregionOrigin::RelateRegionParamBound(span, None),
270283
a,
271284
b,
285+
vis,
272286
);
273287
}
274288

275-
fn register_ty_outlives(&self, ty: Ty<'tcx>, r: ty::Region<'tcx>, span: Span) {
276-
self.register_type_outlives_constraint(ty, r, &ObligationCause::dummy_with_span(span));
289+
fn register_ty_outlives(
290+
&self,
291+
ty: Ty<'tcx>,
292+
r: ty::Region<'tcx>,
293+
vis: ty::VisibleForLeakCheck,
294+
span: Span,
295+
) {
296+
self.register_type_outlives_constraint(ty, r, vis, &ObligationCause::dummy_with_span(span));
277297
}
278298

279299
type OpaqueTypeStorageEntries = OpaqueTypeStorageEntries;

compiler/rustc_infer/src/infer/mod.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -510,6 +510,7 @@ pub struct TypeOutlivesConstraint<'tcx> {
510510
pub sub_region: ty::Region<'tcx>,
511511
pub sup_type: Ty<'tcx>,
512512
pub origin: SubregionOrigin<'tcx>,
513+
pub visible_for_leak_check: ty::VisibleForLeakCheck,
513514
}
514515

515516
/// Used to configure inference contexts before their creation.
@@ -698,8 +699,9 @@ impl<'tcx> InferCtxt<'tcx> {
698699
origin: SubregionOrigin<'tcx>,
699700
a: ty::Region<'tcx>,
700701
b: ty::Region<'tcx>,
702+
vis: ty::VisibleForLeakCheck,
701703
) {
702-
self.inner.borrow_mut().unwrap_region_constraints().make_subregion(origin, a, b);
704+
self.inner.borrow_mut().unwrap_region_constraints().make_subregion(origin, a, b, vis);
703705
}
704706

705707
#[instrument(skip(self), level = "debug")]
@@ -708,8 +710,9 @@ impl<'tcx> InferCtxt<'tcx> {
708710
origin: SubregionOrigin<'tcx>,
709711
a: ty::Region<'tcx>,
710712
b: ty::Region<'tcx>,
713+
vis: ty::VisibleForLeakCheck,
711714
) {
712-
self.inner.borrow_mut().unwrap_region_constraints().make_eqregion(origin, a, b);
715+
self.inner.borrow_mut().unwrap_region_constraints().make_eqregion(origin, a, b, vis);
713716
}
714717

715718
/// Processes a `Coerce` predicate from the fulfillment context.

0 commit comments

Comments
 (0)