Closed
Description
Consider this example:
from typing import Generic, TypeVar
T = TypeVar('T')
G = TypeVar('G', bound='Y')
class X(Generic[T]): pass
class Y: pass
# Consider this function:
def f(a: X[T] | G) -> X[T] | G:
if isinstance(a, X):
reveal_type(a) # X[T`-1]
return a
if isinstance(a, Y):
reveal_type(a) # G`-2
return a
print() # error: unreachable. It is ok, because all possibilities checked.
# The same function, but if's swapped
def g(a: X[T] | G) -> X[T] | G: # error: Missing return statement
if isinstance(a, Y):
reveal_type(a) # Y
return a # error: Incompatible return value type (got "Y", expected "Union[X[T], G]")
if isinstance(a, X):
reveal_type(a) # X[T`-1]
return a
print() # no "error: unreachable", because it is reachable and mypy complains about "missing return"
# I expect to get no errors here, because it isnt reachable
Expected Behavior
First function is fine. I expect to get no errors in second function. Also first reveal_type
in second function is IMO invalid, it should be G
.
Your Environment
- Mypy version used:
mypy 0.971 (compiled: yes)
- Mypy command-line flags: none
- Mypy configuration options from
mypy.ini
(and other config files):
disallow_any_unimported = True
disallow_any_generics = True
disallow_subclassing_any = True
disallow_untyped_defs = True
disallow_incomplete_defs = True
disallow_untyped_decorators = True
warn_unreachable = True
warn_redundant_casts = True
warn_unused_ignores = True
# warn_return_any = True
strict_equality = True
show_column_numbers = True
- Python version used: 3.10.6
- Operating system and version: Win10
PS: pls give better title to this issue, idk how to properly describe this issue.