Skip to content

Commit 841db1f

Browse files
authored
Remember the pair in is_overlapping_types if at least one of them is an alias (#20127)
Fixes #20107. One recursive alias is enough to trigger infinite recursion
1 parent 842a8fd commit 841db1f

File tree

2 files changed

+17
-1
lines changed

2 files changed

+17
-1
lines changed

mypy/meet.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,7 @@ def is_overlapping_types(
346346
seen_types = set()
347347
elif (left, right) in seen_types:
348348
return True
349-
if isinstance(left, TypeAliasType) and isinstance(right, TypeAliasType):
349+
if is_recursive_pair(left, right):
350350
seen_types.add((left, right))
351351

352352
left, right = get_proper_types((left, right))

test-data/unit/check-recursive-types.test

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1024,3 +1024,19 @@ L = list[T]
10241024

10251025
A = L[A]
10261026
a: A = 1 # E: Incompatible types in assignment (expression has type "int", variable has type "A")
1027+
1028+
[case testRecursiveAliasInstanceOverlapCheck]
1029+
# flags: --warn-unreachable
1030+
from typing_extensions import TypeAlias
1031+
1032+
OneClass: TypeAlias = 'list[OneClass]'
1033+
1034+
class TwoClass(list['TwoClass']):
1035+
pass
1036+
1037+
def f(obj: OneClass) -> None:
1038+
if isinstance(obj, TwoClass):
1039+
reveal_type(obj) # N: Revealed type is "__main__.TwoClass"
1040+
else:
1041+
reveal_type(obj) # N: Revealed type is "builtins.list[...]"
1042+
[builtins fixtures/isinstancelist.pyi]

0 commit comments

Comments
 (0)