Find a file
Jacob Pratt 808c8f84c3
Rollup merge of #134920 - lqd:polonius-next-episode-6, r=jackh726
Convert typeck constraints in location-sensitive polonius

In this PR, we do a big chunk of the work of localizing regular outlives constraints.

The slightly annoying thing is handling effectful statements: usually the subset graph propagates loans at a single point between regions, and liveness propagates loans between points within a single region, but some statements have effects applied on exit.

This was also a problem before, in datalog polonius terms and Niko's solution at the time, this is about: the mid-point. The idea was to duplicate all MIR locations into two physical points, and orchestrate the effects with that. Somewhat easier to do, but double the CFG.

We've always believed we didn't _need_ midpoints in principle, as we can represent changes on exit as on happening entry to the successor, but there's some difficulty in tracking the position information at sufficient granularity through outlives relation (especially since we also have bidirectional edges and time-traveling now).

Now, that is surely what we should be doing in the future. In the mean time, I infer this from the kind of statement/terminator where an outlives constraint arose. It's not particularly complicated but some explanation will help clarify the code.

Assignments (in their various forms) are the quintessential example of these crossover cases: loans that would flow into the LHS would not be visible on entry to the point but on exit -- so we'll localize these edges to the successor. Let's look at a real-world example, involving invariance for bidirectional edges:

```rust
let mut _1: HashMap<i32, &'7 i32>;
let mut _3: &'9 mut HashMap<i32, &'10 i32>;
...
/* at bb1[3]: */ _3 = &'3 mut _1;
```

Here, typeck expectedly produces 3 outlives constraints today:
1. `'3 -> '9`
2. `'7 -> '10`
3. `'10 -> '7`

And we localize them like so,

1. `'3 -> '9` flows into the LHS and becomes: `3_bb1_3 -> 9_bb1_4`
2. `'7 -> '10` flows into the LHS and becomes: `7_bb1_3 -> 10_bb1_4`
3. `'10 -> '7` flows from the LHS and becomes: `10_bb1_4 -> 7_bb1_3` (time traveling 👌)

---

r? ``@jackh726``

To keep you entertained during the holidays I also threw in a couple of small changes removing cruft in the borrow checker.

We're actually getting there. The next PR will be the last one needed to get end-to-end tests working.
2025-01-08 00:52:46 -05:00
.github Remove workaround from pull request template 2025-01-07 07:35:08 +01:00
compiler Rollup merge of #134920 - lqd:polonius-next-episode-6, r=jackh726 2025-01-08 00:52:46 -05:00
library Rollup merge of #134389 - rust-wasi-web:condvar-no-threads, r=m-ou-se 2025-01-08 00:52:45 -05:00
LICENSES Synchronize Unicode license text from unicode.org 2024-11-20 00:54:12 -08:00
src Auto merge of #135207 - lnicola:sync-from-ra, r=lnicola 2025-01-08 01:08:24 +00:00
tests Rollup merge of #135171 - notriddle:notriddle/stable-path-is-better, r=GuillaumeGomez 2025-01-07 21:39:41 +01:00
.clang-format Add .clang-format 2024-06-26 05:56:00 +08:00
.editorconfig Only use max_line_length = 100 for *.rs 2023-07-10 15:18:36 -07:00
.git-blame-ignore-revs Add rustfmt 2024 reformatting to git blame ignore 2024-09-23 10:02:04 +02:00
.gitattributes Revert "Stop git from merging generated files" 2024-12-12 07:20:11 +01:00
.gitignore only ignore {flake,default}.nix and {.envrc,.direnv/} in the root 2024-12-10 00:08:26 +01:00
.gitmodules Removed rustc-dev-guide as a submodule 2025-01-01 17:05:53 +01:00
.ignore Add .ignore file to make config.toml searchable in vscode 2024-06-24 10:15:16 +02:00
.mailmap Rollup merge of #134965 - Noratrieb:slightly-late-for-boxing-day-sadly-but-still-almost, r=BoxyUwU 2025-01-03 22:12:42 +01:00
Cargo.lock Rollup merge of #135146 - Zalathar:anyhow-backtrace, r=jieyouxu 2025-01-06 20:59:35 +01:00
Cargo.toml move src/tools/build_helper into src/build_helper 2024-11-11 11:19:11 +03:00
CODE_OF_CONDUCT.md Remove the code of conduct; instead link https://www.rust-lang.org/conduct.html 2019-10-05 22:55:19 +02:00
config.example.toml update build.vendor documentation 2024-12-04 16:02:07 +03:00
configure Ensure ./configure works when configure.py path contains spaces 2024-02-16 18:57:22 +00:00
CONTRIBUTING.md fix: Update CONTRIBUTING.md recommend -> recommended 2023-11-16 23:57:09 +05:30
COPYRIGHT Synchronize Unicode license text from unicode.org 2024-11-20 00:54:12 -08:00
INSTALL.md add clarity for custom path installation 2024-10-06 07:37:00 -05:00
LICENSE-APACHE Remove appendix from LICENCE-APACHE 2019-12-30 14:25:53 +00:00
license-metadata.json collect-license-metadata: move JSON to root, and add a 'check' mode 2024-11-25 14:14:57 +00:00
LICENSE-MIT LICENSE-MIT: Remove inaccurate (misattributed) copyright notice 2017-07-26 16:51:58 -07:00
README.md Grammar fixes 2024-12-09 17:17:27 -05:00
RELEASES.md last feedback items 2025-01-06 17:14:16 +01:00
REUSE.toml collect-license-metadata: move JSON to root, and add a 'check' mode 2024-11-25 14:14:57 +00:00
rust-bors.toml Increase timeout for new bors bot 2024-03-13 08:31:07 +01:00
rustfmt.toml Use field init shorthand where possible 2024-12-17 14:33:10 -08:00
triagebot.toml Update triagebot.toml: celinval vacation is over 2025-01-06 10:50:58 -08:00
x fix(x): fix a regex used to find python executable 2024-11-06 16:40:02 +03:00
x.ps1 use & instead of start-process in x.ps1 2023-12-09 09:46:16 -05:00
x.py Reformat Python code with ruff 2024-12-04 23:03:44 +01:00

This is the main source code repository for Rust. It contains the compiler, standard library, and documentation.

Why Rust?

  • Performance: Fast and memory-efficient, suitable for critical services, embedded devices, and easily integrated with other languages.

  • Reliability: Our rich type system and ownership model ensure memory and thread safety, reducing bugs at compile-time.

  • Productivity: Comprehensive documentation, a compiler committed to providing great diagnostics, and advanced tooling including package manager and build tool (Cargo), auto-formatter (rustfmt), linter (Clippy) and editor support (rust-analyzer).

Quick Start

Read "Installation" from The Book.

Installing from Source

If you really want to install from source (though this is not recommended), see INSTALL.md.

Getting Help

See https://www.rust-lang.org/community for a list of chat platforms and forums.

Contributing

See CONTRIBUTING.md.

License

Rust is primarily distributed under the terms of both the MIT license and the Apache License (Version 2.0), with portions covered by various BSD-like licenses.

See LICENSE-APACHE, LICENSE-MIT, and COPYRIGHT for details.

Trademark

The Rust Foundation owns and protects the Rust and Cargo trademarks and logos (the "Rust Trademarks").

If you want to use these names or brands, please read the media guide.

Third-party logos may be subject to third-party copyrights and trademarks. See Licenses for details.