diff --git a/mypy/checkexpr.py b/mypy/checkexpr.py index 49fc1159856f7..5990619674fe1 100644 --- a/mypy/checkexpr.py +++ b/mypy/checkexpr.py @@ -557,6 +557,10 @@ def visit_call_expr_inner(self, e: CallExpr, allow_none_return: bool = False) -> and node and isinstance(node.node, TypeAlias) and not node.node.no_args + and not ( + isinstance(target := get_proper_type(node.node.target), TupleType) + and tuple_fallback(target).type.fullname != "builtins.tuple" + ) and not ( isinstance(union_target := get_proper_type(node.node.target), UnionType) and ( diff --git a/test-data/unit/check-isinstance.test b/test-data/unit/check-isinstance.test index 0b20d5911151f..e9c9ce3b4827f 100644 --- a/test-data/unit/check-isinstance.test +++ b/test-data/unit/check-isinstance.test @@ -1900,6 +1900,21 @@ isinstance(x, It2) # E: Parameterized generics cannot be used with class or ins [builtins fixtures/isinstance.pyi] [typing fixtures/typing-full.pyi] +[case testIsinstanceTypeAliasToNamedTuple] +# flags: --warn-unreachable +from typing import Any, NamedTuple +from typing_extensions import TypeAlias + +class Foo(NamedTuple): + pass + +Alias: TypeAlias = Foo + +def is_foo(x: Any) -> bool: + return isinstance(x, Alias) +[builtins fixtures/tuple.pyi] +[typing fixtures/typing-full.pyi] + [case testIssubclassTypeArgs] # flags: --warn-unreachable from typing import Iterable, TypeVar