diff --git a/mypy/meet.py b/mypy/meet.py index 63305c2bb236..1cb291ff90d5 100644 --- a/mypy/meet.py +++ b/mypy/meet.py @@ -346,7 +346,7 @@ def is_overlapping_types( seen_types = set() elif (left, right) in seen_types: return True - if isinstance(left, TypeAliasType) and isinstance(right, TypeAliasType): + if is_recursive_pair(left, right): seen_types.add((left, right)) left, right = get_proper_types((left, right)) diff --git a/test-data/unit/check-recursive-types.test b/test-data/unit/check-recursive-types.test index c82111322fe1..c09f1e6b90c0 100644 --- a/test-data/unit/check-recursive-types.test +++ b/test-data/unit/check-recursive-types.test @@ -1024,3 +1024,19 @@ L = list[T] A = L[A] a: A = 1 # E: Incompatible types in assignment (expression has type "int", variable has type "A") + +[case testRecursiveAliasInstanceOverlapCheck] +# flags: --warn-unreachable +from typing_extensions import TypeAlias + +OneClass: TypeAlias = 'list[OneClass]' + +class TwoClass(list['TwoClass']): + pass + +def f(obj: OneClass) -> None: + if isinstance(obj, TwoClass): + reveal_type(obj) # N: Revealed type is "__main__.TwoClass" + else: + reveal_type(obj) # N: Revealed type is "builtins.list[...]" +[builtins fixtures/isinstancelist.pyi]