diff --git a/mypy/checker.py b/mypy/checker.py index 9c389a3d08d8..51ba2e9610fe 100644 --- a/mypy/checker.py +++ b/mypy/checker.py @@ -307,6 +307,11 @@ def check_first_pass(self) -> None: with self.tscope.module_scope(self.tree.fullname): with self.enter_partial_types(), self.binder.top_frame_context(): for d in self.tree.defs: + if (self.binder.is_unreachable() + and self.should_report_unreachable_issues() + and not self.is_raising_or_empty(d)): + self.msg.unreachable_statement(d) + break self.accept(d) assert not self.current_node_deferred diff --git a/test-data/unit/check-unreachable-code.test b/test-data/unit/check-unreachable-code.test index 3525cbf8c612..2a55db1a33c6 100644 --- a/test-data/unit/check-unreachable-code.test +++ b/test-data/unit/check-unreachable-code.test @@ -754,35 +754,46 @@ if sys.version_info[0] >= 2: reveal_type('') # N: Revealed type is "Literal['']?" [builtins fixtures/ops.pyi] -[case testUnreachableFlagWithBadControlFlow] +[case testUnreachableFlagWithBadControlFlow1] # flags: --warn-unreachable a: int if isinstance(a, int): reveal_type(a) # N: Revealed type is "builtins.int" else: reveal_type(a) # E: Statement is unreachable +[builtins fixtures/isinstancelist.pyi] +[case testUnreachableFlagWithBadControlFlow2] +# flags: --warn-unreachable b: int while isinstance(b, int): reveal_type(b) # N: Revealed type is "builtins.int" else: reveal_type(b) # E: Statement is unreachable +[builtins fixtures/isinstancelist.pyi] +[case testUnreachableFlagWithBadControlFlow3] +# flags: --warn-unreachable def foo(c: int) -> None: reveal_type(c) # N: Revealed type is "builtins.int" assert not isinstance(c, int) reveal_type(c) # E: Statement is unreachable +[builtins fixtures/isinstancelist.pyi] +[case testUnreachableFlagWithBadControlFlow4] +# flags: --warn-unreachable d: int if False: reveal_type(d) # E: Statement is unreachable +[builtins fixtures/isinstancelist.pyi] +[case testUnreachableFlagWithBadControlFlow5] +# flags: --warn-unreachable e: int if True: reveal_type(e) # N: Revealed type is "builtins.int" else: reveal_type(e) # E: Statement is unreachable - [builtins fixtures/isinstancelist.pyi] [case testUnreachableFlagStatementAfterReturn] @@ -1390,3 +1401,18 @@ def f() -> None: if nope(): x = 1 # E: Statement is unreachable [builtins fixtures/dict.pyi] + +[case testUnreachableModuleBody1] +# flags: --warn-unreachable +from typing import NoReturn +def foo() -> NoReturn: + raise Exception("foo") +foo() +x = 1 # E: Statement is unreachable +[builtins fixtures/exception.pyi] + +[case testUnreachableModuleBody2] +# flags: --warn-unreachable +raise Exception +x = 1 # E: Statement is unreachable +[builtins fixtures/exception.pyi]