+1

Charles

> On May 17, 2017, at 12:48 PM, Anders Kierulf via swift-evolution 
> <[email protected]> wrote:
> 
> I want to bring this up one last time in swift-evolution to give this issue a 
> chance to not fall through the cracks. Passing a value to UnsafeRawPointer 
> should not force that method to be mutating. Either the call should not 
> require &, or this use of & should not require the method to be mutating. The 
> workaround of copying to a temporary variable is not viable (see sample 
> project in SR-4649).
> 
> Hope there’s some way this issue can be addressed sooner rather than later.
> 
> Thanks,
>  Anders Kierulf
> 
>> On Apr 20, 2017, at 1:10 PM, Anders Kierulf <[email protected]> wrote:
>> 
>> Summary: Currently, only mutable values can be passed to UnsafeRawPointer, 
>> except for a special case for arrays. That special case should be 
>> generalized, allowing any values to be passed to UnsafeRawPointer without 
>> using &.
>> 
>> The following code shows the inconsistency in passing values to 
>> UnsafeRawPointer:
>> 
>> var varArray = [Int](repeating: 0, count: 6)
>> var varTuple = (0, 0, 0, 0, 0, 0)
>> 
>> let letArray = [Int](repeating: 0, count: 6)
>> let letTuple = (0, 0, 0, 0, 0, 0)
>> 
>> func get(_ pointer: UnsafeRawPointer, at index: Int) -> Int {
>>   let a = pointer.bindMemory(to: Int.self, capacity: 6)
>>   return a[index]
>> }
>> 
>> // Array can be passed directly, automatically takes address.
>> _ = get(varArray, at: 2) // okay
>> _ = get(letArray, at: 2) // okay
>> 
>> // When explicitly taking address, can only pass mutable variables.
>> _ = get(&varArray, at: 2) // okay, but seems inconsistent
>> _ = get(&letArray, at: 2) // fails: & not allowed
>> 
>> // Passing tuple instead of array fails.
>> _ = get(varTuple, at: 2) // fails: wrong type
>> _ = get(letTuple, at: 2) // fails: wrong type
>> 
>> // Adding & to pass a tuple only works for mutable values. Having to
>> // pass the address using & means that any methods calling this must
>> // be mutating, even though they don't mutate.
>> _ = get(&varTuple, at: 2) // okay, but forces mutating
>> _ = get(&letTuple, at: 2) // fails: cannot pass immutable value
>> 
>> Passing a value to an UnsafeRawPointer parameter should not require use of 
>> &, as that forces all code calling it to be mutating. Having a special case 
>> for array also doesn't make sense, as the idea of UnsafeRawPointer is that 
>> we're interpreting that memory content as whatever we want. Logged as 
>> SR-4649.
>> 
>> Proposal:
>> - Never require & when passing value to UnsafeRawPointer.
>> - Always require & when passing value to UnsafeMutableRawPointer.
>> 
>> (Fixed size arrays are still needed, but with this tweak, workarounds can be 
>> made to work.)
>> 
>> Anders Kierulf
>> 
> 
> _______________________________________________
> swift-evolution mailing list
> [email protected]
> https://lists.swift.org/mailman/listinfo/swift-evolution

_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to