From 960e02fc8431453605fe9ad32d15df9b632bebbf Mon Sep 17 00:00:00 2001 From: Navpreet Sidhu Date: Tue, 27 Oct 2026 00:49:19 +0530 Subject: [PATCH] Treat a class whose __new__ returns Never as a type object --- mypy/types.py | 5 +++-- test-data/unit/check-classes.test | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/mypy/types.py b/mypy/types.py index a6df7bf2e4521..c994f1fecb702 100644 --- a/mypy/types.py +++ b/mypy/types.py @@ -2424,8 +2424,9 @@ def is_kw_arg(self) -> bool: return ARG_STAR2 in self.arg_kinds def is_type_obj(self) -> bool: - return self.fallback.type.is_metaclass() and not isinstance( - get_proper_type(self.ret_type), UninhabitedType + return self.fallback.type.is_metaclass() and ( + self.instance_type is not None + or not isinstance(get_proper_type(self.ret_type), UninhabitedType) ) def get_instance_type(self, *, force_fallback: bool = False) -> ProperType: diff --git a/test-data/unit/check-classes.test b/test-data/unit/check-classes.test index 70d9b388d7fd9..5dbd1d0a2fd2a 100644 --- a/test-data/unit/check-classes.test +++ b/test-data/unit/check-classes.test @@ -8816,6 +8816,24 @@ if object(): if object(): reveal_type(D()) # N: Revealed type is "Never" +[case testNewNoReturnClassIsTypeObject] +from typing import NoReturn, TypeVar + +T = TypeVar("T", bound=type[object]) +def deco(cls: T) -> T: return cls + +@deco +class A: + def __new__(cls) -> NoReturn: ... + +a: type[A] = A +def f(o: object) -> None: + if isinstance(o, A): + reveal_type(o) # N: Revealed type is "__main__.A" +if object(): + reveal_type(A()) # N: Revealed type is "Never" +[builtins fixtures/isinstance.pyi] + [case testOverloadedNewAndInitNoReturn] from typing import NoReturn, overload