rust-lang / rust-lang/rust-clippy

lint on `OR | PATTERN if call()`

Open
#13,142 4 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

A-lint
Dominant language
Rust
Stars
13.5k
Forks
2.2k
Avg merge
2d 10h
Merged PRs (30d)
32

Description

What it does

Lint if an or-pattern may match twice, which causes possible repeat calls to the guard fn. Observe: https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=dcafa97df6e7e8b4f6e4b84709f0fb6f

Advantage

Prevents a possible mistake due to overlapping patterns + an if-guard.

Drawbacks

Uhhh... people might, very hypothetically, have meant to do this?

Example
pub fn act(something: Option<u32>) -> bool {
    match something {
        None | Some(0) | Some(0..) if some_fn() => unreachable!(),
        None | Some(0) => false,
        Some(1..) => true,
    }
}

Could be written as, if actually intentional:

pub fn act(something: Option<u32>) -> bool {
    match something {
        None if some_fn() => todo!()
        Some(0) if some_fn() => todo!(),
        Some(0..) if some_fn() => todo!(),
        None | Some(0) => false,
        Some(1..) => true,
    }
}

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by reproducing the Rust Playground example and compare its behavior with the proposed lint and the intentionally separated guards. The change is done when overlapping or-patterns with an if guard are diagnosed while the explicit separate-guard form remains valid; the issue does not name an implementation file or test.

Written by the indexing model from the issue text.

Assessment

Tech stack
rust
Domain
tooling
Issue type
Feature
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.