diff --git a/mypy/partially_defined.py b/mypy/partially_defined.py index 7d87315c23ad3..5854036c0df3f 100644 --- a/mypy/partially_defined.py +++ b/mypy/partially_defined.py @@ -203,9 +203,13 @@ def visit_if_stmt(self, o: IfStmt) -> None: e.accept(self) self.tracker.start_branch_statement() for b in o.body: + if b.is_unreachable: + continue b.accept(self) self.tracker.next_branch() if o.else_body: + if o.else_body.is_unreachable: + self.tracker.skip_branch() o.else_body.accept(self) self.tracker.end_branch_statement() @@ -218,7 +222,10 @@ def visit_match_stmt(self, o: MatchStmt) -> None: guard = o.guards[i] if guard is not None: guard.accept(self) - o.bodies[i].accept(self) + if not o.bodies[i].is_unreachable: + o.bodies[i].accept(self) + else: + self.tracker.skip_branch() is_catchall = infer_pattern_value(pattern) == ALWAYS_TRUE if not is_catchall: self.tracker.next_branch() diff --git a/test-data/unit/check-partially-defined.test b/test-data/unit/check-partially-defined.test index d456568c1131d..f6934fb142d18 100644 --- a/test-data/unit/check-partially-defined.test +++ b/test-data/unit/check-partially-defined.test @@ -367,3 +367,22 @@ def f() -> None: d = a d = b [builtins fixtures/tuple.pyi] + +[case testUnreachable] +# flags: --enable-error-code partially-defined +import typing + +if typing.TYPE_CHECKING: + x = 1 +elif int(): + y = 1 +else: + y = 2 +a = x + +if not typing.TYPE_CHECKING: + pass +else: + z = 1 +a = z +[typing fixtures/typing-medium.pyi] diff --git a/test-data/unit/check-python310.test b/test-data/unit/check-python310.test index 3b90a910e943a..1967e7f4810b1 100644 --- a/test-data/unit/check-python310.test +++ b/test-data/unit/check-python310.test @@ -1789,6 +1789,30 @@ def f6(a: object) -> None: pass [builtins fixtures/tuple.pyi] +[case testPartiallyDefinedMatchUnreachable] +# flags: --enable-error-code partially-defined +import typing + +def f0(x: int) -> int: + match x: + case 1 if not typing.TYPE_CHECKING: + pass + case 2: + y = 2 + case _: + y = 3 + return y # No error. + +def f1(x: int) -> int: + match x: + case 1 if not typing.TYPE_CHECKING: + pass + case 2: + y = 2 + return y # E: Name "y" may be undefined + +[typing fixtures/typing-medium.pyi] + [case testTypeAliasWithNewUnionSyntaxAndNoneLeftOperand] from typing import overload class C: