From 98c038d3835e55870d037cba38639af04de8581d Mon Sep 17 00:00:00 2001 From: Ilya Priven Date: Mon, 17 Jul 2023 23:24:46 -0400 Subject: [PATCH] Treat empty yield as no-op for reachability --- mypy/checker.py | 3 +++ test-data/unit/check-unreachable-code.test | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/mypy/checker.py b/mypy/checker.py index f2873c7d58e4..ea37ed815480 100644 --- a/mypy/checker.py +++ b/mypy/checker.py @@ -132,6 +132,7 @@ Var, WhileStmt, WithStmt, + YieldExpr, is_final_node, ) from mypy.options import Options @@ -2739,6 +2740,8 @@ def is_noop_for_reachability(self, s: Statement) -> bool: elif isinstance(s, ExpressionStmt): if isinstance(s.expr, EllipsisExpr): return True + elif isinstance(s.expr, YieldExpr) and s.expr.expr is None: + return True elif isinstance(s.expr, CallExpr): with self.expr_checker.msg.filter_errors(): typ = get_proper_type( diff --git a/test-data/unit/check-unreachable-code.test b/test-data/unit/check-unreachable-code.test index 76ecd9f51e35..549fe3d56134 100644 --- a/test-data/unit/check-unreachable-code.test +++ b/test-data/unit/check-unreachable-code.test @@ -1446,3 +1446,21 @@ def f() -> None: Foo()['a'] = 'a' x = 0 # This should not be reported as unreachable [builtins fixtures/exception.pyi] + +[case testIntentionallyEmptyGenerator] +# flags: --warn-unreachable +from typing import Generator + +def f() -> Generator[None, None, None]: + return + yield + +[case testYieldNoneIgnored] +# flags: --warn-unreachable +from typing import Generator + +def f() -> Generator[None, None, None]: + return + yield + yield + x = 42 # E: Statement is unreachable