Skip to content

Commit e9c7e10

Browse files
authored
Check module bodies to be reachable (#11361)
Closes #11331
1 parent 68047f9 commit e9c7e10

File tree

2 files changed

+33
-2
lines changed

2 files changed

+33
-2
lines changed

mypy/checker.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,11 @@ def check_first_pass(self) -> None:
307307
with self.tscope.module_scope(self.tree.fullname):
308308
with self.enter_partial_types(), self.binder.top_frame_context():
309309
for d in self.tree.defs:
310+
if (self.binder.is_unreachable()
311+
and self.should_report_unreachable_issues()
312+
and not self.is_raising_or_empty(d)):
313+
self.msg.unreachable_statement(d)
314+
break
310315
self.accept(d)
311316

312317
assert not self.current_node_deferred

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

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -754,35 +754,46 @@ if sys.version_info[0] >= 2:
754754
reveal_type('') # N: Revealed type is "Literal['']?"
755755
[builtins fixtures/ops.pyi]
756756

757-
[case testUnreachableFlagWithBadControlFlow]
757+
[case testUnreachableFlagWithBadControlFlow1]
758758
# flags: --warn-unreachable
759759
a: int
760760
if isinstance(a, int):
761761
reveal_type(a) # N: Revealed type is "builtins.int"
762762
else:
763763
reveal_type(a) # E: Statement is unreachable
764+
[builtins fixtures/isinstancelist.pyi]
764765

766+
[case testUnreachableFlagWithBadControlFlow2]
767+
# flags: --warn-unreachable
765768
b: int
766769
while isinstance(b, int):
767770
reveal_type(b) # N: Revealed type is "builtins.int"
768771
else:
769772
reveal_type(b) # E: Statement is unreachable
773+
[builtins fixtures/isinstancelist.pyi]
770774

775+
[case testUnreachableFlagWithBadControlFlow3]
776+
# flags: --warn-unreachable
771777
def foo(c: int) -> None:
772778
reveal_type(c) # N: Revealed type is "builtins.int"
773779
assert not isinstance(c, int)
774780
reveal_type(c) # E: Statement is unreachable
781+
[builtins fixtures/isinstancelist.pyi]
775782

783+
[case testUnreachableFlagWithBadControlFlow4]
784+
# flags: --warn-unreachable
776785
d: int
777786
if False:
778787
reveal_type(d) # E: Statement is unreachable
788+
[builtins fixtures/isinstancelist.pyi]
779789

790+
[case testUnreachableFlagWithBadControlFlow5]
791+
# flags: --warn-unreachable
780792
e: int
781793
if True:
782794
reveal_type(e) # N: Revealed type is "builtins.int"
783795
else:
784796
reveal_type(e) # E: Statement is unreachable
785-
786797
[builtins fixtures/isinstancelist.pyi]
787798

788799
[case testUnreachableFlagStatementAfterReturn]
@@ -1390,3 +1401,18 @@ def f() -> None:
13901401
if nope():
13911402
x = 1 # E: Statement is unreachable
13921403
[builtins fixtures/dict.pyi]
1404+
1405+
[case testUnreachableModuleBody1]
1406+
# flags: --warn-unreachable
1407+
from typing import NoReturn
1408+
def foo() -> NoReturn:
1409+
raise Exception("foo")
1410+
foo()
1411+
x = 1 # E: Statement is unreachable
1412+
[builtins fixtures/exception.pyi]
1413+
1414+
[case testUnreachableModuleBody2]
1415+
# flags: --warn-unreachable
1416+
raise Exception
1417+
x = 1 # E: Statement is unreachable
1418+
[builtins fixtures/exception.pyi]

0 commit comments

Comments
 (0)