- Notifications
You must be signed in to change notification settings - Fork 14.1k
Closed
Labels
A-associated-itemsArea: Associated items (types, constants & functions)Area: Associated items (types, constants & functions)A-diagnosticsArea: Messages for errors, warnings, and lintsArea: Messages for errors, warnings, and lintsD-newcomer-roadblockDiagnostics: Confusing error or lint; hard to understand for new users.Diagnostics: Confusing error or lint; hard to understand for new users.D-terseDiagnostics: An error or lint that doesn't give enough information about the problem at hand.Diagnostics: An error or lint that doesn't give enough information about the problem at hand.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.Relevant to the compiler team, which will review and decide on the PR/issue.
Description
Given the following code (playground):
trait Foo { type Associated; } struct Generic<T> { field: T::Associated, }The current output is:
error[E0220]: associated type `Associated` not found for `T` --> src/lib.rs:6:15 | 6 | field: T::Associated, | ^^^^^^^^^^ associated type `Associated` not found Ideally the output should look like:
error[E0220]: associated type `Associated` not found for `T` --> src/lib.rs:6:15 | 6 | field: T::Associated, | ^^^^^^^^^^ associated type `Associated` not found | help: items from traits can only be used if the type parameter is bounded by the trait help: the following trait defines an item `Associated`, perhaps you need to restrict type parameter `T` with it: | 5 | struct Generic<T: Foo> { | +++++ It already does this for trait methods (playground):
pub trait Foo { fn do_it(&self); } fn use_it<T>(input: T) { input.do_it(); } fn main() { use_it(42); }error[E0599]: no method named `do_it` found for type parameter `T` in the current scope --> src/main.rs:6:11 | 6 | input.do_it(); | ^^^^^ method not found in `T` | = help: items from traits can only be used if the type parameter is bounded by the trait help: the following trait defines an item `do_it`, perhaps you need to restrict type parameter `T` with it: | 5 | fn use_it<T: Foo>(input: T) { | +++++ And it does it (sorta, the message is more terse) if you qualify with as Trait (playground):
trait Foo { type Associated; } struct Generic<T> { field: <T as Foo>::Associated, }error[E0277]: the trait bound `T: Foo` is not satisfied --> src/lib.rs:6:12 | 6 | field: <T as Foo>::Associated, | ^^^^^^^^^^^^^^^^^^^^^^ the trait `Foo` is not implemented for `T` | help: consider restricting type parameter `T` | 5 | struct Generic<T: Foo> { | +++++ @rustbot label +D-newcomer-roadblock +D-terse +A-associated-items
Metadata
Metadata
Assignees
Labels
A-associated-itemsArea: Associated items (types, constants & functions)Area: Associated items (types, constants & functions)A-diagnosticsArea: Messages for errors, warnings, and lintsArea: Messages for errors, warnings, and lintsD-newcomer-roadblockDiagnostics: Confusing error or lint; hard to understand for new users.Diagnostics: Confusing error or lint; hard to understand for new users.D-terseDiagnostics: An error or lint that doesn't give enough information about the problem at hand.Diagnostics: An error or lint that doesn't give enough information about the problem at hand.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.Relevant to the compiler team, which will review and decide on the PR/issue.