Closed
Description
The compiler seems unable to determine that two types are equal.
I tried this code:
trait Factory {
type Product;
}
impl Factory for () {
type Product = ();
}
trait ProductConsumer<P> {
fn consume(self, product: P);
}
impl <P> ProductConsumer<P> for () {
fn consume(self, product: P) {}
}
fn make_product_consumer<F: Factory>(f: F) -> impl ProductConsumer<F::Product> {
()
}
fn main() {
let consumer = make_product_consumer(());
consumer.consume(());
}
I expected the program to compile and run without issue, because <() as Factory>::Product>
is ()
, so the consume
call should be fine.
Instead, I got this error message:
error[E0308]: mismatched types
--> src/main.rs:25:22
|
25 | consumer.consume(());
| ^^ expected associated type, found `()`
|
= note: expected associated type `<() as Factory>::Product`
found unit type `()`
The problem exists on stable 1.42 and nightly 1.44
Metadata
Metadata
Assignees
Labels
Area: Associated items (types, constants & functions)Area: `impl Trait`. Universally / existentially quantified anonymous types with static dispatch.Area: Lazy normalization (tracking issue: #60471)Category: This is a bug.Call for participation: An issue has been fixed and does not reproduce, but no test has been added.Relevant to the compiler team, which will review and decide on the PR/issue.
Activity
rodrimati1992 commentedon Apr 2, 2020
It somehow compiles if you replace the associated type with a type parameter:
https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=44455a7c12a77aa33c75b2c95658ebdb
jonas-schievink commentedon Apr 2, 2020
cc #60414 / #62221
jonas-schievink commentedon Apr 2, 2020
jonas-schievink commentedon Apr 2, 2020
jonas-schievink commentedon Apr 3, 2020
Duh, I forgot how opaque types work.
Not sure where
<opaque>: ProductConsumer<<() as Factory>::Product>
would be stored (ParamEnv
? It's empty at this point according to log), but it's definitely not in the type, so this output makes sense.benjaminp commentedon Oct 21, 2020
This is fixed on nightly.
Rollup merge of rust-lang#86796 - JohnTitor:test-70703, r=jonas-schie…