Skip to content

[1.20 regression] value pattern match statement narrowing broken for typevars with values #21356

@m-richards

Description

@m-richards

Bug Report
I think I've found a regression in 1.20 - was recently trying to migrate a larger codebase from 1.18 and noticed this issue in a few places which didn't make sense. I've isolated it down to a small example which is a bit silly, but hopefully clear. I think this is a consequence of a deliberate change in #20908. Happy to try and put together a PR to resolve if useful, but I'm not exactly across the mypy internals, so might need a bit of guidance.

To Reproduce
https://mypy-play.net/?mypy=1.20.2&python=3.12&gist=ae5055b7e174f0ffd34db390a192aef5

import builtins
from typing import TypeVar

T = TypeVar("T", int, str)

def f(x: T) -> T:
    match type(x):
        case builtins.int:
            return 42        # mypy 1.20: error: Incompatible return value type (got "int", expected "str")
        case builtins.str:
            return "hello"   # mypy 1.20: error: Incompatible return value type (got "str", expected "int")
        case _:
            raise TypeError

Expected Behavior
Expected there to be no issues
Actual Behavior

uv run --with mypy==1.20.2 mypy mre.py 
mre.py:24: error: Incompatible return value type (got "int", expected "str")  [return-value]
mre.py:26: error: Incompatible return value type (got "str", expected "int")  [return-value]

edit: I did a bit more testing, there's nothing special about builtins here, but it needs to be a value pattern and not a class pattern for this example to even work in 1.19

Your Environment

  • Mypy version used: 1.20.2 fails, 1.19 works, a quick bisect suggests afb99eb is where this changes
  • Mypy command-line flags: None in minimal example
  • Mypy configuration options from mypy.ini (and other config files): None in minimal example
  • Python version used: 3.13 / 3.12 in playground link above

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions