From 97c5eb4ba54b8aa6c3fd7608830805d5d124133a Mon Sep 17 00:00:00 2001 From: hauntsaninja Date: Sat, 30 Mar 2024 16:32:52 -0700 Subject: [PATCH 1/2] Check no-op for reachability statements --- mypy/checker.py | 4 ++++ test-data/unit/check-unreachable-code.test | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/mypy/checker.py b/mypy/checker.py index 5d243195d50f..3422ef360414 100644 --- a/mypy/checker.py +++ b/mypy/checker.py @@ -477,6 +477,8 @@ def check_first_pass(self) -> None: if not self.is_noop_for_reachability(d): self.msg.unreachable_statement(d) break + else: + self.accept(d) else: self.accept(d) @@ -2791,6 +2793,8 @@ def visit_block(self, b: Block) -> None: if not self.is_noop_for_reachability(s): self.msg.unreachable_statement(s) break + else: + self.accept(s) else: self.accept(s) diff --git a/test-data/unit/check-unreachable-code.test b/test-data/unit/check-unreachable-code.test index b8b438b979c6..0d1408bddd9e 100644 --- a/test-data/unit/check-unreachable-code.test +++ b/test-data/unit/check-unreachable-code.test @@ -1494,3 +1494,11 @@ from typing import Generator def f() -> Generator[None, None, None]: return None yield None + +[case testErrorInNoopForReachabilityStatement] +# flags: --warn-unreachable +def double(x: int) -> int: + if not isinstance(x, int): + raise BaseException["Expected an integer"] # E: The type "Type[BaseException]" is not generic and not indexable + return x +[builtins fixtures/tuple.pyi] From 5891d7c835639efd46f08982fa44d9a578000ad7 Mon Sep 17 00:00:00 2001 From: Shantanu Jain Date: Fri, 27 Dec 2024 15:31:34 -0800 Subject: [PATCH 2/2] callexpr --- mypy/checker.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/mypy/checker.py b/mypy/checker.py index f235786f5858..77616411735b 100644 --- a/mypy/checker.py +++ b/mypy/checker.py @@ -476,11 +476,14 @@ def check_first_pass(self) -> None: if self.binder.is_unreachable(): if not self.should_report_unreachable_issues(): break - if not self.is_noop_for_reachability(d): + if self.is_noop_for_reachability(d): + if not isinstance(d, ExpressionStmt) or not isinstance( + d.expr, CallExpr + ): + self.accept(d) + else: self.msg.unreachable_statement(d) break - else: - self.accept(d) else: self.accept(d) @@ -2950,11 +2953,12 @@ def visit_block(self, b: Block) -> None: if self.binder.is_unreachable(): if not self.should_report_unreachable_issues(): break - if not self.is_noop_for_reachability(s): + if self.is_noop_for_reachability(s): + if not isinstance(s, ExpressionStmt) or not isinstance(s.expr, CallExpr): + self.accept(s) + else: self.msg.unreachable_statement(s) break - else: - self.accept(s) else: self.accept(s)