mirror of
https://github.com/astral-sh/ruff
synced 2026-01-21 13:30:49 -05:00
## Summary This PR fixes https://github.com/astral-sh/ty/issues/2085. Based on the reported code, the panicking MRE is: ```python class Test: def __init__(self, x: int): self.left = x self.right = x def method(self): self.left, self.right = self.right, self.left if self.right: self.right = self.right ``` The type inference (`implicit_attribute_inner`) for `self.right` proceeds as follows: ``` 0: Divergent(Id(6c07)) 1: Unknown | int | (Divergent(Id(1c00)) & ~AlwaysFalsy) 2: Unknown | int | (Divergent(Id(6c07)) & ~AlwaysFalsy) | (Divergent(Id(1c00)) & ~AlwaysFalsy) 3: Unknown | int | (Divergent(Id(1c00)) & ~AlwaysFalsy) | (Divergent(Id(6c07)) & ~AlwaysFalsy) 4: Unknown | int | (Divergent(Id(6c07)) & ~AlwaysFalsy) | (Divergent(Id(1c00)) & ~AlwaysFalsy) ... ``` The problem is that the order of union types is not stable between cycles. To solve this, when unioning the previous union type with the current union type, we should use the previous type as the base and add only the new elements in this cycle (In the current implementation, this unioning order was reversed). ## Test Plan New corpus test