mypy icon indicating copy to clipboard operation
mypy copied to clipboard

Wrong `unreachable` note in `finally` section

Open tyralla opened this issue 7 months ago • 0 comments

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

tyralla avatar Jun 10 '25 15:06 tyralla