diff --git a/compiler/rustc_typeck/src/check/wfcheck.rs b/compiler/rustc_typeck/src/check/wfcheck.rs index b2be70e707dab..a017fe51565bc 100644 --- a/compiler/rustc_typeck/src/check/wfcheck.rs +++ b/compiler/rustc_typeck/src/check/wfcheck.rs @@ -17,6 +17,7 @@ use rustc_infer::infer::outlives::obligations::TypeOutlives; use rustc_infer::infer::region_constraints::GenericKind; use rustc_infer::infer::{self, RegionckMode}; use rustc_infer::infer::{InferCtxt, TyCtxtInferExt}; +use rustc_infer::traits::TraitEngine; use rustc_middle::hir::nested_filter; use rustc_middle::ty::subst::{GenericArgKind, InternalSubsts, Subst}; use rustc_middle::ty::trait_def::TraitSpecializationKind; @@ -1796,7 +1797,7 @@ fn report_bivariance( /// Feature gates RFC 2056 -- trivial bounds, checking for global bounds that /// aren't true. -fn check_false_global_bounds(fcx: &FnCtxt<'_, '_>, mut span: Span, id: hir::HirId) { +fn check_false_global_bounds(fcx: &FnCtxt<'_, '_>, span: Span, id: hir::HirId) { let empty_env = ty::ParamEnv::empty(); let def_id = fcx.tcx.hir().local_def_id(id); @@ -1807,26 +1808,27 @@ fn check_false_global_bounds(fcx: &FnCtxt<'_, '_>, mut span: Span, id: hir::HirI for obligation in implied_obligations { let pred = obligation.predicate; + + // only use the span of the predicate clause (#90869) + let hir_node = fcx.tcx.hir().find(id); + let span = if let Some(hir::Generics { where_clause, .. }) = + hir_node.and_then(|node| node.generics()) + { + let obligation_span = obligation.cause.span(fcx.tcx); + where_clause + .predicates + .iter() + // There seems to be no better way to find out which predicate we are in + .find(|pred| pred.span().contains(obligation_span)) + .map(|pred| pred.span()) + .unwrap_or(obligation_span) + } else { + span + }; + // Match the existing behavior. if pred.is_global() && !pred.has_late_bound_regions() { let pred = fcx.normalize_associated_types_in(span, pred); - let hir_node = fcx.tcx.hir().find(id); - - // only use the span of the predicate clause (#90869) - - if let Some(hir::Generics { where_clause, .. }) = - hir_node.and_then(|node| node.generics()) - { - let obligation_span = obligation.cause.span(fcx.tcx); - - span = where_clause - .predicates - .iter() - // There seems to be no better way to find out which predicate we are in - .find(|pred| pred.span().contains(obligation_span)) - .map(|pred| pred.span()) - .unwrap_or(obligation_span); - } let obligation = traits::Obligation::new( traits::ObligationCause::new(span, id, traits::TrivialBound), @@ -1834,6 +1836,36 @@ fn check_false_global_bounds(fcx: &FnCtxt<'_, '_>, mut span: Span, id: hir::HirI pred, ); fcx.register_predicate(obligation); + } else { + let infer::InferOk { value: norm_pred, obligations } = + fcx.normalize_associated_types_in_as_infer_ok(span, pred); + if norm_pred.is_global() { + fcx.probe(|_| { + let mut fulfillment_cx = traits::FulfillmentContext::new_in_snapshot(); + for obligation in obligations { + fulfillment_cx.register_predicate_obligation(&fcx, obligation); + } + fulfillment_cx.register_predicate_obligation(&fcx, traits::Obligation::new( + traits::ObligationCause::new(span, id, traits::TrivialBound), + empty_env, + norm_pred, + )); + if !fulfillment_cx.select_all_or_error(&fcx).is_empty() { + let mut diag = fcx + .tcx + .sess + // NOTE: Error for the crater run + .struct_span_warn(span, "where-clause bound is impossible to satisfy"); + diag.note(format!("the bound `{}` was previously accepted, but it may become a hard error in a future release", pred)); + if fcx.sess().opts.unstable_features.is_nightly_build() { + diag.help( + "add `#![feature(trivial_bounds)]` to the crate attributes to allow it", + ); + } + diag.emit(); + } + }) + } } } diff --git a/src/test/ui/associated-types/bound-lifetime-in-binding-only.ok.stderr b/src/test/ui/associated-types/bound-lifetime-in-binding-only.ok.stderr index b709fae5a8e56..6dbb52a824712 100644 --- a/src/test/ui/associated-types/bound-lifetime-in-binding-only.ok.stderr +++ b/src/test/ui/associated-types/bound-lifetime-in-binding-only.ok.stderr @@ -1,5 +1,5 @@ error: fatal error triggered by #[rustc_error] - --> $DIR/bound-lifetime-in-binding-only.rs:71:1 + --> $DIR/bound-lifetime-in-binding-only.rs:75:1 | LL | fn main() { } | ^^^^^^^^^ diff --git a/src/test/ui/associated-types/bound-lifetime-in-binding-only.rs b/src/test/ui/associated-types/bound-lifetime-in-binding-only.rs index e714457ef7b38..c21f0c271202c 100644 --- a/src/test/ui/associated-types/bound-lifetime-in-binding-only.rs +++ b/src/test/ui/associated-types/bound-lifetime-in-binding-only.rs @@ -55,6 +55,10 @@ fn elision &i32>() { struct Parameterized<'a> { x: &'a str } +impl<'a> Foo for Parameterized<'a> { + type Item = &'a i32; +} + #[cfg(ok)] fn ok1 Fn(&Parameterized<'a>) -> &'a i32>() { } diff --git a/src/test/ui/associated-types/issue-69398.rs b/src/test/ui/associated-types/issue-69398.rs index ca3d66b1c8eb7..7a2a52aec2c0f 100644 --- a/src/test/ui/associated-types/issue-69398.rs +++ b/src/test/ui/associated-types/issue-69398.rs @@ -12,6 +12,7 @@ pub trait Broken { impl Broken for T { type Assoc = (); fn broken(&self) where Self::Assoc: Foo { + //~^ WARN where-clause bound is impossible to satisfy let _x: ::Bar; } } diff --git a/src/test/ui/associated-types/issue-69398.stderr b/src/test/ui/associated-types/issue-69398.stderr new file mode 100644 index 0000000000000..e5df65c329088 --- /dev/null +++ b/src/test/ui/associated-types/issue-69398.stderr @@ -0,0 +1,11 @@ +warning: where-clause bound is impossible to satisfy + --> $DIR/issue-69398.rs:14:28 + | +LL | fn broken(&self) where Self::Assoc: Foo { + | ^^^^^^^^^^^^^^^^ + | + = note: the bound `::Assoc: Foo` was previously accepted, but it may become a hard error in a future release + = help: add `#![feature(trivial_bounds)]` to the crate attributes to allow it + +warning: 1 warning emitted + diff --git a/src/test/ui/consts/issue-67696-const-prop-ice.rs b/src/test/ui/consts/issue-67696-const-prop-ice.rs index ad52608b3f46d..88a7e87961912 100644 --- a/src/test/ui/consts/issue-67696-const-prop-ice.rs +++ b/src/test/ui/consts/issue-67696-const-prop-ice.rs @@ -10,11 +10,18 @@ trait A { } impl A for [fn(&())] { - fn foo(&self) -> Self where Self: Copy { *(&[] as &[_]) } + fn foo(&self) -> Self where Self: Copy { + //~^ WARN where-clause bound is impossible to satisfy + //~| WARN where-clause bound is impossible to satisfy + //~| WARN where-clause bound is impossible to satisfy + *(&[] as &[_]) + } } impl A for i32 { - fn foo(&self) -> Self { 3 } + fn foo(&self) -> Self { + 3 + } } fn main() {} diff --git a/src/test/ui/consts/issue-67696-const-prop-ice.stderr b/src/test/ui/consts/issue-67696-const-prop-ice.stderr new file mode 100644 index 0000000000000..11110cb6572bc --- /dev/null +++ b/src/test/ui/consts/issue-67696-const-prop-ice.stderr @@ -0,0 +1,29 @@ +warning: where-clause bound is impossible to satisfy + --> $DIR/issue-67696-const-prop-ice.rs:13:33 + | +LL | fn foo(&self) -> Self where Self: Copy { + | ^^^^^^^^^^ + | + = note: the bound `[for<'r> fn(&'r ())]: Copy` was previously accepted, but it may become a hard error in a future release + = help: add `#![feature(trivial_bounds)]` to the crate attributes to allow it + +warning: where-clause bound is impossible to satisfy + --> $DIR/issue-67696-const-prop-ice.rs:13:33 + | +LL | fn foo(&self) -> Self where Self: Copy { + | ^^^^^^^^^^ + | + = note: the bound `[for<'r> fn(&'r ())]: Clone` was previously accepted, but it may become a hard error in a future release + = help: add `#![feature(trivial_bounds)]` to the crate attributes to allow it + +warning: where-clause bound is impossible to satisfy + --> $DIR/issue-67696-const-prop-ice.rs:13:33 + | +LL | fn foo(&self) -> Self where Self: Copy { + | ^^^^^^^^^^ + | + = note: the bound `[for<'r> fn(&'r ())]: Sized` was previously accepted, but it may become a hard error in a future release + = help: add `#![feature(trivial_bounds)]` to the crate attributes to allow it + +warning: 3 warnings emitted + diff --git a/src/test/ui/feature-gates/feature-gate-trivial_bounds.rs b/src/test/ui/feature-gates/feature-gate-trivial_bounds.rs index 3dbaf5dea250e..05d2cfd202c9b 100644 --- a/src/test/ui/feature-gates/feature-gate-trivial_bounds.rs +++ b/src/test/ui/feature-gates/feature-gate-trivial_bounds.rs @@ -62,7 +62,9 @@ fn return_str() -> str where str: Sized { //~ ERROR // This is currently accepted because the function pointer isn't // considered global. +// FIXME(compiler-errors): Not for long.. fn global_hr(x: fn(&())) where fn(&()): Foo { // OK + //~^ WARN where-clause bound is impossible to satisfy x.test(); } diff --git a/src/test/ui/feature-gates/feature-gate-trivial_bounds.stderr b/src/test/ui/feature-gates/feature-gate-trivial_bounds.stderr index 1b87ebd9f20ce..75abcbaca9669 100644 --- a/src/test/ui/feature-gates/feature-gate-trivial_bounds.stderr +++ b/src/test/ui/feature-gates/feature-gate-trivial_bounds.stderr @@ -113,6 +113,15 @@ LL | fn return_str() -> str where str: Sized { = help: see issue #48214 = help: add `#![feature(trivial_bounds)]` to the crate attributes to enable -error: aborting due to 11 previous errors +warning: where-clause bound is impossible to satisfy + --> $DIR/feature-gate-trivial_bounds.rs:66:32 + | +LL | fn global_hr(x: fn(&())) where fn(&()): Foo { // OK + | ^^^^^^^^^^^^ + | + = note: the bound `for<'r> fn(&'r ()): Foo` was previously accepted, but it may become a hard error in a future release + = help: add `#![feature(trivial_bounds)]` to the crate attributes to allow it + +error: aborting due to 11 previous errors; 1 warning emitted For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/higher-rank-trait-bounds/normalize-under-binder/issue-89118.rs b/src/test/ui/higher-rank-trait-bounds/normalize-under-binder/issue-89118.rs index fffb54f86ca03..6e3e0ff2a2757 100644 --- a/src/test/ui/higher-rank-trait-bounds/normalize-under-binder/issue-89118.rs +++ b/src/test/ui/higher-rank-trait-bounds/normalize-under-binder/issue-89118.rs @@ -7,6 +7,7 @@ impl BufferUdpStateContext for C {} trait StackContext where Ctx<()>: for<'a> BufferUdpStateContext<&'a ()>, + //~^ WARN where-clause bound is impossible to satisfy { type Dispatcher; } @@ -26,6 +27,8 @@ where struct EthernetWorker(C) where Ctx<()>: for<'a> BufferUdpStateContext<&'a ()>; + //~^ WARN where-clause bound is impossible to satisfy + impl EthernetWorker {} //~^ ERROR: is not satisfied [E0277] diff --git a/src/test/ui/higher-rank-trait-bounds/normalize-under-binder/issue-89118.stderr b/src/test/ui/higher-rank-trait-bounds/normalize-under-binder/issue-89118.stderr index 7f45fb83cef08..8be4aaf31ef34 100644 --- a/src/test/ui/higher-rank-trait-bounds/normalize-under-binder/issue-89118.stderr +++ b/src/test/ui/higher-rank-trait-bounds/normalize-under-binder/issue-89118.stderr @@ -1,5 +1,14 @@ +warning: where-clause bound is impossible to satisfy + --> $DIR/issue-89118.rs:9:5 + | +LL | Ctx<()>: for<'a> BufferUdpStateContext<&'a ()>, + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: the bound `for<'a> Ctx<()>: BufferUdpStateContext<&'a ()>` was previously accepted, but it may become a hard error in a future release + = help: add `#![feature(trivial_bounds)]` to the crate attributes to allow it + error[E0277]: the trait bound `for<'a> &'a (): BufferMut` is not satisfied - --> $DIR/issue-89118.rs:19:8 + --> $DIR/issue-89118.rs:20:8 | LL | C: StackContext, | ^^^^^^^^^^^^ the trait `for<'a> BufferMut` is not implemented for `&'a ()` @@ -19,7 +28,7 @@ LL | Ctx<()>: for<'a> BufferUdpStateContext<&'a ()>, | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `StackContext` error[E0277]: the trait bound `for<'a> &'a (): BufferMut` is not satisfied - --> $DIR/issue-89118.rs:22:20 + --> $DIR/issue-89118.rs:23:20 | LL | type Handler = Ctx; | ^^^^^^^^^^^^^^^^^^ the trait `for<'a> BufferMut` is not implemented for `&'a ()` @@ -38,8 +47,17 @@ LL | where LL | Ctx<()>: for<'a> BufferUdpStateContext<&'a ()>, | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `StackContext` +warning: where-clause bound is impossible to satisfy + --> $DIR/issue-89118.rs:29:5 + | +LL | Ctx<()>: for<'a> BufferUdpStateContext<&'a ()>; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: the bound `for<'a> Ctx<()>: BufferUdpStateContext<&'a ()>` was previously accepted, but it may become a hard error in a future release + = help: add `#![feature(trivial_bounds)]` to the crate attributes to allow it + error[E0277]: the trait bound `for<'a> &'a (): BufferMut` is not satisfied - --> $DIR/issue-89118.rs:29:9 + --> $DIR/issue-89118.rs:32:9 | LL | impl EthernetWorker {} | ^^^^^^^^^^^^^^^^^ the trait `for<'a> BufferMut` is not implemented for `&'a ()` @@ -50,7 +68,7 @@ note: required because of the requirements on the impl of `for<'a> BufferUdpStat LL | impl BufferUdpStateContext for C {} | ^^^^^^^^^^^^^^^^^^^^^^^^ ^ note: required by a bound in `EthernetWorker` - --> $DIR/issue-89118.rs:28:14 + --> $DIR/issue-89118.rs:29:14 | LL | struct EthernetWorker(C) | -------------- required by a bound in this @@ -58,6 +76,6 @@ LL | where LL | Ctx<()>: for<'a> BufferUdpStateContext<&'a ()>; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `EthernetWorker` -error: aborting due to 3 previous errors +error: aborting due to 3 previous errors; 2 warnings emitted For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/issues/issue-36839.rs b/src/test/ui/issues/issue-36839.rs index ca3d66b1c8eb7..7a2a52aec2c0f 100644 --- a/src/test/ui/issues/issue-36839.rs +++ b/src/test/ui/issues/issue-36839.rs @@ -12,6 +12,7 @@ pub trait Broken { impl Broken for T { type Assoc = (); fn broken(&self) where Self::Assoc: Foo { + //~^ WARN where-clause bound is impossible to satisfy let _x: ::Bar; } } diff --git a/src/test/ui/issues/issue-36839.stderr b/src/test/ui/issues/issue-36839.stderr new file mode 100644 index 0000000000000..2960a5132bac2 --- /dev/null +++ b/src/test/ui/issues/issue-36839.stderr @@ -0,0 +1,11 @@ +warning: where-clause bound is impossible to satisfy + --> $DIR/issue-36839.rs:14:28 + | +LL | fn broken(&self) where Self::Assoc: Foo { + | ^^^^^^^^^^^^^^^^ + | + = note: the bound `::Assoc: Foo` was previously accepted, but it may become a hard error in a future release + = help: add `#![feature(trivial_bounds)]` to the crate attributes to allow it + +warning: 1 warning emitted + diff --git a/src/test/ui/issues/issue-39970.rs b/src/test/ui/issues/issue-39970.rs index f51e3b522e1c5..959c9b013c3ee 100644 --- a/src/test/ui/issues/issue-39970.rs +++ b/src/test/ui/issues/issue-39970.rs @@ -13,6 +13,7 @@ impl<'a> Array<'a> for () { impl Visit for () where //(): for<'a> Array<'a, Element=&'a ()>, // No ICE (): for<'a> Array<'a, Element=()>, // ICE + //~^ WARN where-clause bound is impossible to satisfy {} fn main() { diff --git a/src/test/ui/issues/issue-39970.stderr b/src/test/ui/issues/issue-39970.stderr index 1f64a90bc1cf9..a075171448b0b 100644 --- a/src/test/ui/issues/issue-39970.stderr +++ b/src/test/ui/issues/issue-39970.stderr @@ -1,5 +1,14 @@ +warning: where-clause bound is impossible to satisfy + --> $DIR/issue-39970.rs:15:5 + | +LL | (): for<'a> Array<'a, Element=()>, // ICE + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: the bound `for<'a> <() as Array<'a>>::Element == ()` was previously accepted, but it may become a hard error in a future release + = help: add `#![feature(trivial_bounds)]` to the crate attributes to allow it + error[E0271]: type mismatch resolving `for<'a> <() as Array<'a>>::Element == ()` - --> $DIR/issue-39970.rs:19:5 + --> $DIR/issue-39970.rs:20:5 | LL | <() as Visit>::visit(); | ^^^^^^^^^^^^^^^^^^^^ type mismatch resolving `for<'a> <() as Array<'a>>::Element == ()` @@ -15,6 +24,6 @@ note: required because of the requirements on the impl of `Visit` for `()` LL | impl Visit for () where | ^^^^^ ^^ -error: aborting due to previous error +error: aborting due to previous error; 1 warning emitted For more information about this error, try `rustc --explain E0271`. diff --git a/src/test/ui/issues/issue-42796.rs b/src/test/ui/issues/issue-42796.rs index 5e83a1cd67785..2ed7cd397e07f 100644 --- a/src/test/ui/issues/issue-42796.rs +++ b/src/test/ui/issues/issue-42796.rs @@ -7,6 +7,7 @@ impl Mirror for T { } pub fn poison(victim: String) where >::Image: Copy { + //~^ WARN where-clause bound is impossible to satisfy loop { drop(victim); } } diff --git a/src/test/ui/issues/issue-42796.stderr b/src/test/ui/issues/issue-42796.stderr index 4a1debf37a079..71b675545c10b 100644 --- a/src/test/ui/issues/issue-42796.stderr +++ b/src/test/ui/issues/issue-42796.stderr @@ -1,5 +1,14 @@ +warning: where-clause bound is impossible to satisfy + --> $DIR/issue-42796.rs:9:40 + | +LL | pub fn poison(victim: String) where >::Image: Copy { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: the bound `>::Image: Copy` was previously accepted, but it may become a hard error in a future release + = help: add `#![feature(trivial_bounds)]` to the crate attributes to allow it + error[E0382]: borrow of moved value: `s` - --> $DIR/issue-42796.rs:18:20 + --> $DIR/issue-42796.rs:19:20 | LL | let s = "Hello!".to_owned(); | - move occurs because `s` has type `String`, which does not implement the `Copy` trait @@ -11,6 +20,6 @@ LL | println!("{}", s); | = note: this error originates in the macro `$crate::format_args_nl` (in Nightly builds, run with -Z macro-backtrace for more info) -error: aborting due to previous error +error: aborting due to previous error; 1 warning emitted For more information about this error, try `rustc --explain E0382`. diff --git a/src/test/ui/mir/issue-91745.rs b/src/test/ui/mir/issue-91745.rs index ca3d66b1c8eb7..7a2a52aec2c0f 100644 --- a/src/test/ui/mir/issue-91745.rs +++ b/src/test/ui/mir/issue-91745.rs @@ -12,6 +12,7 @@ pub trait Broken { impl Broken for T { type Assoc = (); fn broken(&self) where Self::Assoc: Foo { + //~^ WARN where-clause bound is impossible to satisfy let _x: ::Bar; } } diff --git a/src/test/ui/mir/issue-91745.stderr b/src/test/ui/mir/issue-91745.stderr new file mode 100644 index 0000000000000..3065ac21484bb --- /dev/null +++ b/src/test/ui/mir/issue-91745.stderr @@ -0,0 +1,11 @@ +warning: where-clause bound is impossible to satisfy + --> $DIR/issue-91745.rs:14:28 + | +LL | fn broken(&self) where Self::Assoc: Foo { + | ^^^^^^^^^^^^^^^^ + | + = note: the bound `::Assoc: Foo` was previously accepted, but it may become a hard error in a future release + = help: add `#![feature(trivial_bounds)]` to the crate attributes to allow it + +warning: 1 warning emitted + diff --git a/src/test/ui/regions/regions-normalize-in-where-clause-list.rs b/src/test/ui/regions/regions-normalize-in-where-clause-list.rs index 9912e88c2ec57..e9315bb34b512 100644 --- a/src/test/ui/regions/regions-normalize-in-where-clause-list.rs +++ b/src/test/ui/regions/regions-normalize-in-where-clause-list.rs @@ -23,9 +23,9 @@ where // Here we get an error: we need `'a: 'b`. fn bar<'a, 'b>() //~^ ERROR cannot infer -//~| ERROR cannot infer where <() as Project<'a, 'b>>::Item: Eq, + //~^ ERROR cannot infer { } diff --git a/src/test/ui/regions/regions-normalize-in-where-clause-list.stderr b/src/test/ui/regions/regions-normalize-in-where-clause-list.stderr index 2bb58b5ec2df5..f7d4bffcf2613 100644 --- a/src/test/ui/regions/regions-normalize-in-where-clause-list.stderr +++ b/src/test/ui/regions/regions-normalize-in-where-clause-list.stderr @@ -3,7 +3,6 @@ error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'a` d | LL | / fn bar<'a, 'b>() LL | | -LL | | LL | | where LL | | <() as Project<'a, 'b>>::Item: Eq, | |______________________________________^ @@ -23,7 +22,6 @@ note: ...so that the types are compatible | LL | / fn bar<'a, 'b>() LL | | -LL | | LL | | where LL | | <() as Project<'a, 'b>>::Item: Eq, | |______________________________________^ @@ -31,10 +29,10 @@ LL | | <() as Project<'a, 'b>>::Item: Eq, found `Project<'_, '_>` error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'a` due to conflicting requirements - --> $DIR/regions-normalize-in-where-clause-list.rs:24:4 + --> $DIR/regions-normalize-in-where-clause-list.rs:27:5 | -LL | fn bar<'a, 'b>() - | ^^^ +LL | <() as Project<'a, 'b>>::Item: Eq, + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | note: first, the lifetime cannot outlive the lifetime `'a` as defined here... --> $DIR/regions-normalize-in-where-clause-list.rs:24:8 @@ -47,10 +45,10 @@ note: ...but the lifetime must also be valid for the lifetime `'b` as defined he LL | fn bar<'a, 'b>() | ^^ note: ...so that the types are compatible - --> $DIR/regions-normalize-in-where-clause-list.rs:24:4 + --> $DIR/regions-normalize-in-where-clause-list.rs:27:5 | -LL | fn bar<'a, 'b>() - | ^^^ +LL | <() as Project<'a, 'b>>::Item: Eq, + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ = note: expected `Project<'a, 'b>` found `Project<'_, '_>`