Skip to content

mypy reports false-positive [exhaustive-match] error when there is an unreachable match #21517

@dima179-fuse

Description

@dima179-fuse

Bug Report

exhaustive-match incorrectly reports a missing A case when using a capture pattern (case A() as a) together with an unreachable extra branch.

The following code reports:

error: Match statement has unhandled case for values of type "A"  [exhaustive-match]

even though all possible values of A | None are handled.

Interestingly, the error disappears if the unreachable case B(): branch is removed.

This seems related to exhaustiveness analysis for class patterns with as captures.

To Reproduce

# mypy: enable-error-code=exhaustive-match

class A: pass
class B: pass

x: A | None

match x:
    case None:
        pass
    case A() as a:
        pass
    case B():
        pass

Expected Behavior

No errors should be reported.

x has type A | None, and both None and A are handled exhaustively.

The case B(): branch is unreachable and should not affect exhaustiveness checking.

Removing the case B(): branch currently makes mypy report no errors:

match x:
    case None:
        pass
    case A() as a:
        pass

Actual Behavior

main.py:8: error: Match statement has unhandled case for values of type "A"  [exhaustive-match]
main.py:8: note: If match statement is intended to be non-exhaustive, add `case _: pass`
Found 1 error in 1 file (checked 1 source file)

Your Environment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions