Skip to content

[1.16 regression] failure to exhaustively narrow type var bounded by union (across files) #19159

Open
@hauntsaninja

Description

@hauntsaninja
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]

Activity

hauntsaninja

hauntsaninja commented on May 28, 2025

@hauntsaninja
CollaboratorAuthor

Bisects to #18972

delfick

delfick commented on May 28, 2025

@delfick

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

JukkaL commented on May 28, 2025

@JukkaL
Collaborator

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

JukkaL commented on May 28, 2025

@JukkaL
Collaborator

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

ilevkivskyi commented on May 28, 2025

@ilevkivskyi
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

JukkaL commented on May 28, 2025

@JukkaL
Collaborator

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

delfick

delfick commented on May 28, 2025

@delfick

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 :)

changed the title [-][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)[/+] on Jun 4, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugmypy got something wrong

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      No branches or pull requests

        Participants

        @delfick@JukkaL@ilevkivskyi@hauntsaninja

        Issue actions

          [1.16 regression] failure to exhaustively narrow type var bounded by union (across files) · Issue #19159 · python/mypy