Fix run-away for mutually referential instance attributes (#20645)

This commit is contained in:
Micha Reiser 2025-10-16 13:24:41 +02:00 committed by GitHub
parent 9393279f65
commit 5fb142374d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 59 additions and 10 deletions

View file

@ -2363,6 +2363,55 @@ reveal_type(B().x) # revealed: Unknown | Literal[1]
reveal_type(A().x) # revealed: Unknown | Literal[1]
```
And cycles between many attributes:
```py
class ManyCycles:
def __init__(self: "ManyCycles"):
self.x1 = 0
self.x2 = 0
self.x3 = 0
self.x4 = 0
self.x5 = 0
self.x6 = 0
self.x7 = 1
def f1(self: "ManyCycles"):
self.x1 = self.x2 + self.x3 + self.x4 + self.x5 + self.x6 + self.x7
self.x2 = self.x1 + self.x3 + self.x4 + self.x5 + self.x6 + self.x7
self.x3 = self.x1 + self.x2 + self.x4 + self.x5 + self.x6 + self.x7
self.x4 = self.x1 + self.x2 + self.x3 + self.x5 + self.x6 + self.x7
self.x5 = self.x1 + self.x2 + self.x3 + self.x4 + self.x6 + self.x7
self.x6 = self.x1 + self.x2 + self.x3 + self.x4 + self.x5 + self.x7
self.x7 = self.x1 + self.x2 + self.x3 + self.x4 + self.x5 + self.x6
def f2(self: "ManyCycles"):
self.x1 = self.x2 + self.x3 + self.x4 + self.x5 + self.x6 + self.x7
self.x2 = self.x1 + self.x3 + self.x4 + self.x5 + self.x6 + self.x7
self.x3 = self.x1 + self.x2 + self.x4 + self.x5 + self.x6 + self.x7
self.x4 = self.x1 + self.x2 + self.x3 + self.x5 + self.x6 + self.x7
self.x5 = self.x1 + self.x2 + self.x3 + self.x4 + self.x6 + self.x7
self.x6 = self.x1 + self.x2 + self.x3 + self.x4 + self.x5 + self.x7
self.x7 = self.x1 + self.x2 + self.x3 + self.x4 + self.x5 + self.x6
def f3(self: "ManyCycles"):
self.x1 = self.x2 + self.x3 + self.x4 + self.x5 + self.x6 + self.x7
self.x2 = self.x1 + self.x3 + self.x4 + self.x5 + self.x6 + self.x7
self.x3 = self.x1 + self.x2 + self.x4 + self.x5 + self.x6 + self.x7
self.x4 = self.x1 + self.x2 + self.x3 + self.x5 + self.x6 + self.x7
self.x5 = self.x1 + self.x2 + self.x3 + self.x4 + self.x6 + self.x7
self.x6 = self.x1 + self.x2 + self.x3 + self.x4 + self.x5 + self.x7
self.x7 = self.x1 + self.x2 + self.x3 + self.x4 + self.x5 + self.x6
reveal_type(self.x1) # revealed: Unknown | int
reveal_type(self.x2) # revealed: Unknown | int
reveal_type(self.x3) # revealed: Unknown | int
reveal_type(self.x4) # revealed: Unknown | int
reveal_type(self.x5) # revealed: Unknown | int
reveal_type(self.x6) # revealed: Unknown | int
reveal_type(self.x7) # revealed: Unknown | int
```
This case additionally tests our union/intersection simplification logic:
```py