Skip to content

Future compat reports show confusing "lint level defined here" when there is an allow #121009

Closed

Description

@RalfJung

To reproduce, build any kind of code that triggers a future breakage report in a crate that allows that warning. For instance:

#![allow(const_patterns_without_partial_eq)]

trait EnumSetType {
    type Repr;
}

enum Enum8 { }
impl EnumSetType for Enum8 {
    type Repr = u8;
}

#[derive(PartialEq, Eq)]
struct EnumSet<T: EnumSetType> {
    __enumset_underlying: T::Repr,
}

const CONST_SET: EnumSet<Enum8> = EnumSet { __enumset_underlying: 3 };

fn main() {
    match CONST_SET {
        CONST_SET => { /* ok */ } //~ERROR: must implement `PartialEq`
        _ => panic!("match fell through?"),
    }
}

Build this with cargo, then run cargo report future-incompatibilities --id 1:

The package `fut v0.1.0 (/home/r/src/rust/tmp/fut)` currently triggers the following future incompatibility lints:
> warning: to use a constant of type `EnumSet<Enum8>` in a pattern, the type must implement `PartialEq`
>   --> src/main.rs:21:9
>    |
> 21 |         CONST_SET => { /* ok */ } //~ERROR: must implement `PartialEq`
>    |         ^^^^^^^^^
>    |
>    = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
>    = note: for more information, see issue #116122 <https://github.com/rust-lang/rust/issues/116122>
> note: the lint level is defined here
>   --> src/main.rs:1:10
>    |
> 1  | #![allow(const_patterns_without_partial_eq)]
>    |          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> 

That is quite confusing obviously, since it points at an allow lint level to justify a warning!

It seems to me like these future compat reports shouldn't display that "lint level is defined here" at all, after all, their entire point is that they are not affected by the lint levels in the crate.

Cc @rust-lang/wg-diagnostics

Activity

  1. added
    needs-triageThis issue may need triage. Remove when done. See docs forge.rust-lang.org/release/issue-triaging
    on Feb 13, 2024
  2. Urgau commented on Feb 13, 2024

    @Urgau
    Member

    Should probably be conditioned here on future_incompatible.is_none():

    explain_lint_level_source(lint, level, src, &mut *err);

    @rustbot label -needs-triage +E-easy +A-diagnostics +D-confusing +T-compiler

  3. added
    A-diagnosticsArea: Messages for errors, warnings, and lints
    D-confusingDiagnostics: Confusing error or lint that should be reworked.
    E-easyCall for participation: Easy difficulty. Experience needed to fix: Not much. Good first issue.
    T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.
    and removed
    needs-triageThis issue may need triage. Remove when done. See docs forge.rust-lang.org/release/issue-triaging
    on Feb 13, 2024
  4. RalfJung commented on Feb 13, 2024

    @RalfJung
    MemberAuthor

    No, that doesn't sound right. This needs to be conditioned on whether the lint is being rendered for regular rustc output or for the future-breakage report.

  5. Urgau commented on Feb 13, 2024

    @Urgau
    Member

    Indeed, it should instead be conditional on has_future_breakage, which is used to set the has_future_breakage of IsLint, which is then used to add to diagnostic to the future_breakage_diagnostics list.

    (Or at least that's my understanding after looking at the Cargo code as well)

  6. RalfJung commented on Feb 13, 2024

    @RalfJung
    MemberAuthor

    has_future_breakage is also set when the same lint is printed as a regular lint, isn't it?

    I was assuming the lint is rendered twice, once as a regular lint and once for the report. Maybe that's not true. So maybe the actual change that should happen is to skip explain_lint_level_source when the lint level is allow? In that case usually the lint would be skipped entirely, but ofc for future breakage it is still put into the JSON -- not printed to stderr, but stored in cargo's future breakage report.

  7. Urgau commented on Feb 13, 2024

    @Urgau
    Member

    has_future_breakage is also set when the same lint is printed as a regular lint, isn't it?

    Yes. And I don't the lint is "render" twice, when it is being emitted the emiter will add the lint to it's list and transmit it to Cargo.

    So maybe the actual change that should happen is to skip explain_lint_level_source when the lint level is allow?

    This is also a possibility. Either would work.

  8. added 2 commits that reference this issue on Feb 13, 2024
    ca10a7e
    24b52fd
  9. added a commit that references this issue on Feb 14, 2024
    9e31121
  10. added a commit that references this issue on Feb 14, 2024
    e16d7c0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-diagnosticsArea: Messages for errors, warnings, and lintsD-confusingDiagnostics: Confusing error or lint that should be reworked.E-easyCall for participation: Easy difficulty. Experience needed to fix: Not much. Good first issue.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