Skip to content

Commit b853189

Browse files
authored
Merge pull request #69114 from xedin/rdar-101980108
[SE-0331][stdlib] Mark unsafe pointer conformances to Sendable as explicitly unavailable
2 parents 82272c8 + 445b9c7 commit b853189

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
@@ -211,6 +211,9 @@ extension OpaquePointer: Hashable {
211211
}
212212
}
213213

214+
@available(*, unavailable)
215+
extension OpaquePointer : Sendable { }
216+
214217
@_unavailableInEmbedded
215218
extension OpaquePointer: CustomDebugStringConvertible {
216219
/// A textual representation of the pointer, suitable for debugging.
@@ -304,6 +307,9 @@ extension CVaListPointer: CustomDebugStringConvertible {
304307

305308
#endif
306309

310+
@available(*, unavailable)
311+
extension CVaListPointer: Sendable { }
312+
307313
/// Copy `size` bytes of memory from `src` into `dest`.
308314
///
309315
/// 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
@@ -1198,8 +1198,14 @@ extension Unsafe${Mutable}BufferPointer: CustomDebugStringConvertible {
11981198
+ "(start: \(_position.map(String.init(describing:)) ?? "nil"), count: \(count))"
11991199
}
12001200
}
1201+
1202+
@available(*, unavailable)
1203+
extension Unsafe${Mutable}BufferPointer: Sendable { }
12011204
%end
12021205

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

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

stdlib/public/core/UnsafePointer.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1175,3 +1175,8 @@ public struct UnsafeMutablePointer<Pointee>: _Pointer {
11751175
)._unsafelyUnwrappedUnchecked
11761176
}
11771177
}
1178+
1179+
@available(*, unavailable)
1180+
extension UnsafePointer: Sendable { }
1181+
@available(*, unavailable)
1182+
extension UnsafeMutablePointer: Sendable { }

stdlib/public/core/UnsafeRawBufferPointer.swift.gyb

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

1307+
@available(*, unavailable)
1308+
extension UnsafeRawBufferPointer: Sendable { }
1309+
@available(*, unavailable)
1310+
extension UnsafeRawBufferPointer.Iterator: Sendable { }
1311+
@available(*, unavailable)
1312+
extension UnsafeMutableRawBufferPointer: Sendable { }
1313+
1314+
13071315
// ${'Local Variables'}:
13081316
// eval: (read-only-mode 1)
13091317
// 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
@@ -318,3 +318,36 @@ func testLocalCaptures() {
318318
// expected-complete-and-sns-warning@-1 {{capture of 'ns' with non-sendable type 'NonSendable' in a `@Sendable` local function}}
319319
}
320320
}
321+
322+
func testPointersAreNotSendable() {
323+
func testSendable<T: Sendable>(_: T) {}
324+
325+
func testUnsafePointer(ptr: UnsafePointer<Int>,
326+
mutablePtr: UnsafeMutablePointer<String>) {
327+
testSendable(ptr) // expected-warning {{conformance of 'UnsafePointer<Pointee>' to 'Sendable' is unavailable}}
328+
testSendable(mutablePtr) // expected-warning {{conformance of 'UnsafeMutablePointer<Pointee>' to 'Sendable' is unavailable}}
329+
}
330+
331+
func testRawPointer(ptr: UnsafeRawPointer,
332+
mutablePtr: UnsafeMutableRawPointer) {
333+
testSendable(ptr) // expected-warning {{conformance of 'UnsafeRawPointer' to 'Sendable' is unavailable}}
334+
testSendable(mutablePtr) // expected-warning {{conformance of 'UnsafeMutableRawPointer' to 'Sendable' is unavailable}}
335+
}
336+
337+
func testOpaqueAndCPointers(opaquePtr: OpaquePointer, cPtr: CVaListPointer, autoReleasePtr: AutoreleasingUnsafeMutablePointer<Int>) {
338+
testSendable(opaquePtr) // expected-warning {{conformance of 'OpaquePointer' to 'Sendable' is unavailable}}
339+
testSendable(cPtr) // expected-warning {{conformance of 'CVaListPointer' to 'Sendable' is unavailable}}
340+
testSendable(autoReleasePtr) // expected-warning {{conformance of 'AutoreleasingUnsafeMutablePointer<Pointee>' to 'Sendable' is unavailable}}
341+
}
342+
343+
func testBufferPointers(buffer: UnsafeBufferPointer<Int>, mutableBuffer: UnsafeMutableBufferPointer<Int>,
344+
rawBuffer: UnsafeRawBufferPointer, rawMutableBuffer: UnsafeMutableRawBufferPointer) {
345+
testSendable(buffer) // expected-warning {{conformance of 'UnsafeBufferPointer<Element>' to 'Sendable' is unavailable}}
346+
testSendable(mutableBuffer) // expected-warning {{conformance of 'UnsafeMutableBufferPointer<Element>' to 'Sendable' is unavailable}}
347+
testSendable(buffer.makeIterator()) // expected-warning {{conformance of 'UnsafeBufferPointer<Element>.Iterator' to 'Sendable' is unavailable}}
348+
testSendable(rawBuffer) // expected-warning {{conformance of 'UnsafeRawBufferPointer' to 'Sendable' is unavailable}}
349+
testSendable(rawBuffer.makeIterator()) // expected-warning {{conformance of 'UnsafeRawBufferPointer.Iterator' to 'Sendable' is unavailable}}
350+
testSendable(rawMutableBuffer) // expected-warning {{conformance of 'UnsafeMutableRawBufferPointer' to 'Sendable' is unavailable}}
351+
testSendable(rawMutableBuffer.makeIterator()) // expected-warning {{conformance of 'UnsafeRawBufferPointer.Iterator' to 'Sendable' is unavailable}}
352+
}
353+
}

0 commit comments

Comments
 (0)