Skip to content

Incorrect type of enum in "if" clause #20234

Description

@dimastbk

Bug Report

mypy incorrectly calculates the type of emun if its value is checked with tuple().__contains__ in "if" clause.

To Reproduce

https://gist.github.com/mypy-play/e316d3d5b495cb113cacc9c55136dea7

Expected Behavior

main.py:10: note: Revealed type is "Literal[__main__.Op.A]"
main.py:13: note: Revealed type is "Literal[__main__.Op.B]"

Actual Behavior

main.py:10: note: Revealed type is "__main__.Op"
main.py:13: note: Revealed type is "Literal[__main__.Op.B]"
main.py:16: error: Argument 1 to "assert_never" has incompatible type "Literal[Op.A]"; expected "Never"  [arg-type]

Pyright works fine with it - https://pyright-play.net/?code=JYWwDg9gTgLgBAUwHYFcQChSVnGBPMYJAc3XQGMAbAQwGda4B5MACmTQDoBRVEASgBc6OCLgBBOAF44AImozhogEJTZAIwXoAJggBmcKCiQsIYAUzCDFI4PtNwicFsw5iANFdFfcBIsQ5QCABuCNSUAPr4YAgmltbegTAoUEjxCJS2cPaS0i5KQt6iUX4BwaERUTGmfPFeicmpXum0CAWFPoQkHHQtsOFIZVCxNUA.

Your Environment

  • Mypy version used: 1.18.2
  • Mypy command-line flags:
  • Mypy configuration options from mypy.ini (and other config files):
  • Python version used: 3.12

Activity

  1. sherlock2215 commented on Nov 14, 2025

    @sherlock2215

    Heyy, @dimastbk can I be assigned to this issue?
    I'm ready to set up the development environment and start investigating the type narrowing logic.

  2. A5rocks commented on Nov 15, 2025

    @A5rocks
    Collaborator

    Feel free to try, no assignment necessary.

  3. added a commit that references this issue on Jan 22, 2026
    b91f53c
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugmypy got something wrongtopic-type-narrowingConditional type narrowing / binder

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions