Skip to content

Commit 5fb1423

Browse files
authored
Fix run-away for mutually referential instance attributes (#20645)
1 parent 9393279 commit 5fb1423

File tree

5 files changed

+59
-10
lines changed

5 files changed

+59
-10
lines changed

Cargo.lock

Lines changed: 6 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ regex-automata = { version = "0.4.9" }
146146
rustc-hash = { version = "2.0.0" }
147147
rustc-stable-hash = { version = "0.1.2" }
148148
# When updating salsa, make sure to also update the revision in `fuzz/Cargo.toml`
149-
salsa = { git = "https://github.com/salsa-rs/salsa.git", rev = "29ab321b45d00daa4315fa2a06f7207759a8c87e", default-features = false, features = [
149+
salsa = { git = "https://github.com/salsa-rs/salsa.git", rev = "ef9f9329be6923acd050c8dddd172e3bc93e8051", default-features = false, features = [
150150
"compact_str",
151151
"macros",
152152
"salsa_unstable",

crates/ty_python_semantic/resources/mdtest/attributes.md

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2363,6 +2363,55 @@ reveal_type(B().x) # revealed: Unknown | Literal[1]
23632363
reveal_type(A().x) # revealed: Unknown | Literal[1]
23642364
```
23652365

2366+
And cycles between many attributes:
2367+
2368+
```py
2369+
class ManyCycles:
2370+
def __init__(self: "ManyCycles"):
2371+
self.x1 = 0
2372+
self.x2 = 0
2373+
self.x3 = 0
2374+
self.x4 = 0
2375+
self.x5 = 0
2376+
self.x6 = 0
2377+
self.x7 = 1
2378+
2379+
def f1(self: "ManyCycles"):
2380+
self.x1 = self.x2 + self.x3 + self.x4 + self.x5 + self.x6 + self.x7
2381+
self.x2 = self.x1 + self.x3 + self.x4 + self.x5 + self.x6 + self.x7
2382+
self.x3 = self.x1 + self.x2 + self.x4 + self.x5 + self.x6 + self.x7
2383+
self.x4 = self.x1 + self.x2 + self.x3 + self.x5 + self.x6 + self.x7
2384+
self.x5 = self.x1 + self.x2 + self.x3 + self.x4 + self.x6 + self.x7
2385+
self.x6 = self.x1 + self.x2 + self.x3 + self.x4 + self.x5 + self.x7
2386+
self.x7 = self.x1 + self.x2 + self.x3 + self.x4 + self.x5 + self.x6
2387+
2388+
def f2(self: "ManyCycles"):
2389+
self.x1 = self.x2 + self.x3 + self.x4 + self.x5 + self.x6 + self.x7
2390+
self.x2 = self.x1 + self.x3 + self.x4 + self.x5 + self.x6 + self.x7
2391+
self.x3 = self.x1 + self.x2 + self.x4 + self.x5 + self.x6 + self.x7
2392+
self.x4 = self.x1 + self.x2 + self.x3 + self.x5 + self.x6 + self.x7
2393+
self.x5 = self.x1 + self.x2 + self.x3 + self.x4 + self.x6 + self.x7
2394+
self.x6 = self.x1 + self.x2 + self.x3 + self.x4 + self.x5 + self.x7
2395+
self.x7 = self.x1 + self.x2 + self.x3 + self.x4 + self.x5 + self.x6
2396+
2397+
def f3(self: "ManyCycles"):
2398+
self.x1 = self.x2 + self.x3 + self.x4 + self.x5 + self.x6 + self.x7
2399+
self.x2 = self.x1 + self.x3 + self.x4 + self.x5 + self.x6 + self.x7
2400+
self.x3 = self.x1 + self.x2 + self.x4 + self.x5 + self.x6 + self.x7
2401+
self.x4 = self.x1 + self.x2 + self.x3 + self.x5 + self.x6 + self.x7
2402+
self.x5 = self.x1 + self.x2 + self.x3 + self.x4 + self.x6 + self.x7
2403+
self.x6 = self.x1 + self.x2 + self.x3 + self.x4 + self.x5 + self.x7
2404+
self.x7 = self.x1 + self.x2 + self.x3 + self.x4 + self.x5 + self.x6
2405+
2406+
reveal_type(self.x1) # revealed: Unknown | int
2407+
reveal_type(self.x2) # revealed: Unknown | int
2408+
reveal_type(self.x3) # revealed: Unknown | int
2409+
reveal_type(self.x4) # revealed: Unknown | int
2410+
reveal_type(self.x5) # revealed: Unknown | int
2411+
reveal_type(self.x6) # revealed: Unknown | int
2412+
reveal_type(self.x7) # revealed: Unknown | int
2413+
```
2414+
23662415
This case additionally tests our union/intersection simplification logic:
23672416

23682417
```py
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
spark # too many iterations (in `exported_names` query)
2-
steam.py # hangs (single threaded)
1+
spark # too many iterations (in `exported_names` query), `should not be able to access instance member `spark` of type variable IndexOpsLike@astype in inferable position`
2+
steam.py # dependency graph cycle when querying TypeVarInstance < 'db >::lazy_default_(Id(2e007)), set cycle_fn/cycle_initial to fixpoint iterate.

fuzz/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ ty_python_semantic = { path = "../crates/ty_python_semantic" }
3030
ty_vendored = { path = "../crates/ty_vendored" }
3131

3232
libfuzzer-sys = { git = "https://github.com/rust-fuzz/libfuzzer", default-features = false }
33-
salsa = { git = "https://github.com/salsa-rs/salsa.git", rev = "29ab321b45d00daa4315fa2a06f7207759a8c87e", default-features = false, features = [
33+
salsa = { git = "https://github.com/salsa-rs/salsa.git", rev = "ef9f9329be6923acd050c8dddd172e3bc93e8051", default-features = false, features = [
3434
"compact_str",
3535
"macros",
3636
"salsa_unstable",

0 commit comments

Comments
 (0)