Skip to content

Commit b17b1a9

Browse files
authored
Merge pull request #41836 from glessard/sr15994
[stdlib] tolerate empty source buffers in `UMRBP.copyMemory`
2 parents 377cdc1 + cc60db7 commit b17b1a9

File tree

2 files changed

+27
-1
lines changed

2 files changed

+27
-1
lines changed

stdlib/public/core/UnsafeRawBufferPointer.swift.gyb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -439,7 +439,9 @@ extension Unsafe${Mutable}RawBufferPointer {
439439
public func copyMemory(from source: UnsafeRawBufferPointer) {
440440
_debugPrecondition(source.count <= self.count,
441441
"${Self}.copyMemory source has too many elements")
442-
baseAddress?.copyMemory(from: source.baseAddress!, byteCount: source.count)
442+
if let baseAddress = baseAddress, let sourceAddress = source.baseAddress {
443+
baseAddress.copyMemory(from: sourceAddress, byteCount: source.count)
444+
}
443445
}
444446

445447
/// Copies from a collection of `UInt8` into this buffer's memory.

validation-test/stdlib/UnsafeBufferPointer.swift.gyb

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,30 @@ ${SelfName}TestSuite.test("nilBaseAddress") {
179179
expectEqualSequence([], emptyBuffer)
180180
}
181181

182+
% if IsMutable:
183+
${SelfName}TestSuite.test("copyFromEmptyBuffer") {
184+
% if IsRaw:
185+
var memory: UnsafeMutableRawPointer
186+
let empty = UnsafeRawBufferPointer(start: nil, count: 0)
187+
% else:
188+
var memory: UnsafeMutablePointer<Float>
189+
let empty = UnsafeBufferPointer<Float>(start: nil, count: 0)
190+
% end
191+
192+
let count = 4
193+
memory = allocateFor${Raw}Buffer(count: count)
194+
defer { deallocateFor${Raw}Buffer(memory, count: count) }
195+
196+
let buffer = UnsafeMutable${Raw}BufferPointer(start: memory, count: count)
197+
198+
% if IsRaw:
199+
buffer.copyMemory(from: empty)
200+
% else:
201+
_ = buffer.initialize(from: empty)
202+
% end
203+
}
204+
% end
205+
182206
${SelfName}TestSuite.test("nonNilButEmpty") {
183207
let emptyAllocated = UnsafeMutablePointer<Float>.allocate(capacity: 0)
184208
defer { emptyAllocated.deallocate() }

0 commit comments

Comments
 (0)