Skip to content

Commit 42a8b5f

Browse files
Only consider predicate non-global if binder vars are in PREDICATE binder
1 parent a932eb3 commit 42a8b5f

File tree

2 files changed

+6
-5
lines changed
  • compiler
    • rustc_hir_analysis/src/check
    • rustc_trait_selection/src/traits/select

2 files changed

+6
-5
lines changed

compiler/rustc_hir_analysis/src/check/wfcheck.rs

+3-4
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,8 @@ use rustc_middle::query::Providers;
1919
use rustc_middle::traits::solve::NoSolution;
2020
use rustc_middle::ty::trait_def::TraitSpecializationKind;
2121
use rustc_middle::ty::{
22-
self, AdtKind, GenericArgKind, GenericArgs, GenericParamDefKind, Ty, TyCtxt, TypeFlags,
23-
TypeFoldable, TypeSuperVisitable, TypeVisitable, TypeVisitableExt, TypeVisitor, TypingMode,
24-
Upcast,
22+
self, AdtKind, GenericArgKind, GenericArgs, GenericParamDefKind, Ty, TyCtxt, TypeFoldable,
23+
TypeSuperVisitable, TypeVisitable, TypeVisitableExt, TypeVisitor, TypingMode, Upcast,
2524
};
2625
use rustc_middle::{bug, span_bug};
2726
use rustc_session::parse::feature_err;
@@ -2319,7 +2318,7 @@ impl<'tcx> WfCheckingCtxt<'_, 'tcx> {
23192318
continue;
23202319
}
23212320
// Match the existing behavior.
2322-
if pred.is_global() && !pred.has_type_flags(TypeFlags::HAS_BINDER_VARS) {
2321+
if pred.is_global() && !pred.kind().skip_binder().has_escaping_bound_vars() {
23232322
let pred = self.normalize(span, None, pred);
23242323

23252324
// only use the span of the predicate clause (#90869)

compiler/rustc_trait_selection/src/traits/select/mod.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -1864,7 +1864,9 @@ impl<'tcx> SelectionContext<'_, 'tcx> {
18641864
//
18651865
// Our handling of where-bounds is generally fairly messy but necessary for backwards
18661866
// compatibility, see #50825 for why we need to handle global where-bounds like this.
1867-
let is_global = |c: ty::PolyTraitPredicate<'tcx>| c.is_global() && !c.has_bound_vars();
1867+
let is_global = |c: ty::PolyTraitPredicate<'tcx>| {
1868+
c.is_global() && !c.skip_binder().has_escaping_bound_vars()
1869+
};
18681870
let param_candidates = candidates
18691871
.iter()
18701872
.filter_map(|c| if let ParamCandidate(p) = c.candidate { Some(p) } else { None });

0 commit comments

Comments
 (0)