Skip to content

[1.16 regression] failure to exhaustively narrow type var bounded by union #19159

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
hauntsaninja opened this issue May 28, 2025 · 7 comments
Labels
bug mypy got something wrong

Comments

@hauntsaninja
Copy link
Collaborator

Courtesy of @delfick

So if we have two files

# a.py
from typing import assert_never

import b


def switch[T_Choice: b.One | b.Two](choice: type[T_Choice]) -> None:
    match choice:
        case b.One:
            print(1)
        case b.Two:
            print(2)
        case _:
            assert_never(choice)


switch(b.One)

and

# b.py
class One: ...
class Two: ...

Then I get no errors with mypy 1.15 and this error with 1.16

a.py:13: error: Argument 1 to "assert_never" has incompatible type "type[Two] | Never"; expected "Never"  [arg-type]
@hauntsaninja
Copy link
Collaborator Author

Bisects to #18972

@delfick
Copy link

delfick commented May 28, 2025

I would say though that I think the above example should probably only work if the two classes are decorated with @typing.final and it does seem the same errors happen with that decorator being used (i.e. no error in 1.15, that new error in 1.16)

@JukkaL
Copy link
Collaborator

JukkaL commented May 28, 2025

I'm a little surprised that we apparently don't have a test for this. This looks like a significant regression, though it wasn't obvious likely because many projects we test against still support 3.9, which doesn't support the match statement.

cc @ilevkivskyi as the author of #18972

@JukkaL
Copy link
Collaborator

JukkaL commented May 28, 2025

I'm a little surprised that we apparently don't have a test for this.

I didn't realized that this only happens in a fairly specific scenario. Having everything in a single file doesn't reproduce the issue.

@ilevkivskyi
Copy link
Member

I may not have time to properly look into this until weekend, but FWIW this looks really niche to me. I would even say we may go ahead with the release and fix this later, unless this causes big troubles for some repos.

@JukkaL
Copy link
Collaborator

JukkaL commented May 28, 2025

Ok, I treat this as a non-blocker for the release.

@delfick
Copy link

delfick commented May 28, 2025

Ok, that's fine on my end, there's only a few assert_never that I would have to change to an Exception in my repo :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug mypy got something wrong
Projects
None yet
Development

No branches or pull requests

4 participants