Skip to content

Suggest adding { .. } on accidental usage of unit variant pattern for a struct variant #126243

Closed

Description

@carols10cents

Code

pub enum Error {
    NotFound,
    
    PreconditionFailed {
        description: String,
    }
}

pub fn demonstration(error: Error) {
    match error {
        Error::NotFound => println!("gone fishin"),
        Error::PreconditionFailed => println!("you're missing something"),
        _ => println!("i literally have no idea"),
    }
}

Current output

error[E0533]: expected unit struct, unit variant or constant, found struct variant `Error::PreconditionFailed`
  --> src/lib.rs:12:9
   |
12 |         Error::PreconditionFailed => println!("you're missing something"),
   |         ^^^^^^^^^^^^^^^^^^^^^^^^^ not a unit struct, unit variant or constant

Desired output

error[E0533]: expected unit struct, unit variant or constant, found struct variant `Error::PreconditionFailed`
  --> src/lib.rs:12:9
   |
12 |         Error::PreconditionFailed => println!("you're missing something"),
   |         ^^^^^^^^^^^^^^^^^^^^^^^^^ not a unit struct, unit variant or constant
help: if you don't care about the variant's fields, ignore them with `{ .. }`
   |
12 |         Error::PreconditionFailed { .. } => println!("you're missing something"),
   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Rationale and extra context

playground

I wrote code that looked like this while not having my brain turned on 100%. Due to said brain not functioning, it took me a while to understand what rustc was trying to tell me with the message pointing to the Error::PreconditionFailed pattern with the text not a unit struct, unit variant or constant. Error::PreconditionFailed sure looked like a unit variant to me!

What rustc was trying to tell me was that the definition of the Error::PreconditionFailed variant was a struct variant ("found struct variant") and my pattern wasn't matching the definition ("this pattern you specified looks like it's trying to match a variant that is not a unit struct, unit variant or constant").

The change I needed to make was adding { .. } to my pattern, because I was trying to distinguish different variants from each other, not use pieces within the variants. Suggesting { .. } seems like a decent starting point to me, but there could definitely be cases I'm not considering here and I'm totally open to hearing that ❤️

Other cases

No response

Rust Version

$ rustc --version --verbose
rustc 1.78.0 (9b00956e5 2024-04-29)
binary: rustc
commit-hash: 9b00956e56009bab2aa15d7bff10916599e3d6d6
commit-date: 2024-04-29
host: aarch64-apple-darwin
release: 1.78.0
LLVM version: 18.1.2

Anything else?

No response

Activity

  1. added
    A-diagnosticsArea: Messages for errors, warnings, and lints
    T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.
    on Jun 10, 2024
  2. carols10cents commented on Jun 10, 2024

    @carols10cents
    MemberAuthor

    WEIRD this PR looks like it implements what I wish rustc did: #64660

    but the test files in that PR say they're for error[E0532] and I'm getting error[E0533]

  3. carols10cents commented on Jun 10, 2024

    @carols10cents
    MemberAuthor

    Aha ok this test shows that for tuple variants, rustc will suggest adding (_):

    | ^^^^^^^^^^^^^ help: use the tuple variant pattern syntax instead: `MyEnum::Tuple(_)`

    and that test also shows that rustc isn't suggesting anything for struct variants!

  4. carols10cents commented on Jun 10, 2024

    @carols10cents
    MemberAuthor

    Aha and it looks like adding struct fields was more complex so that's why it wasn't done? #63983 (comment)

  5. added
    C-enhancementCategory: An issue proposing an enhancement or a PR with one.
    A-suggestion-diagnosticsArea: Suggestions generated by the compiler applied by `cargo fix`
    on Jun 11, 2024
  6. tunawasabi commented on Aug 24, 2024

    @tunawasabi
    Contributor

    @rustbot claim

  7. added a commit that references this issue on Sep 11, 2024
    47b5185
  8. added a commit that references this issue on Sep 11, 2024
    1d6edee
  9. added a commit that references this issue on Sep 11, 2024
    1eba13e
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 lintsA-suggestion-diagnosticsArea: Suggestions generated by the compiler applied by `cargo fix`C-enhancementCategory: An issue proposing an enhancement or a PR with one.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