mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
This bug is caused by a quirk in the API of the linear lifetime checker. Specifically, even though valueHasLinearLifetime is passed a SILValue (the value whose lifetime one is checking), really it doesnt care about that value (except for error diagnostics). Really it just cares about the parent block of the value since it assumes that the value is guaranteed to dominate all uses. This creates a footgun when if one is writing code using "generic ossa/non-ossa" routines on SILBuilder (the emit*Operation methods), if one in non-ossa code calls that function, it returns the input value of the strong_retain. This causes the linear lifetime error, to use the parent block of the argument of the retain, instead of the parent block of the retain itself. This then causes it to find the wrong leaking blocks and thus insert destroys in the wrong places. I fix this problem in this commit by noting that the partial apply is our original insertion point for the copy, so of course it is going to be in the same block. So I changed the linear lifetime checker to check for leaks with respect to the partial applies result. In a subsequent commit, I am going to add a new API on top of this that is based around the use of the value by the partial apply (maybe extendLifetimeFromUseToInsertionPoint?). By using the use, it will express in code more clearly what is happening here and will insert the copy for you. rdar://54234011
1.8 KiB
1.8 KiB