Skip to content

Negative trait impl gives wrong error message #70849

Closed

Description

@DutchGhost

The following code:

#![feature(negative_impls)]

struct MyType;

impl !Clone for &mut MyType {}

fn main() {}

produces:

  Compiling playground v0.0.1 (/playground)
error[E0119]: conflicting implementations of trait `std::clone::Clone` for type `&mut MyType`:
 --> src/main.rs:5:1
  |
5 | impl !Clone for &mut MyType {}
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |
  = note: conflicting implementation in crate `core`:
          - impl<T> std::clone::Clone for &mut T
            where T: ?Sized;

error: aborting due to previous error

For more information about this error, try `rustc --explain E0119`.
error: could not compile `playground`.

To learn more, run the command again with --verbose.

which reads as: any &mut T where T: ?Sized implements Clone, which isn't realy true. It realy implements !Clone.

Perhaps the error message should add a ! in front of the impl to make it more obvious, like this:

= note: conflicting implementation in crate `core`:
          - impl<T> !std::clone::Clone for &mut T
            where T: ?Sized;

Activity

  1. added
    A-diagnosticsArea: Messages for errors, warnings, and lints
    D-incorrectDiagnostics: A diagnostic that is giving misleading or incorrect information.
    T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.
    on Apr 6, 2020
  2. added
    C-enhancementCategory: An issue proposing an enhancement or a PR with one.
    on Apr 12, 2020
  3. added
    E-easyCall for participation: Easy difficulty. Experience needed to fix: Not much. Good first issue.
    on Aug 30, 2024
  4. heiseish commented on Sep 11, 2024

    @heiseish
    Contributor

    Hi @fmease , I'd like to take up this issue if it has not been assigned yet. However this would be my first contribution so I just want to confirm it's a good first task. Thanks!

  5. fmease commented on Sep 12, 2024

    @fmease
    Member

    @heiseish Yeah, for sure! It should be as simple as updating to_pretty_impl_header (see) to account for the polarity. You can query/obtain the impl polarity with tcx.impl_polarity(impl_def_id). Feel free to reach out here or on Zulip if you have any questions.

  6. added a commit that references this issue on Sep 14, 2024
    517e7ce
  7. added a commit that references this issue on Sep 14, 2024
    4845d98
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

A-diagnosticsArea: Messages for errors, warnings, and lintsC-enhancementCategory: An issue proposing an enhancement or a PR with one.D-incorrectDiagnostics: A diagnostic that is giving misleading or incorrect information.E-easyCall for participation: Easy difficulty. Experience needed to fix: Not much. Good first issue.F-negative_impls#![feature(negative_impls)]T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions