swift
2c988634 - Fix MutableSpan exclusive access to unsafe pointers

Commit
76 days ago
Fix MutableSpan exclusive access to unsafe pointers This fix enables exclusive access to a MutableSpan created from an UnsafeMutablePointer. The compiler has a special case that allows MutableSpan to depend on a mutable pointer *without* extending that pointer's access scope. That lets us implement standard library code like this: mutating public func extracting(droppingLast k: Int) -> Self { //... let newSpan = unsafe Self(_unchecked: _pointer, byteCount: newCount) return unsafe _overrideLifetime(newSpan, mutating: &self) Refine this special case so that is does not apply to inout parameters where the programmer has an expectation that the unsafe pointer is not copied when being passed as an argument. Now, we safely get an exclusivity violation when creating two mutable spans from the same pointer field: @lifetime(&self) mutating func getSpan() -> MutableSpan<T> { let span1 = makeMutableSpan(&self.pointer) let span2 = makeMutableSpan(&self.pointer) // ERROR: overlapping access return span1 } If we don't fix this now, it will likely be source breaking in the future. Fixes rdar://153745332 (Swift allows constructing two MutableSpans to the same underlying pointer) (cherry picked from commit 7c5d4b8b6dfcc3e52629bf3f8b8512de3f89eaed) --- CCC --- Explanation: Fix MutableSpan exclusive access to unsafe pointers This fix enables exclusive access to a MutableSpan created from an UnsafeMutablePointer. Scope: Affects users of MutableSpan when initializing them from an unsafe pointer. Radar/SR Issue: rdar://153745332 (Swift allows constructing two MutableSpans to the same underlying pointer) main PR: https://github.com/swiftlang/swift/pull/82450 Risk: Low. This only affects users of an API that requires lifetime dependence. Without using an experimental feature, this only applies to the initializers of Mutable[Raw]Span. Testing: Added source-level unit tests Reviewer: TBD
Author
Committer
Parents
Loading