diff --git a/packages/pyright-internal/src/analyzer/typeEvaluator.ts b/packages/pyright-internal/src/analyzer/typeEvaluator.ts index 04c1cda2a1..2e59362f77 100644 --- a/packages/pyright-internal/src/analyzer/typeEvaluator.ts +++ b/packages/pyright-internal/src/analyzer/typeEvaluator.ts @@ -10338,7 +10338,10 @@ export function createTypeEvaluator( return false; } - if (isInstantiableClass(leftType) || (isClassInstance(leftType) && ClassType.isBuiltIn(leftType, 'type'))) { + if ( + checkEq && + (isInstantiableClass(leftType) || (isClassInstance(leftType) && ClassType.isBuiltIn(leftType, 'type'))) + ) { if ( isInstantiableClass(rightType) || (isClassInstance(rightType) && ClassType.isBuiltIn(rightType, 'type')) @@ -10350,13 +10353,11 @@ export function createTypeEvaluator( return true; } } - if (checkEq) { - // Does the class have an operator overload for eq? - const metaclass = leftType.shared.effectiveMetaclass; - if (metaclass && isClass(metaclass)) { - if (lookUpClassMember(metaclass, '__eq__', MemberAccessFlags.SkipObjectBaseClass)) { - return true; - } + // Does the class have an operator overload for eq? + const metaclass = leftType.shared.effectiveMetaclass; + if (metaclass && isClass(metaclass)) { + if (lookUpClassMember(metaclass, '__eq__', MemberAccessFlags.SkipObjectBaseClass)) { + return true; } } diff --git a/packages/pyright-internal/src/tests/samples/cast.py b/packages/pyright-internal/src/tests/samples/cast.py index d42fc1a9e7..59a18b1510 100644 --- a/packages/pyright-internal/src/tests/samples/cast.py +++ b/packages/pyright-internal/src/tests/samples/cast.py @@ -1,7 +1,7 @@ -from typing import cast, Never +from typing import Any, cast, Never from collections.abc import Mapping -def foo(str_: str, int_or_str: int | str, dict_int_or_none: dict[str, int | None], mapping: Mapping[str, int | None]): +def foo(str_: str, int_or_str: int | str, dict_int_or_none: dict[str, int | None], mapping: Mapping[str, int | None], type_int: type[int], type_any: type[Any], type_object: type[object]): cast(int, str_) # error, non-overlapping types cast(int | bytes, str_) # error, non-overlapping types cast(object, str_) # wider, no error @@ -13,3 +13,9 @@ def foo(str_: str, int_or_str: int | str, dict_int_or_none: dict[str, int | None cast(Mapping[str, int], dict_int_or_none) # wider (ignore type parameters), no error cast(dict[str, int], mapping) # wider, no error cast(dict[str, bytes], mapping) # xfail, https://github.com/DetachHead/basedpyright/issues/259 + cast(type[Any], object()) # narrower, no error + cast(type[object], object()) # narrower, no error + cast(type[int], object()) # narrower, no error + cast(object, type_any) # wider, no error + cast(object, type_object) # wider, no error + cast(object, type_int) # wider, no error \ No newline at end of file