Fix two problems with withoutActuallyEscaping
#78885
Merged
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.
1. let
withoutActuallyEscaping
also catch an escaping closure in the throwing case.withoutActuallyEscaping
checks that the passed closure has not beed escaped by ensuring that its reference count is exactly 1 at the end of the code block.So far this was only done in the regular return case. But if the code block throws, the check was not done.
Fixes an undetected undefined behavior.
2. replace the
is_escaping_closure
instruction withdestroy_not_escaped_closure
The problem with
is_escaping_closure
was that it didn't consume its operand and therefore reference count checks were unreliable.For example, copy-propagation could break it.
As this instruction was always used together with an immediately following
destroy_value
of the closure, it makes sense to combine both into adestroy_not_escaped_closure
.It
This is part of rdar://140229560.