Ever since I started using Rust, there's been this issue of bad error messages when a type doesn't implement a trait, but there are blanket impls for that trait which don't apply. This is documented in issue #22590. You can see my latest comment on the issue for an example, but I'll describe it here too:
Let's say there is a failing trait bound:
T: Foo. If there are no blanket impls of
Foo, the error message is
the trait bound `T: Foo` is not satisfied. This is OK. It's maybe not the best error message ever, but it's not horrible.
But if there exists a blanket impl of
T that has certain restrictions, let's say
T: Bar. Then the error message will be
the trait bound `T: Bar` is not satisfied, even the the real problem is that
T does not implement
Foo. This gets even more confusing if the blanket impl has a requirement like
T: 'static, or an implicit
@nikomatsakis you suggested a better way to report these errors - starting with the "top-level" thing that failed. In this case it would be
T: Foo, or perhaps the function call that the
T: Foo obligation came from. Do you have any ideas about how that could be implemented?
@nikomatsakis you may not have gotten a notification when I posted this