You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Type inference seems to pick up the wrong trait bound #77625
Hi. I apologize if this is a dup (I tried to search, but is it not easy to distill this into words to search for). If it's not a dup please update the title to something more meaningful.
error[E0308]: mismatched types
--> src/lib.rs:15:5
|
11 | fn foo<T>() -> u16
| - --- expected `u16` because of return type
| |
| this type parameter
...
15 | gen()
| ^^^^^ expected `u16`, found type parameter `T`
|
= note: expected type `u16`
found type parameter `T`
It it should be able to determine that the hole in gen::<_>() is u16 because that's the return type of foo(). Instead the compiler thinks the hole must be T, which is not true (in fact, if you change the call to gen() to gen::<u16>() the code compiles).
This happens in stable (1.46.0) as well as nightly 1.49.0-nightly (2020-10-05 a1dfd24).
Meaning: In foo, at the call to gen(), the compiler has to prove the (): Distribution<K> predicate in the where-clause on gen, which means proving (): Distribution<$0> where $0 is an inference variable. It eagerly selects the (): Distribution<T> predicate from the where-clause of foo to do that and thus unifies $0 with T.
Activity
jonas-schievink commentedon Oct 6, 2020
Presumably this is just fallout from the fact that predicates in
where-clauses having higher precedence than implsjonas-schievink commentedon Oct 6, 2020
Meaning: In
foo, at the call togen(), the compiler has to prove the(): Distribution<K>predicate in thewhere-clause ongen, which means proving(): Distribution<$0>where$0is an inference variable. It eagerly selects the(): Distribution<T>predicate from thewhere-clause offooto do that and thus unifies$0withT.lcnr commentedon Aug 1, 2025
Closing as duplicate of #24066
ParamEnv) take precedence over freestanding trait impls #24066