Skip to content

Commit 51e3b64

Browse files
authored
Merge pull request #69136 from xedin/rdar-101980108-5.10
[5.10][SE-0331][stdlib] Mark unsafe pointer conformances to Sendable as explicitly unavailable
2 parents 3b81d27 + 936cad0 commit 51e3b64

File tree

8 files changed

+66
-1
lines changed

8 files changed

+66
-1
lines changed

include/swift/AST/KnownStdlibTypes.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ KNOWN_STDLIB_TYPE_DECL(UnsafeRawPointer, NominalTypeDecl, 0)
7676
KNOWN_STDLIB_TYPE_DECL(UnsafeMutablePointer, NominalTypeDecl, 1)
7777
KNOWN_STDLIB_TYPE_DECL(UnsafePointer, NominalTypeDecl, 1)
7878
KNOWN_STDLIB_TYPE_DECL(OpaquePointer, NominalTypeDecl, 0)
79+
KNOWN_STDLIB_TYPE_DECL(CVaListPointer, NominalTypeDecl, 0)
7980
KNOWN_STDLIB_TYPE_DECL(AutoreleasingUnsafeMutablePointer, NominalTypeDecl, 1)
8081

8182
KNOWN_STDLIB_TYPE_DECL(UnsafeBufferPointer, NominalTypeDecl, 1)

stdlib/public/core/BridgeObjectiveC.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -589,7 +589,8 @@ extension UnsafeRawPointer {
589589
}
590590
}
591591

592-
extension AutoreleasingUnsafeMutablePointer { }
592+
@available(*, unavailable)
593+
extension AutoreleasingUnsafeMutablePointer: Sendable { }
593594

594595
internal struct _CocoaFastEnumerationStackBuf {
595596
// Clang uses 16 pointers. So do we.

stdlib/public/core/CTypes.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,9 @@ extension OpaquePointer: Hashable {
207207
}
208208
}
209209

210+
@available(*, unavailable)
211+
extension OpaquePointer : Sendable { }
212+
210213
extension OpaquePointer: CustomDebugStringConvertible {
211214
/// A textual representation of the pointer, suitable for debugging.
212215
public var debugDescription: String {
@@ -297,6 +300,9 @@ extension CVaListPointer: CustomDebugStringConvertible {
297300

298301
#endif
299302

303+
@available(*, unavailable)
304+
extension CVaListPointer: Sendable { }
305+
300306
/// Copy `size` bytes of memory from `src` into `dest`.
301307
///
302308
/// The memory regions `src..<src + size` and

stdlib/public/core/UnsafeBufferPointer.swift.gyb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1197,8 +1197,14 @@ extension Unsafe${Mutable}BufferPointer: CustomDebugStringConvertible {
11971197
+ "(start: \(_position.map(String.init(describing:)) ?? "nil"), count: \(count))"
11981198
}
11991199
}
1200+
1201+
@available(*, unavailable)
1202+
extension Unsafe${Mutable}BufferPointer: Sendable { }
12001203
%end
12011204

1205+
@available(*, unavailable)
1206+
extension UnsafeBufferPointer.Iterator: Sendable { }
1207+
12021208

12031209
// ${'Local Variables'}:
12041210
// eval: (read-only-mode 1)

stdlib/public/core/UnsafePointer.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1172,3 +1172,8 @@ public struct UnsafeMutablePointer<Pointee>: _Pointer {
11721172
)._unsafelyUnwrappedUnchecked
11731173
}
11741174
}
1175+
1176+
@available(*, unavailable)
1177+
extension UnsafePointer: Sendable { }
1178+
@available(*, unavailable)
1179+
extension UnsafeMutablePointer: Sendable { }

stdlib/public/core/UnsafeRawBufferPointer.swift.gyb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1303,6 +1303,14 @@ public func _withUnprotectedUnsafeBytes<T, Result>(
13031303
return try body(buffer)
13041304
}
13051305

