mirror of
https://github.com/astral-sh/ruff.git
synced 2025-10-22 08:12:17 +00:00
Fix run-away for mutually referential instance attributes (#20645)
This commit is contained in:
parent
9393279f65
commit
5fb142374d
5 changed files with 59 additions and 10 deletions
12
Cargo.lock
generated
12
Cargo.lock
generated
|
@ -3540,8 +3540,8 @@ checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "salsa"
|
name = "salsa"
|
||||||
version = "0.23.0"
|
version = "0.24.0"
|
||||||
source = "git+https://github.com/salsa-rs/salsa.git?rev=29ab321b45d00daa4315fa2a06f7207759a8c87e#29ab321b45d00daa4315fa2a06f7207759a8c87e"
|
source = "git+https://github.com/salsa-rs/salsa.git?rev=ef9f9329be6923acd050c8dddd172e3bc93e8051#ef9f9329be6923acd050c8dddd172e3bc93e8051"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"boxcar",
|
"boxcar",
|
||||||
"compact_str",
|
"compact_str",
|
||||||
|
@ -3564,13 +3564,13 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "salsa-macro-rules"
|
name = "salsa-macro-rules"
|
||||||
version = "0.23.0"
|
version = "0.24.0"
|
||||||
source = "git+https://github.com/salsa-rs/salsa.git?rev=29ab321b45d00daa4315fa2a06f7207759a8c87e#29ab321b45d00daa4315fa2a06f7207759a8c87e"
|
source = "git+https://github.com/salsa-rs/salsa.git?rev=ef9f9329be6923acd050c8dddd172e3bc93e8051#ef9f9329be6923acd050c8dddd172e3bc93e8051"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "salsa-macros"
|
name = "salsa-macros"
|
||||||
version = "0.23.0"
|
version = "0.24.0"
|
||||||
source = "git+https://github.com/salsa-rs/salsa.git?rev=29ab321b45d00daa4315fa2a06f7207759a8c87e#29ab321b45d00daa4315fa2a06f7207759a8c87e"
|
source = "git+https://github.com/salsa-rs/salsa.git?rev=ef9f9329be6923acd050c8dddd172e3bc93e8051#ef9f9329be6923acd050c8dddd172e3bc93e8051"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
|
|
|
@ -146,7 +146,7 @@ regex-automata = { version = "0.4.9" }
|
||||||
rustc-hash = { version = "2.0.0" }
|
rustc-hash = { version = "2.0.0" }
|
||||||
rustc-stable-hash = { version = "0.1.2" }
|
rustc-stable-hash = { version = "0.1.2" }
|
||||||
# When updating salsa, make sure to also update the revision in `fuzz/Cargo.toml`
|
# When updating salsa, make sure to also update the revision in `fuzz/Cargo.toml`
|
||||||
salsa = { git = "https://github.com/salsa-rs/salsa.git", rev = "29ab321b45d00daa4315fa2a06f7207759a8c87e", default-features = false, features = [
|
salsa = { git = "https://github.com/salsa-rs/salsa.git", rev = "ef9f9329be6923acd050c8dddd172e3bc93e8051", default-features = false, features = [
|
||||||
"compact_str",
|
"compact_str",
|
||||||
"macros",
|
"macros",
|
||||||
"salsa_unstable",
|
"salsa_unstable",
|
||||||
|
|
|
@ -2363,6 +2363,55 @@ reveal_type(B().x) # revealed: Unknown | Literal[1]
|
||||||
reveal_type(A().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:
|
This case additionally tests our union/intersection simplification logic:
|
||||||
|
|
||||||
```py
|
```py
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
spark # too many iterations (in `exported_names` query)
|
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`
|
||||||
steam.py # hangs (single threaded)
|
steam.py # dependency graph cycle when querying TypeVarInstance < 'db >::lazy_default_(Id(2e007)), set cycle_fn/cycle_initial to fixpoint iterate.
|
||||||
|
|
|
@ -30,7 +30,7 @@ ty_python_semantic = { path = "../crates/ty_python_semantic" }
|
||||||
ty_vendored = { path = "../crates/ty_vendored" }
|
ty_vendored = { path = "../crates/ty_vendored" }
|
||||||
|
|
||||||
libfuzzer-sys = { git = "https://github.com/rust-fuzz/libfuzzer", default-features = false }
|
libfuzzer-sys = { git = "https://github.com/rust-fuzz/libfuzzer", default-features = false }
|
||||||
salsa = { git = "https://github.com/salsa-rs/salsa.git", rev = "29ab321b45d00daa4315fa2a06f7207759a8c87e", default-features = false, features = [
|
salsa = { git = "https://github.com/salsa-rs/salsa.git", rev = "ef9f9329be6923acd050c8dddd172e3bc93e8051", default-features = false, features = [
|
||||||
"compact_str",
|
"compact_str",
|
||||||
"macros",
|
"macros",
|
||||||
"salsa_unstable",
|
"salsa_unstable",
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue