Skip to content

Commit d806ee1

Browse files
authored
Merge pull request #84386 from glessard/rdar160885820
[stdlib] fix MutableSpan’s Sendable conformance
2 parents 4dd71a4 + 0828ec9 commit d806ee1

File tree

7 files changed

+62
-3
lines changed

7 files changed

+62
-3
lines changed

stdlib/public/core/Span/MutableSpan.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public struct MutableSpan<Element: ~Copyable>
5656

5757
@available(SwiftCompatibilitySpan 5.0, *)
5858
@_originallyDefinedIn(module: "Swift;CompatibilitySpan", SwiftCompatibilitySpan 6.2)
59-
extension MutableSpan: @unchecked Sendable where Element: Sendable {}
59+
extension MutableSpan: @unchecked Sendable where Element: Sendable & ~Copyable {}
6060

6161
@available(SwiftCompatibilitySpan 5.0, *)
6262
@_originallyDefinedIn(module: "Swift;CompatibilitySpan", SwiftCompatibilitySpan 6.2)

test/stdlib/Span/MutableRawSpanTests.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -554,3 +554,14 @@ suite.test("MutableRawSpan from UnsafeMutableRawBufferPointer")
554554
let v = b.load(fromByteOffset: 8, as: Int64.self)
555555
expectNotEqual(v, 1)
556556
}
557+
558+
private func send(_: borrowing some Sendable & ~Copyable & ~Escapable) {}
559+
560+
suite.test("MutableRawSpan Sendability")
561+
.require(.stdlib_6_2).code {
562+
let buffer = UnsafeMutableRawBufferPointer.allocate(byteCount: 1, alignment: 2)
563+
defer { buffer.deallocate() }
564+
565+
let span = MutableRawSpan(_unsafeBytes: buffer)
566+
send(span)
567+
}

test/stdlib/Span/MutableSpanTests.swift

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -630,3 +630,18 @@ suite.test("MutableSpan from UnsafeMutableBufferPointer")
630630

631631
expectTrue(b.elementsEqual((0..<capacity).reversed()))
632632
}
633+
634+
private func send(_: borrowing some Sendable & ~Copyable & ~Escapable) {}
635+
636+
private struct NCSendable: ~Copyable, Sendable {}
637+
638+
suite.test("MutableSpan Sendability")
639+
.require(.stdlib_6_2).code {
640+
let buffer = UnsafeMutableBufferPointer<NCSendable>.allocate(capacity: 1)
641+
defer { buffer.deallocate() }
642+
buffer.initializeElement(at: 0, to: NCSendable())
643+
defer { buffer.deinitialize() }
644+
645+
let span = MutableSpan(_unsafeElements: buffer)
646+
send(span)
647+
}

test/stdlib/Span/OutputRawSpanTests.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,3 +153,14 @@ suite.test("deinitialize buffer")
153153
expectTrue(false)
154154
}
155155
}
156+
157+
private func send(_: borrowing some Sendable & ~Copyable & ~Escapable) {}
158+
159+
suite.test("OutputRawSpan Sendability")
160+
.require(.stdlib_6_2).code {
161+
let buffer = UnsafeMutableRawBufferPointer.allocate(byteCount: 1, alignment: 2)
162+
defer { buffer.deallocate() }
163+
164+
let span = OutputRawSpan(buffer: buffer, initializedCount: 0)
165+
send(span)
166+
}

test/stdlib/Span/OutputSpanTests.swift

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,3 +262,16 @@ suite.test("InlineArray initialization throws")
262262
expectEqual(I.count, 0)
263263
}
264264
}
265+
266+
private func send(_: borrowing some Sendable & ~Copyable & ~Escapable) {}
267+
268+
private struct NCSendable: ~Copyable, Sendable {}
269+
270+
suite.test("OutputSpan Sendability")
271+
.require(.stdlib_6_2).code {
272+
let buffer = UnsafeMutableBufferPointer<NCSendable>.allocate(capacity: 1)
273+
defer { buffer.deallocate() }
274+
275+
let span = OutputSpan(buffer: buffer, initializedCount: 0)
276+
send(span)
277+
}

test/stdlib/Span/RawSpanTests.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -331,3 +331,14 @@ suite.test("byteOffsets(of:)")
331331
bounds = nilSpan.byteOffsets(of: nilSpan)
332332
expectEqual(bounds, 0..<0)
333333
}
334+
335+
private func send(_: borrowing some Sendable & ~Copyable & ~Escapable) {}
336+
337+
suite.test("RawSpan Sendability")
338+
.require(.stdlib_6_2).code {
339+
let buffer = UnsafeMutableRawBufferPointer.allocate(byteCount: 1, alignment: 2)
340+
defer { buffer.deallocate() }
341+
342+
let span = RawSpan(_unsafeBytes: buffer)
343+
send(span)
344+
}

test/stdlib/Span/SpanTests.swift

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -599,8 +599,6 @@ private struct NCSendable: ~Copyable, Sendable {}
599599

600600
suite.test("Span Sendability")
601601
.require(.stdlib_6_2).code {
602-
guard #available(SwiftStdlib 6.2, *) else { return }
603-
604602
let buffer = UnsafeMutableBufferPointer<NCSendable>.allocate(capacity: 1)
605603
defer { buffer.deallocate() }
606604
buffer.initializeElement(at: 0, to: NCSendable())

0 commit comments

Comments
 (0)