diff --git a/mypy/checker.py b/mypy/checker.py index 9c4f4ce88690..db172823b403 100644 --- a/mypy/checker.py +++ b/mypy/checker.py @@ -5889,9 +5889,15 @@ def find_isinstance_check_helper( # Also note that a care must be taken to unwrap this back at read places # where we use this to narrow down declared type. if node.callee.type_guard is not None: + if isinstance( + get_proper_type(node.callee.type_guard), UninhabitedType + ): + return None, {} return {expr: TypeGuardedType(node.callee.type_guard)}, {} else: assert node.callee.type_is is not None + if isinstance(get_proper_type(node.callee.type_is), UninhabitedType): + return None, {} return conditional_types_to_typemaps( expr, *self.conditional_types_with_intersection( diff --git a/test-data/unit/check-unreachable-code.test b/test-data/unit/check-unreachable-code.test index cbad1bd5449e..794e6c67e3f4 100644 --- a/test-data/unit/check-unreachable-code.test +++ b/test-data/unit/check-unreachable-code.test @@ -1507,3 +1507,41 @@ x = 0 # not unreachable f2: Callable[[], NoReturn] = lambda: foo() x = 0 # not unreachable + +[case testUnreachableTypeGuardNever] +# flags: --warn-unreachable +from typing_extensions import Never, TypeGuard + +def guard(x: object) -> TypeGuard[Never]: + pass + +a: object +assert not guard(a) + +if guard(a): + reveal_type(a) # E: Statement is unreachable +else: + reveal_type(a) # N: Revealed type is "builtins.object" + +assert guard(a) +b = 0 # E: Statement is unreachable +[builtins fixtures/tuple.pyi] + +[case testUnreachableTypeIsNever] +# flags: --warn-unreachable +from typing_extensions import Never, TypeIs + +def guard(x: object) -> TypeIs[Never]: + pass + +a: object +assert not guard(a) + +if guard(a): + reveal_type(a) # E: Statement is unreachable +else: + reveal_type(a) # N: Revealed type is "builtins.object" + +assert guard(a) +b = 0 # E: Statement is unreachable +[builtins fixtures/tuple.pyi]