[swift-evolution] Proposed amendment to SE-0138: Normalize UnsafeRawBufferPointer Slices

Andrew Trick atrick at apple.com
Mon Mar 20 21:21:21 CDT 2017

This proposal amends SE-0138: Normalize UnsafeRawBufferPointer Slices
to fix a design bug: https://github.com/apple/swift-evolution/pull/651

The issue was discussed on swift-evolution in Nov/Dec:
See [swift-evolution] [Pitch] Normalize Slice Types for Unsafe Buffers

The implementation of this fix is in PR #8222:

Fix: Change Unsafe[Mutable]RawBufferPointer's SubSequence type

Original: Unsafe[Mutable]RawBufferPointer.SubSequence = Unsafe[Mutable]RawBufferPointer

Fixed: Unsafe[Mutable]RawBufferPointer.SubSequence = [Mutable]RandomAccessSlice<Unsafe[Mutable]RawBufferPointer>

This is a source breaking bug fix that only applies to
post-3.0.1. It's extremely unlikely that any Swift 3 code would rely
on the SubSequence type beyond the simple use case of passing a
raw buffer subrange to an another raw buffer argument:


A diagnostic message now instructs users to convert the slice to a
buffer using a `rebasing` initializer:

`takesRawBuffer(UnsafeRawBufferPointer(rebasing: buffer[i..<j]))`

To support this, the following `rebasing` initializers are added:

extension UnsafeRawBufferPointer {
  public init(rebasing slice: RandomAccessSlice<UnsafeRawBufferPointer>)
  public init(
    rebasing slice: MutableRandomAccessSlice<UnsafeMutableRawBufferPointer>

extension UnsafeMutableRawBufferPointer {
  public init(
    rebasing slice: MutableRandomAccessSlice<UnsafeMutableRawBufferPointer>

The source compatibility test builds are unnaffected by this change.


More information about the swift-evolution mailing list