Skip to content

Suggest Trait<Ty: Trait2> syntax when user typed Trait<Ty = Trait2> #105056

Closed

Description

Consider the following code:

trait Foo {}

fn bar(_: impl Iterator<Item = Foo>) {}

// Or another similar case:

trait Bar {
    type X: Iterator<Item = Foo>;
}

The current output is:

error[E0782]: trait objects must include the `dyn` keyword
 --> src/lib.rs:3:32
  |
3 | fn bar(_: impl Iterator<Item = Foo>) {}
  |                                ^^^
  |
help: add `dyn` keyword before this trait
  |
3 | fn bar(_: impl Iterator<Item = dyn Foo>) {}
  |                                +++

This is reasonable especially in light of the ongoing migration from the old dyn-less trait object syntax. However, an alternative interpretation of the syntax error is that the user accidentally used a type equality bound = when they actually meant a trait bound :. The error message could include a suggestion to replace = with :.

help: or if you meant to write a trait bound, replace `=` with `:`
  |
3 | fn bar(_: impl Iterator<Item = Foo>) {}
  |                             --
3 | fn bar(_: impl Iterator<Item: Foo>) {}
  |                             +

See also related #99304 which proposes that impl Foo should be suggested rather than dyn Foo.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Assignees

Labels

A-diagnosticsArea: Messages for errors, warnings, and lintsA-suggestion-diagnosticsArea: Suggestions generated by the compiler applied by `cargo fix`F-associated_type_bounds`#![feature(associated_type_bounds)]`T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.requires-nightlyThis issue requires a nightly compiler in some way.

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions