Skip to content

Commit 59b49af

Browse files
committed
Support Generator subtypes, too
1 parent 22ce0d6 commit 59b49af

File tree

2 files changed

+31
-4
lines changed

2 files changed

+31
-4
lines changed

mypy/checker.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5109,9 +5109,8 @@ def visit_for_stmt(self, s: ForStmt) -> None:
51095109
s.inferred_iterator_type = iterator_type
51105110

51115111
proper_iter_type = get_proper_type(iterator_type)
5112-
if isinstance(proper_iter_type, Instance) and proper_iter_type.type.fullname in (
5113-
"typing.Generator",
5114-
"types.GeneratorType",
5112+
if isinstance(proper_iter_type, Instance) and any(
5113+
base.fullname == "typing.Generator" for base in proper_iter_type.type.mro
51155114
):
51165115
supertype = self.named_type("typing.Generator").type
51175116
super_instance = map_instance_to_supertype(proper_iter_type, supertype)

test-data/unit/check-unreachable-code.test

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1590,7 +1590,7 @@ x = 0 # not unreachable
15901590

15911591
[case testUnendingForLoop]
15921592
# flags: --warn-unreachable
1593-
from typing import Generator, NoReturn
1593+
from typing import Generator, NoReturn, TypeVar
15941594

15951595
def generator() -> Generator[int, None, NoReturn]:
15961596
while True:
@@ -1607,3 +1607,31 @@ def bar() -> int: # E: Missing return statement
16071607
break
16081608

16091609
y = 0
1610+
1611+
def baz() -> int:
1612+
for x in generator():
1613+
pass
1614+
1615+
A = TypeVar("A")
1616+
B = TypeVar("B")
1617+
C = TypeVar("C")
1618+
1619+
class GeneratorSubtype(Generator[A, B, C]):
1620+
...
1621+
1622+
def foo2(gen: GeneratorSubtype[int, None, NoReturn]) -> int:
1623+
for x in gen:
1624+
return x
1625+
1626+
y = 0 # E: Statement is unreachable
1627+
1628+
def bar2(gen: GeneratorSubtype[int, None, NoReturn]) -> int: # E: Missing return statement
1629+
for x in gen:
1630+
break
1631+
1632+
y = 0
1633+
1634+
def baz2(gen: GeneratorSubtype[int, None, NoReturn]) -> int:
1635+
for x in gen:
1636+
pass
1637+
[builtins fixtures/tuple.pyi]

0 commit comments

Comments
 (0)