Skip to content

Redundant note in some bound errors caused by imperfect derives #157118

@estebank

Description

@estebank

Code

#[derive(Debug)]
struct S<T>(T);

struct X;
fn main() {
    println!("{:?}", S(X));
}

Current output

error[E0277]: `X` doesn't implement `Debug`
 --> src/main.rs:6:22
  |
6 |     println!("{:?}", S(X));
  |               ----   ^^^^ `X` cannot be formatted using `{:?}` because it doesn't implement `Debug`
  |               |
  |               required by this formatting parameter
  |
  = help: the trait `Debug` is not implemented for `X`
  = note: add `#[derive(Debug)]` to `X` or manually `impl Debug for X`
help: the trait `Debug` is implemented for `S<T>`
 --> src/main.rs:1:10
  |
1 | #[derive(Debug)]
  |          ^^^^^
note: required for `S<X>` to implement `Debug`
 --> src/main.rs:2:8
  |
1 | #[derive(Debug)]
  |          ----- in this derive macro expansion
2 | struct S<T>(T);
  |        ^ - type parameter would need to implement `Debug`
  = help: consider manually implementing `Debug` to avoid undesired bounds
help: consider annotating `X` with `#[derive(Debug)]`
  |
4 + #[derive(Debug)]
5 | struct X;
  |

Desired output

error[E0277]: `X` doesn't implement `Debug`
 --> src/main.rs:6:22
  |
6 |     println!("{:?}", S(X));
  |               ----   ^^^^ `X` cannot be formatted using `{:?}` because it doesn't implement `Debug`
  |               |
  |               required by this formatting parameter
  |
  = help: the trait `Debug` is not implemented for `X`
help: the trait `Debug` is implemented for `S<T>`
 --> src/main.rs:1:10
  |
1 | #[derive(Debug)]
  |          ^^^^^
note: required for `S<X>` to implement `Debug`
 --> src/main.rs:2:8
  |
1 | #[derive(Debug)]
  |          ----- in this derive macro expansion
2 | struct S<T>(T);
  |        ^ - type parameter would need to implement `Debug`
  = help: consider manually implementing `Debug` to avoid undesired bounds
help: consider annotating `X` with `#[derive(Debug)]`
  |
4 + #[derive(Debug)]
5 | struct X;
  |

Rationale and extra context

The contents of the first note are redundant with the last two helps.

Other cases

Rust Version

1.95 through 1.98-nightly

Anything else?

Noticed while looking at #157117.

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-diagnosticsArea: Messages for errors, warnings, and lintsA-trait-systemArea: Trait systemD-verboseDiagnostics: Too much output caused by a single piece of incorrect code.P-lowLow priorityT-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions