Change:
Using a generic function to "converge" two into when T is an associated type for another trait causes the following error: Example code (): This may or may not be related to the compiler seemingly failing to assert that , an error that can be triggered by using the alternate signature for at line 40 of the example. I tested this with the linked playground on the latest stable (1.32.0), as well as a recent nightly: Compiling with doesn't seem to yield a very useful stack but here it is:
Another example by that causes only the second "call dest mismatch" ICE:
P-medium. Removing nomination label. (But maybe we should have a WG-impl-trait to provide a structured effort for working through the bugs with impl trait?)
This has been fixed in 1.38.0 as, while I can reproduce the ICE in 1.37.0, I am not observing it in neither of: stable (1.38.0), beta nor nightly. modify labels: E-needstest

Discussion:
<ins> trait Foo { fn foo([a, b]: [i32; 2]) {} //~^ ERROR: patterns aren't allowed in methods without bodies } fn main() {} </ins>

<ins> error[E0642]: patterns aren't allowed in methods without bodies --> $DIR/issue-50571.rs:2:12 | LL |     fn foo([a, b]: [i32; 2]) {} |            ^^^^^^ help: give this argument a name or use an underscore to ignore it | LL |     fn foo(_: [i32; 2]) {} |            ^ error: aborting due to previous error For more information about this error, try `rustc --explain E0642`. </ins>

<ins> pub trait Foo: Sized { const SIZE: usize; fn new(slice: &[u8; Foo::SIZE]) -> Self; //~^ ERROR: type annotations needed: cannot resolve `_: Foo` } pub struct Bar<T: ?Sized>(T); impl Bar<[u8]> { const SIZE: usize = 32; fn new(slice: &[u8; Self::SIZE]) -> Self { Foo(Box::new(*slice)) //~ ERROR: expected function, found trait `Foo` } } fn main() {} </ins>

<ins> error[E0423]: expected function, found trait `Foo` --> $DIR/issue-58022.rs:14:9 | LL |         Foo(Box::new(*slice)) |         ^^^ not a function error[E0283]: type annotations needed: cannot resolve `_: Foo` --> $DIR/issue-58022.rs:4:25 | LL |     const SIZE: usize; |     ------------------ required by `Foo::SIZE` LL | LL |     fn new(slice: &[u8; Foo::SIZE]) -> Self; |                         ^^^^^^^^^ error: aborting due to 2 previous errors Some errors have detailed explanations: E0283, E0423. For more information about an error, try `rustc --explain E0283`. </ins>

<ins> use std::ops::Add; trait Trait<T> { fn get(self) -> T; } struct Holder<T>(T); impl<T> Trait<T> for Holder<T> { fn get(self) -> T { self.0 } } enum Either<L, R> { Left(L), Right(R), } impl<L, R> Either<L, R> { fn converge<T>(self) -> T where L: Trait<T>, R: Trait<T> { match self { Either::Left(val) => val.get(), Either::Right(val) => val.get(), } } } fn add_generic<A: Add<B>, B>(lhs: A, rhs: B) -> Either< impl Trait<<A as Add<B>>::Output>, impl Trait<<A as Add<B>>::Output> > { if true { Either::Left(Holder(lhs + rhs)) } else { Either::Right(Holder(lhs + rhs)) } } fn add_one( value: u32, ) -> Either<impl Trait<<u32 as Add<u32>>::Output>, impl Trait<<u32 as Add<u32>>::Output>> { //~^ ERROR: the trait bound `impl Trait<<u32 as std::ops::Add>::Output>: Trait<u32>` //~| ERROR: the trait bound `impl Trait<<u32 as std::ops::Add>::Output>: Trait<u32>` add_generic(value, 1u32) } pub fn main() { add_one(3).converge(); } </ins>

<ins> error[E0277]: the trait bound `impl Trait<<u32 as std::ops::Add>::Output>: Trait<u32>` is not satisfied --> $DIR/issue-58344.rs:42:13 | LL | ) -> Either<impl Trait<<u32 as Add<u32>>::Output>, impl Trait<<u32 as Add<u32>>::Output>> { |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Trait<u32>` is not implemented for `impl Trait<<u32 as std::ops::Add>::Output>` | = note: the return type of a function must have a statically known size error[E0277]: the trait bound `impl Trait<<u32 as std::ops::Add>::Output>: Trait<u32>` is not satisfied --> $DIR/issue-58344.rs:42:52 | LL | ) -> Either<impl Trait<<u32 as Add<u32>>::Output>, impl Trait<<u32 as Add<u32>>::Output>> { |                                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Trait<u32>` is not implemented for `impl Trait<<u32 as std::ops::Add>::Output>` | = note: the return type of a function must have a statically known size error: aborting due to 2 previous errors For more information about this error, try `rustc --explain E0277`. </ins>