Add a Place::is_indirect method to determine whether a Place contains a Deref projection#64005
Merged
bors merged 2 commits intorust-lang:masterfrom Sep 5, 2019
Merged
Conversation
This returns whether a `Place` references the same region of memory as its base, or equivalently whether it contains a `Deref` projection. This is helpful for analyses that must track state for locals, since an assignment to `x` or `x.field` is fundamentally different than one to `*x`, which may mutate any memory region.
bd8c5d1 to
e9e075f
Compare
oli-obk
reviewed
Aug 29, 2019
Contributor
oli-obk
left a comment
There was a problem hiding this comment.
From the changes in this PR it looks to me like all use cases could use the find_local function instead?
Contributor
There was a problem hiding this comment.
What do you think about changing the true to !place.is_indirect()?
Contributor
Author
There was a problem hiding this comment.
That works better.
Contributor
|
r? @spastorino this looks like something right up your alley |
ecstatic-morse
commented
Aug 29, 2019
7542cb9 to
96ac02b
Compare
spastorino
approved these changes
Sep 4, 2019
Member
|
Nice work and looks good to me. I'm not sure I like the name of the function but can't think of a better one right now. Any other ideas?, @oli-obk do you consider the fn name good enough? any better ideas?. |
Contributor
|
@bors r+ Nope, no better ideas here |
Collaborator
|
📌 Commit 96ac02b has been approved by |
Centril
added a commit
to Centril/rust
that referenced
this pull request
Sep 5, 2019
Add a `Place::is_indirect` method to determine whether a `Place` contains a `Deref` projection Working on rust-lang#63860 requires tracking some property about each local. This requires differentiating `Place`s like `x` and `x.field[index]` from ones like `*x` and `*x.field`, since the first two will always access the same region of memory as `x` while the latter two may access any region of memory. This functionality is duplicated in various places across the compiler. This PR adds a helper method to `Place` which determines whether that `Place` has a `Deref` projection at any point and changes some existing code to use the new method. I've not converted `qualify_consts.rs` to use the new method, since it's not a trivial conversion and it will get replaced anyway by rust-lang#63860. There may be other potential uses besides the two I change in this PR. r? @oli-obk
Centril
added a commit
to Centril/rust
that referenced
this pull request
Sep 5, 2019
Add a `Place::is_indirect` method to determine whether a `Place` contains a `Deref` projection Working on rust-lang#63860 requires tracking some property about each local. This requires differentiating `Place`s like `x` and `x.field[index]` from ones like `*x` and `*x.field`, since the first two will always access the same region of memory as `x` while the latter two may access any region of memory. This functionality is duplicated in various places across the compiler. This PR adds a helper method to `Place` which determines whether that `Place` has a `Deref` projection at any point and changes some existing code to use the new method. I've not converted `qualify_consts.rs` to use the new method, since it's not a trivial conversion and it will get replaced anyway by rust-lang#63860. There may be other potential uses besides the two I change in this PR. r? @oli-obk
bors
added a commit
that referenced
this pull request
Sep 5, 2019
Rollup of 15 pull requests Successful merges: - #62860 (Stabilize checked_duration_since for 1.38.0) - #63549 (Rev::rposition counts from the wrong end) - #63985 (Stabilize pin_into_inner in 1.39.0) - #64005 (Add a `Place::is_indirect` method to determine whether a `Place` contains a `Deref` projection) - #64031 (Harden `param_attrs` test wrt. usage of a proc macro `#[attr]`) - #64038 (Check impl trait substs when checking for recursive types) - #64043 (Add some more tests for underscore imports) - #64092 (Update xLTO compatibility table in rustc book.) - #64110 (Refer to "`self` type" instead of "receiver type") - #64120 (Move path parsing earlier) - #64123 (Added warning around code with reference to uninit bytes) - #64128 (unused_parens: account for or-patterns and `&(mut x)`) - #64141 (Minimize uses of `LocalInternedString`) - #64142 (Fix doc links in `std::cmp` module) - #64148 (fix a few typos in comments) Failed merges: r? @ghost
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Working on #63860 requires tracking some property about each local. This requires differentiating
Places likexandx.field[index]from ones like*xand*x.field, since the first two will always access the same region of memory asxwhile the latter two may access any region of memory. This functionality is duplicated in various places across the compiler. This PR adds a helper method toPlacewhich determines whether thatPlacehas aDerefprojection at any point and changes some existing code to use the new method.I've not converted
qualify_consts.rsto use the new method, since it's not a trivial conversion and it will get replaced anyway by #63860. There may be other potential uses besides the two I change in this PR.r? @oli-obk