Allow field(0) projection as a no-op when target value is a PtrLocal #871
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.
The change in #811 allows pointer casts between pointers to data and pointers to "transparent wrapper structs" containing one field with the same data. While the code tries to insert
field(0, _)projections when casting, this remediation falls short when the cast pointer is of a second degree, i.e., a pointer to a pointer.An example of this can be observed in
Iterator<_>::next, where a pointer**Tis cast to a pointer*NonNull<T>,NonNullbeing one of these "transparent wrapper structs".The proposed code change allows for a
field(0, _)projection to be treated as a No-Op when applied to a non-aggregate (nor union), specifically aPtrLocalfor the case ofnext().This fixes
iter.next()for cases whereSome(element)is returned. The case where it returnsNoneis a separate issue tested but not fixed here.