[SILGen] Don't assume physical lvalue components are side effect free #14410
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.
When emitting an ignored expression (such as the argument to
type(of:)
), we try not perform a load of an lvalue if we can prove that loading has no observable side effects. Previously we based this on whether the components of the lvalue are physical, however some physical components, such as force unwrapping and key-paths, have side effects (the former can trap, the latter can call arbitrary getters & setters).This PR introduces and uses a new method to determine whether a component has side effects, meaning that ignored expressions with e.g force unwrap and key-path lvalue components (see SR-1327 for examples) will have their side effects correctly evaluated.
In addition, this PR adds an additional case to
emitIgnoredExpr
to avoid loading in cases where we have a force unwrap of an lvalue load (instead, if possible, try to emit the precondition using the lvalue address).Resolves SR-1327.