rust-lang / rust

Empowering everyone to build reliable and efficient software.
https://www.rust-lang.org
Other
97.23k stars 12.57k forks source link

Better type inference with `impl_trait_in_assoc_type` (ITIAT) #130910

Open cynecx opened 3 days ago

cynecx commented 3 days ago
#![feature(impl_trait_in_assoc_type)]

fn coca(_: String) {}

trait Foo<T> {}
impl Foo<()> for String {}

trait Bar {
    type T;
    type I: Foo<Self::T>;
    type F: FnOnce(Self::I);

    const M: Self::F;
}

impl Bar for () {
    type T = impl Sized; // The compiler could infer this associated type as `()`.
    type I = impl Foo<Self::T>;
    type F = impl FnOnce(Self::I);

    const M: Self::F = coca;
}

playground

Errors with:

error[E0277]: the trait bound `String: Foo<<() as Bar>::T>` is not satisfied
  --> src/lib.rs:21:24
   |
21 |     const M: Self::F = coca;
   |                        ^^^^ the trait `Foo<<() as Bar>::T>` is not implemented for `String`
   |
   = help: the trait `Foo<()>` is implemented for `String`
compiler-errors commented 3 days ago

Using the "single impl rule" to do TAIT inference seems like a bad strategy to commit inference to, I fear.