diff --git a/include/swift/AST/KnownStdlibTypes.def b/include/swift/AST/KnownStdlibTypes.def index db44ec222a5bb..d8c772bf9c7da 100644 --- a/include/swift/AST/KnownStdlibTypes.def +++ b/include/swift/AST/KnownStdlibTypes.def @@ -76,6 +76,7 @@ KNOWN_STDLIB_TYPE_DECL(UnsafeRawPointer, NominalTypeDecl, 0) KNOWN_STDLIB_TYPE_DECL(UnsafeMutablePointer, NominalTypeDecl, 1) KNOWN_STDLIB_TYPE_DECL(UnsafePointer, NominalTypeDecl, 1) KNOWN_STDLIB_TYPE_DECL(OpaquePointer, NominalTypeDecl, 0) +KNOWN_STDLIB_TYPE_DECL(CVaListPointer, NominalTypeDecl, 0) KNOWN_STDLIB_TYPE_DECL(AutoreleasingUnsafeMutablePointer, NominalTypeDecl, 1) KNOWN_STDLIB_TYPE_DECL(UnsafeBufferPointer, NominalTypeDecl, 1) diff --git a/stdlib/public/core/BridgeObjectiveC.swift b/stdlib/public/core/BridgeObjectiveC.swift index 7c540ea68c69c..c3762cf304ab1 100644 --- a/stdlib/public/core/BridgeObjectiveC.swift +++ b/stdlib/public/core/BridgeObjectiveC.swift @@ -589,7 +589,8 @@ extension UnsafeRawPointer { } } -extension AutoreleasingUnsafeMutablePointer { } +@available(*, unavailable) +extension AutoreleasingUnsafeMutablePointer: Sendable { } internal struct _CocoaFastEnumerationStackBuf { // Clang uses 16 pointers. So do we. diff --git a/stdlib/public/core/CTypes.swift b/stdlib/public/core/CTypes.swift index c4c6f4e1e6802..f5de16da076b8 100644 --- a/stdlib/public/core/CTypes.swift +++ b/stdlib/public/core/CTypes.swift @@ -211,6 +211,9 @@ extension OpaquePointer: Hashable { } } +@available(*, unavailable) +extension OpaquePointer : Sendable { } + @_unavailableInEmbedded extension OpaquePointer: CustomDebugStringConvertible { /// A textual representation of the pointer, suitable for debugging. @@ -304,6 +307,9 @@ extension CVaListPointer: CustomDebugStringConvertible { #endif +@available(*, unavailable) +extension CVaListPointer: Sendable { } + /// Copy `size` bytes of memory from `src` into `dest`. /// /// The memory regions `src..: _Pointer { )._unsafelyUnwrappedUnchecked } } + +@available(*, unavailable) +extension UnsafePointer: Sendable { } +@available(*, unavailable) +extension UnsafeMutablePointer: Sendable { } diff --git a/stdlib/public/core/UnsafeRawBufferPointer.swift.gyb b/stdlib/public/core/UnsafeRawBufferPointer.swift.gyb index 6e51cf125e353..2ba654a4e64ee 100644 --- a/stdlib/public/core/UnsafeRawBufferPointer.swift.gyb +++ b/stdlib/public/core/UnsafeRawBufferPointer.swift.gyb @@ -1304,6 +1304,14 @@ public func _withUnprotectedUnsafeBytes( return try body(buffer) } +@available(*, unavailable) +extension UnsafeRawBufferPointer: Sendable { } +@available(*, unavailable) +extension UnsafeRawBufferPointer.Iterator: Sendable { } +@available(*, unavailable) +extension UnsafeMutableRawBufferPointer: Sendable { } + + // ${'Local Variables'}: // eval: (read-only-mode 1) // End: diff --git a/stdlib/public/core/UnsafeRawPointer.swift b/stdlib/public/core/UnsafeRawPointer.swift index f4784cd9dfd7c..813dbaea25f3a 100644 --- a/stdlib/public/core/UnsafeRawPointer.swift +++ b/stdlib/public/core/UnsafeRawPointer.swift @@ -1486,3 +1486,8 @@ extension OpaquePointer { self._rawValue = unwrapped._rawValue } } + +@available(*, unavailable) +extension UnsafeRawPointer: Sendable { } +@available(*, unavailable) +extension UnsafeMutableRawPointer: Sendable { } diff --git a/test/Concurrency/sendable_checking.swift b/test/Concurrency/sendable_checking.swift index 81d58d9b5591b..b4b719ab7d291 100644 --- a/test/Concurrency/sendable_checking.swift +++ b/test/Concurrency/sendable_checking.swift @@ -318,3 +318,36 @@ func testLocalCaptures() { // expected-complete-and-sns-warning@-1 {{capture of 'ns' with non-sendable type 'NonSendable' in a `@Sendable` local function}} } } + +func testPointersAreNotSendable() { + func testSendable(_: T) {} + + func testUnsafePointer(ptr: UnsafePointer, + mutablePtr: UnsafeMutablePointer) { + testSendable(ptr) // expected-warning {{conformance of 'UnsafePointer' to 'Sendable' is unavailable}} + testSendable(mutablePtr) // expected-warning {{conformance of 'UnsafeMutablePointer' to 'Sendable' is unavailable}} + } + + func testRawPointer(ptr: UnsafeRawPointer, + mutablePtr: UnsafeMutableRawPointer) { + testSendable(ptr) // expected-warning {{conformance of 'UnsafeRawPointer' to 'Sendable' is unavailable}} + testSendable(mutablePtr) // expected-warning {{conformance of 'UnsafeMutableRawPointer' to 'Sendable' is unavailable}} + } + + func testOpaqueAndCPointers(opaquePtr: OpaquePointer, cPtr: CVaListPointer, autoReleasePtr: AutoreleasingUnsafeMutablePointer) { + testSendable(opaquePtr) // expected-warning {{conformance of 'OpaquePointer' to 'Sendable' is unavailable}} + testSendable(cPtr) // expected-warning {{conformance of 'CVaListPointer' to 'Sendable' is unavailable}} + testSendable(autoReleasePtr) // expected-warning {{conformance of 'AutoreleasingUnsafeMutablePointer' to 'Sendable' is unavailable}} + } + + func testBufferPointers(buffer: UnsafeBufferPointer, mutableBuffer: UnsafeMutableBufferPointer, + rawBuffer: UnsafeRawBufferPointer, rawMutableBuffer: UnsafeMutableRawBufferPointer) { + testSendable(buffer) // expected-warning {{conformance of 'UnsafeBufferPointer' to 'Sendable' is unavailable}} + testSendable(mutableBuffer) // expected-warning {{conformance of 'UnsafeMutableBufferPointer' to 'Sendable' is unavailable}} + testSendable(buffer.makeIterator()) // expected-warning {{conformance of 'UnsafeBufferPointer.Iterator' to 'Sendable' is unavailable}} + testSendable(rawBuffer) // expected-warning {{conformance of 'UnsafeRawBufferPointer' to 'Sendable' is unavailable}} + testSendable(rawBuffer.makeIterator()) // expected-warning {{conformance of 'UnsafeRawBufferPointer.Iterator' to 'Sendable' is unavailable}} + testSendable(rawMutableBuffer) // expected-warning {{conformance of 'UnsafeMutableRawBufferPointer' to 'Sendable' is unavailable}} + testSendable(rawMutableBuffer.makeIterator()) // expected-warning {{conformance of 'UnsafeRawBufferPointer.Iterator' to 'Sendable' is unavailable}} + } +}