From d670565170dfe9cb5ce83d08202538e860c6496b Mon Sep 17 00:00:00 2001 From: Ivan Levkivskyi Date: Sun, 14 Sep 2025 00:40:26 +0100 Subject: [PATCH] Fix crash on recursive alias in indirection.py --- mypy/indirection.py | 5 +++-- test-data/unit/check-incremental.test | 7 +++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/mypy/indirection.py b/mypy/indirection.py index 06a158818fbed..8c24c7242c967 100644 --- a/mypy/indirection.py +++ b/mypy/indirection.py @@ -39,8 +39,9 @@ def find_modules(self, typs: Iterable[types.Type]) -> set[str]: def _visit(self, typ: types.Type) -> None: if isinstance(typ, types.TypeAliasType): # Avoid infinite recursion for recursive type aliases. - if typ not in self.seen_aliases: - self.seen_aliases.add(typ) + if typ in self.seen_aliases: + return + self.seen_aliases.add(typ) typ.accept(self) def _visit_type_tuple(self, typs: tuple[types.Type, ...]) -> None: diff --git a/test-data/unit/check-incremental.test b/test-data/unit/check-incremental.test index defe7402730f0..1658e56f582bd 100644 --- a/test-data/unit/check-incremental.test +++ b/test-data/unit/check-incremental.test @@ -2577,6 +2577,13 @@ C(1)[0] [builtins fixtures/list.pyi] [out] +[case testSerializeRecursiveAlias] +from typing import Callable, Union + +Node = Union[str, int, Callable[[], "Node"]] +n: Node +[out] + [case testSerializeRecursiveAliases1] from typing import Type, Callable, Union