Skip to content

Wrong unreachable note in finally section #19269

Open
@tyralla

Description

@tyralla

@A5rocks found the following bug when discussing #19118:

def f4() -> None:
    while int():
        try:
            x = 1
            if int():
                x = ""
                break
            if int():
                while int():
                    if int():
                        x = None
                        break
        finally:
            if isinstance(x, str):
                print("hello :)")  # E: Statement is unreachable
            reveal_type(x) # N: Revealed type is "Union[builtins.int, builtins.str, None]

This bug does not need a loop and hence can be simplified to:

# Mypy 1.16.0
# --allow-redefinition-new --local-partial-types --warn-unreachable

def f() -> None:
    try:
        x = 1
        if int():
            x = ""
            return
        if int():
            x = None
            return
    finally:
        reveal_type(x)  # N: Revealed type is "Union[builtins.int, builtins.str, None]" \
                        # N: Revealed type is "builtins.int"
        if isinstance(x, str):  # E: Subclass of "int" and "str" cannot exist: would have incompatible method signatures
            reveal_type(x)  # E: Statement is unreachable \
                            # E: Revealed type is "builtins.str"
        reveal_type(x) # N: Revealed type is "Union[builtins.int, builtins.str, None]" \
                       # N: Revealed type is "builtins.int"

A first idea on how to fix this.

Metadata

Metadata

Assignees

Labels

bugmypy got something wrongtopic-reachabilityDetecting unreachable code

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions