[ty] Fix 'too many cycle iterations' for unions of literals (#20137)

## Summary

Decrease the maximum number of literals in a union before we collapse to
the supertype. The better fix for this will be
https://github.com/astral-sh/ty/issues/957, but it is very tempting to
solve this for now by simply decreasing the limit by one, to get below
the salsa limit of 200.

closes https://github.com/astral-sh/ty/issues/660

## Test Plan

Added a regression test that would previously lead to a "too many cycle
iterations" panic.
This commit is contained in:
David Peter 2025-08-28 16:46:37 +02:00 committed by GitHub
parent b3c4005289
commit 1842cfe333
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 18 additions and 1 deletions

View file

@ -2309,6 +2309,20 @@ reveal_type(Toggle().x) # revealed: Literal[True]
reveal_type(Toggle().y) # revealed: Unknown | Literal[True] reveal_type(Toggle().y) # revealed: Unknown | Literal[True]
``` ```
Make sure that the growing union of literals `Literal[0, 1, 2, ...]` collapses to `int` during
fixpoint iteration. This is a regression test for <https://github.com/astral-sh/ty/issues/660>.
```py
class Counter:
def __init__(self: "Counter"):
self.count = 0
def increment(self: "Counter"):
self.count = self.count + 1
reveal_type(Counter().count) # revealed: Unknown | int
```
### Builtin types attributes ### Builtin types attributes
This test can probably be removed eventually, but we currently include it because we do not yet This test can probably be removed eventually, but we currently include it because we do not yet

View file

@ -202,7 +202,10 @@ enum ReduceResult<'db> {
// TODO increase this once we extend `UnionElement` throughout all union/intersection // TODO increase this once we extend `UnionElement` throughout all union/intersection
// representations, so that we can make large unions of literals fast in all operations. // representations, so that we can make large unions of literals fast in all operations.
const MAX_UNION_LITERALS: usize = 200; //
// For now (until we solve https://github.com/astral-sh/ty/issues/957), keep this number
// below 200, which is the salsa fixpoint iteration limit.
const MAX_UNION_LITERALS: usize = 199;
pub(crate) struct UnionBuilder<'db> { pub(crate) struct UnionBuilder<'db> {
elements: Vec<UnionElement<'db>>, elements: Vec<UnionElement<'db>>,