Skip to content

unused_assignments lint has trouble tracking that one match guard observes assignment from another match guard. #138069

Open
@pnkfelix

Description

@pnkfelix

I tried this code (playground):

fn pnk(x: usize) -> &'static str {
    let mut k1 = "k1";
    let mut h1 = "h1";
    match x & 3 {
        3 if { k1 = "unused?"; false } => (),
        _ if { h1 = k1; true } => (),
        _ => (),
    }
    h1
}

fn main() {
    dbg!(pnk(3));
}

I expected to see this happen: No lint complaints about the assignment to k1 in the first match guard being "unused", since the assignment is subsequently observed by the second match guard.

Instead, this happened: The unused_assignments lint has a false positive on the code above:

warning: value assigned to `k1` is never read
 --> src/main.rs:5:16
  |
5 |         3 if { k1 = "unused?"; false } => (),
  |                ^^
  |
  = help: maybe it is overwritten before being read?
  = note: `#[warn(unused_assignments)]` on by default

warning: `playground` (bin "playground") generated 1 warning
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.89s
     Running `target/debug/playground`
[src/main.rs:13:5] pnk(3) = "unused?"

Meta

I'm testing on the playground, Rust stable 1.85.0

Activity

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-lintsArea: Lints (warnings about flaws in source code) such as unused_mut.A-patternsRelating to patterns and pattern matchingC-bugCategory: This is a bug.L-false-positiveLint: False positive (should not have fired).L-unused_assignmentsLint: unused_assignmentsT-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