Skip to content

RFC-2229: Implement Precise Capture Analysis - #78801

Merged
bors merged 16 commits into
rust-lang:masterfrom
sexxi-goose:min_capture
Nov 17, 2020
Merged

RFC-2229: Implement Precise Capture Analysis#78801
bors merged 16 commits into
rust-lang:masterfrom
sexxi-goose:min_capture

Conversation

@arora-aman

@arora-aman arora-aman commented Nov 6, 2020

Copy link
Copy Markdown
Contributor

This PR introduces

  • Feature gate for RFC-2229 (incomplete) capture_disjoint_field
  • Rustc Attribute to print out the capture analysis rustc_capture_analysis
  • Precise capture analysis

Description of the analysis

  1. If the feature gate is not set then all variables that are not local to the closure will be added to the list of captures. (This is for backcompat)
  2. The rest of the analysis is based entirely on how the captured Places are used within the closure. Precise information (i.e. projections) about the Place is maintained throughout.
  3. To reduce the amount of information we need to keep track of, we do a minimization step. In this step, we determine a list such that no Place within this list represents an ancestor path to another entry in the list. Check Ensure minimal places are captured project-rfc-2229#9 for more detailed examples.
  4. To keep the compiler functional as before we implement a Bridge between the results of this new analysis to existing data structures used for closure captures. Note the new capture analysis results are only part of MaybeTypeckTables that is the information is only available during typeck-ing.

Known issues

  • Statements like let _ = x will make the compiler ICE when used within a closure with the feature enabled. More generally speaking the issue is caused by let statements that create no bindings and are init'ed using a Place expression.

Testing

We removed the code that would handle the case where the feature gate is not set, to enable the feature as default and did a bors try and perf run. More information here: #78762

Thanks

This has been slowly in the works for a while now.
I want to call out @Azhng @ChrisPardy @null-sleep @jenniferwills @logmosier @roxelo for working on this and the previous PRs that led up to this, @nikomatsakis for guiding us.

Closes rust-lang/project-rfc-2229#7
Closes rust-lang/project-rfc-2229#9
Closes rust-lang/project-rfc-2229#6
Closes rust-lang/project-rfc-2229#19

r? @nikomatsakis

Loading
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

merged-by-bors This PR was explicitly merged by bors. S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Improve logging of capture analysis Ensure minimal places are captured Use hir::Place in closure_captures After typechk use closure_captures

10 participants