mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Disallow implicit conversion or arguments from Array, String, and InOut (formed by &) to pointer types if the argument is for an @autoclosure parameter. These conversions were really only intended to be used for C/ObjC interop, and in some contexts like autoclosures they are not safe. Fixes: rdar://problem/31538995
50 lines
1.5 KiB
Swift
50 lines
1.5 KiB
Swift
// RUN: %target-typecheck-verify-swift
|
|
|
|
func takesAutoclosure<T>(_ lhs: T, _ rhs: @autoclosure () throws -> T) {}
|
|
func takesUnsafeRawPointer(_ ptr: UnsafeRawPointer) {}
|
|
func takesUnsafeMutableRawPointer(_ ptr: UnsafeMutableRawPointer) {}
|
|
func takesUnsafePointer<T>(_ ptr: UnsafePointer<T>) {}
|
|
func takesUnsafeMutablePointer<T>(_ ptr: UnsafeMutablePointer<T>) {}
|
|
func takesUnsafePointerInt8(_ ptr: UnsafePointer<Int8>) {}
|
|
func takesUnsafePointerUInt8(_ ptr: UnsafePointer<UInt8>) {}
|
|
func takesUnsafePointerVoid(_ ptr: UnsafePointer<Void>) {} // expected-warning {{UnsafePointer<Void> has been replaced by UnsafeRawPointer}}
|
|
|
|
func test(
|
|
_ rawPtr: UnsafeRawPointer,
|
|
_ mutRawPtr: UnsafeMutableRawPointer,
|
|
_ mutPtr: UnsafeMutablePointer<Int>,
|
|
_ ptr: UnsafePointer<Int>
|
|
) {
|
|
var i: Int = 0
|
|
var a: [Int] = [0]
|
|
let s = "string"
|
|
|
|
takesUnsafeRawPointer(&i)
|
|
takesUnsafeMutableRawPointer(&i)
|
|
takesUnsafeMutablePointer(&i)
|
|
takesUnsafePointer(&i)
|
|
takesUnsafeRawPointer(&a)
|
|
takesUnsafeMutableRawPointer(&a)
|
|
takesUnsafeMutablePointer(&a)
|
|
takesUnsafePointer(&a)
|
|
|
|
takesUnsafeRawPointer(mutPtr)
|
|
takesUnsafeMutableRawPointer(mutPtr)
|
|
takesUnsafePointer(mutPtr)
|
|
|
|
takesUnsafeRawPointer(mutRawPtr)
|
|
|
|
takesUnsafeRawPointer(a)
|
|
takesUnsafePointer(a)
|
|
|
|
takesAutoclosure(rawPtr, mutPtr)
|
|
takesAutoclosure(mutRawPtr, mutPtr)
|
|
takesAutoclosure(ptr, mutPtr)
|
|
takesAutoclosure(rawPtr, mutRawPtr)
|
|
|
|
takesUnsafeRawPointer(s)
|
|
takesUnsafePointerInt8(s)
|
|
takesUnsafePointerUInt8(s)
|
|
takesUnsafePointerVoid(s)
|
|
}
|