From 4974803ae365a66a860d00e6497cdf46faf4864f Mon Sep 17 00:00:00 2001 From: A5rocks Date: Tue, 18 Aug 2026 21:23:44 -0400 Subject: [PATCH] Make it possible to narrow in unreachable code --- mypy/checker.py | 5 +++-- test-data/unit/check-unreachable-code.test | 14 ++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/mypy/checker.py b/mypy/checker.py index 33ed5387554d..450e35121abb 100644 --- a/mypy/checker.py +++ b/mypy/checker.py @@ -8200,9 +8200,10 @@ def function_type(self, func: FuncBase) -> FunctionLike: return typ def push_type_map(self, type_map: TypeMap, *, from_assignment: bool = True) -> None: - if is_unreachable_map(type_map): + unreachable_map = is_unreachable_map(type_map) + if unreachable_map: self.binder.unreachable() - else: + if not unreachable_map or self.options.check_unreachable: for expr, type in type_map.items(): self.binder.put(expr, type, from_assignment=from_assignment) diff --git a/test-data/unit/check-unreachable-code.test b/test-data/unit/check-unreachable-code.test index 330983dab620..6fcaf0a3d063 100644 --- a/test-data/unit/check-unreachable-code.test +++ b/test-data/unit/check-unreachable-code.test @@ -1778,3 +1778,17 @@ def f2() -> None: reveal_type(5) # E: Statement is unreachable \ # N: Revealed type is "Literal[5]?" "something" # E: Statement is unreachable + +[case testUnreachableCodeStillNarrows] +# flags: --check-unreachable --warn-unreachable +import enum + +class SomeEnum(enum.Enum): + DEFAULT = 0 + +def f(x: SomeEnum) -> None: + if x is SomeEnum.DEFAULT: + pass + else: + reveal_type(x) # N: Revealed type is "Never" +[builtins fixtures/tuple.pyi]