Also passthrough for projection clauses

This commit is contained in:
Michael Goulet 2024-06-04 09:43:49 -04:00
parent b0c1474381
commit 44040a0670
9 changed files with 15 additions and 18 deletions

View File

@ -460,7 +460,9 @@ fn visit_goal(&mut self, goal: &inspect::InspectGoal<'_, 'tcx>) -> Self::Result
polarity: ty::PredicatePolarity::Positive, polarity: ty::PredicatePolarity::Positive,
})) }))
} }
ty::PredicateKind::Clause(ty::ClauseKind::WellFormed(_)) ty::PredicateKind::Clause(
ty::ClauseKind::WellFormed(_) | ty::ClauseKind::Projection(..),
)
| ty::PredicateKind::AliasRelate(..) => ChildMode::PassThrough, | ty::PredicateKind::AliasRelate(..) => ChildMode::PassThrough,
_ => { _ => {
return ControlFlow::Break(self.obligation.clone()); return ControlFlow::Break(self.obligation.clone());

View File

@ -1,8 +1,8 @@
error[E0284]: type annotations needed: cannot satisfy `for<'a> <_ as Trait<'a>>::Assoc <: <T as Trait<'_>>::Assoc` error[E0284]: type annotations needed: cannot satisfy `for<'a> <_ as Trait<'a>>::Assoc normalizes-to <T as Trait<'_>>::Assoc`
--> $DIR/rigid-equate-projections-in-higher-ranked-fn-signature.rs:27:50 --> $DIR/rigid-equate-projections-in-higher-ranked-fn-signature.rs:27:50
| |
LL | let _: for<'a> fn(<_ as Trait<'a>>::Assoc) = foo::<T>(); LL | let _: for<'a> fn(<_ as Trait<'a>>::Assoc) = foo::<T>();
| ^^^^^^^^^^ cannot satisfy `for<'a> <_ as Trait<'a>>::Assoc <: <T as Trait<'_>>::Assoc` | ^^^^^^^^^^ cannot satisfy `for<'a> <_ as Trait<'a>>::Assoc normalizes-to <T as Trait<'_>>::Assoc`
error: aborting due to 1 previous error error: aborting due to 1 previous error

View File

@ -2,13 +2,8 @@ error[E0271]: type mismatch resolving `<T as Foo>::Assoc == i32`
--> $DIR/param-candidate-shadows-project.rs:27:19 --> $DIR/param-candidate-shadows-project.rs:27:19
| |
LL | require_bar::<T>(); LL | require_bar::<T>();
| ^ type mismatch resolving `<T as Foo>::Assoc == i32` | ^ types differ
| |
note: types differ
--> $DIR/param-candidate-shadows-project.rs:10:18
|
LL | type Assoc = i32;
| ^^^
note: required for `T` to implement `Bar` note: required for `T` to implement `Bar`
--> $DIR/param-candidate-shadows-project.rs:13:9 --> $DIR/param-candidate-shadows-project.rs:13:9
| |

View File

@ -24,7 +24,7 @@ fn needs_bar<T: Bar>() {}
fn foo<T: Foo<Assoc = i32> + Foo<Assoc = u32>>() { fn foo<T: Foo<Assoc = i32> + Foo<Assoc = u32>>() {
needs_bar::<T>(); needs_bar::<T>();
//~^ ERROR type annotations needed: cannot satisfy `<T as Foo>::Assoc == i32` //~^ ERROR type annotations needed: cannot normalize
} }
fn main() {} fn main() {}

View File

