Open
Description
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]
Metadata
Metadata
Assignees
Labels
Projects
Milestone
Relationships
Development
No branches or pull requests
Activity
hauntsaninja commentedon May 28, 2025
Bisects to #18972
delfick commentedon 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 commentedon 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 commentedon May 28, 2025
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 commentedon May 28, 2025
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 commentedon May 28, 2025
Ok, I treat this as a non-blocker for the release.
delfick commentedon 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 :)[-][1.16 regression] failure to exhaustively narrow type var bounded by union[/-][+][1.16 regression] failure to exhaustively narrow type var bounded by union (across files)[/+]Only erase instances when checking runtime cover
Avoid erasing type objects when checking runtime cover (#19320)