1306+
@available(*, unavailable)
1307+
extension UnsafeRawBufferPointer: Sendable { }
1308+
@available(*, unavailable)
1309+
extension UnsafeRawBufferPointer.Iterator: Sendable { }
1310+
@available(*, unavailable)
1311+
extension UnsafeMutableRawBufferPointer: Sendable { }
1312+
1313+
13061314
// ${'Local Variables'}:
13071315
// eval: (read-only-mode 1)
13081316
// End:

stdlib/public/core/UnsafeRawPointer.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1486,3 +1486,8 @@ extension OpaquePointer {
14861486
self._rawValue = unwrapped._rawValue
14871487
}
14881488
}
1489+
1490+
@available(*, unavailable)
1491+
extension UnsafeRawPointer: Sendable { }
1492+
@available(*, unavailable)
1493+
extension UnsafeMutableRawPointer: Sendable { }

test/Concurrency/sendable_checking.swift

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,3 +316,36 @@ func testLocalCaptures() {
316316
// expected-complete-and-sns-warning@-1 {{capture of 'ns' with non-sendable type 'NonSendable' in a `@Sendable` local function}}
317317
}
318318
}
319+
320+
func testPointersAreNotSendable() {
321+
func testSendable<T: Sendable>(_: T) {}
322+
323+
func testUnsafePointer(ptr: UnsafePointer<Int>,
324+
mutablePtr: UnsafeMutablePointer<String>) {
325+
testSendable(ptr) // expected-warning {{conformance of 'UnsafePointer<Pointee>' to 'Sendable' is unavailable}}
326+
testSendable(mutablePtr) // expected-warning {{conformance of 'UnsafeMutablePointer<Pointee>' to 'Sendable' is unavailable}}
327+
}
328+
329+
func testRawPointer(ptr: UnsafeRawPointer,
330+
mutablePtr: UnsafeMutableRawPointer) {
331+
testSendable(ptr) // expected-warning {{conformance of 'UnsafeRawPointer' to 'Sendable' is unavailable}}
332+
testSendable(mutablePtr) // expected-warning {{conformance of 'UnsafeMutableRawPointer' to 'Sendable' is unavailable}}
333+
}
334+
335+
func testOpaqueAndCPointers(opaquePtr: OpaquePointer, cPtr: CVaListPointer, autoReleasePtr: AutoreleasingUnsafeMutablePointer<Int>) {
336+
testSendable(opaquePtr) // expected-warning {{conformance of 'OpaquePointer' to 'Sendable' is unavailable}}
337+
testSendable(cPtr) // expected-warning {{conformance of 'CVaListPointer' to 'Sendable' is unavailable}}
338+
testSendable(autoReleasePtr) // expected-warning {{conformance of 'AutoreleasingUnsafeMutablePointer<Pointee>' to 'Sendable' is unavailable}}
339+
}
340+
341+
func testBufferPointers(buffer: UnsafeBufferPointer<Int>, mutableBuffer: UnsafeMutableBufferPointer<Int>,
342+
rawBuffer: UnsafeRawBufferPointer, rawMutableBuffer: UnsafeMutableRawBufferPointer) {
343+
testSendable(buffer) // expected-warning {{conformance of 'UnsafeBufferPointer<Element>' to 'Sendable' is unavailable}}
344+
testSendable(mutableBuffer) // expected-warning {{conformance of 'UnsafeMutableBufferPointer<Element>' to 'Sendable' is unavailable}}
345+
testSendable(buffer.makeIterator()) // expected-warning {{conformance of 'UnsafeBufferPointer<Element>.Iterator' to 'Sendable' is unavailable}}
346+
testSendable(rawBuffer) // expected-warning {{conformance of 'UnsafeRawBufferPointer' to 'Sendable' is unavailable}}
347+
testSendable(rawBuffer.makeIterator()) // expected-warning {{conformance of 'UnsafeRawBufferPointer.Iterator' to 'Sendable' is unavailable}}
348+
testSendable(rawMutableBuffer) // expected-warning {{conformance of 'UnsafeMutableRawBufferPointer' to 'Sendable' is unavailable}}
349+
testSendable(rawMutableBuffer.makeIterator()) // expected-warning {{conformance of 'UnsafeRawBufferPointer.Iterator' to 'Sendable' is unavailable}}
350+
}
351+
}

0 commit comments

Comments
 (0)