@ -1,8 +1,8 @@
error[E0284]: type annotations needed: cannot satisfy `<T as Foo>::Assoc == i32` error[E0284]: type annotations needed: cannot normalize `<T as Foo>::Assoc`
--> $DIR/two-projection-param-candidates-are-ambiguous.rs:26:17 --> $DIR/two-projection-param-candidates-are-ambiguous.rs:26:17
| |
LL | needs_bar::<T>(); LL | needs_bar::<T>();
| ^ cannot satisfy `<T as Foo>::Assoc == i32` | ^ cannot normalize `<T as Foo>::Assoc`
| |
note: required for `T` to implement `Bar` note: required for `T` to implement `Bar`
--> $DIR/two-projection-param-candidates-are-ambiguous.rs:21:9 --> $DIR/two-projection-param-candidates-are-ambiguous.rs:21:9

View File

@ -22,11 +22,11 @@ error[E0284]: type annotations needed: cannot satisfy `<T as Default>::Id normal
LL | self LL | self
| ^^^^ cannot satisfy `<T as Default>::Id normalizes-to T` | ^^^^ cannot satisfy `<T as Default>::Id normalizes-to T`
error[E0284]: type annotations needed: cannot satisfy `<u8 as Default>::Id == Option<NonZero<u8>>` error[E0284]: type annotations needed: cannot satisfy `<u8 as Default>::Id normalizes-to Option<NonZero<u8>>`
--> $DIR/specialization-transmute.rs:28:13 --> $DIR/specialization-transmute.rs:28:13
| |
LL | let s = transmute::<u8, Option<NonZero<u8>>>(0); LL | let s = transmute::<u8, Option<NonZero<u8>>>(0);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot satisfy `<u8 as Default>::Id == Option<NonZero<u8>>` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot satisfy `<u8 as Default>::Id normalizes-to Option<NonZero<u8>>`
| |
note: required by a bound in `transmute` note: required by a bound in `transmute`
--> $DIR/specialization-transmute.rs:21:25 --> $DIR/specialization-transmute.rs:21:25

View File

@ -18,5 +18,5 @@ fn test<T: Default<Id = U>, U>() {}
fn main() { fn main() {
test::<u32, ()>(); test::<u32, ()>();
//~^ ERROR cannot satisfy `<u32 as Default>::Id == ()` //~^ ERROR cannot satisfy `<u32 as Default>::Id normalizes-to ()`
} }

View File

@ -8,11 +8,11 @@ LL | #![feature(specialization)]
= help: consider using `min_specialization` instead, which is more stable and complete = help: consider using `min_specialization` instead, which is more stable and complete
= note: `#[warn(incomplete_features)]` on by default = note: `#[warn(incomplete_features)]` on by default
error[E0284]: type annotations needed: cannot satisfy `<u32 as Default>::Id == ()` error[E0284]: type annotations needed: cannot satisfy `<u32 as Default>::Id normalizes-to ()`
--> $DIR/specialization-unconstrained.rs:20:5 --> $DIR/specialization-unconstrained.rs:20:5
| |
LL | test::<u32, ()>(); LL | test::<u32, ()>();
| ^^^^^^^^^^^^^^^^^ cannot satisfy `<u32 as Default>::Id == ()` | ^^^^^^^^^^^^^^^^^ cannot satisfy `<u32 as Default>::Id normalizes-to ()`
| |
note: required by a bound in `test` note: required by a bound in `test`
--> $DIR/specialization-unconstrained.rs:17:20 --> $DIR/specialization-unconstrained.rs:17:20

View File

@ -20,7 +20,7 @@ trait Trait<T, In> {
impl<In, Out> Trait<Bar, In> for Out { impl<In, Out> Trait<Bar, In> for Out {
type Out = Out; type Out = Out;
fn convert(_i: In) -> Self::Out { fn convert(_i: In) -> Self::Out {
//[next]~^ ERROR: cannot satisfy `<Out as Trait<Bar, In>>::Out == ()` //[next]~^ ERROR: cannot satisfy `Bar == _`
//[current]~^^ ERROR: item does not constrain `Bar::{opaque#0}`, but has it in its signature //[current]~^^ ERROR: item does not constrain `Bar::{opaque#0}`, but has it in its signature
unreachable!(); unreachable!();
} }