// RUN: %target-typecheck-verify-swift // Test availability attributes on UnsafePointer initializers. // Assume the original source contains no UnsafeRawPointer types. func unsafePointerConversionAvailability( mrp: UnsafeMutableRawPointer, rp: UnsafeRawPointer, umpv: UnsafeMutablePointer, // expected-warning {{UnsafeMutablePointer has been replaced by UnsafeMutableRawPointer}} upv: UnsafePointer, // expected-warning {{UnsafePointer has been replaced by UnsafeRawPointer}} umpi: UnsafeMutablePointer, upi: UnsafePointer, umps: UnsafeMutablePointer, ups: UnsafePointer) { let omrp: UnsafeMutableRawPointer? = mrp let orp: UnsafeRawPointer? = rp let oumpv: UnsafeMutablePointer = umpv // expected-warning {{UnsafeMutablePointer has been replaced by UnsafeMutableRawPointer}} let oupv: UnsafePointer? = upv // expected-warning {{UnsafePointer has been replaced by UnsafeRawPointer}} let oumpi: UnsafeMutablePointer? = umpi let oupi: UnsafePointer? = upi let oumps: UnsafeMutablePointer? = umps let oups: UnsafePointer? = ups _ = UnsafeMutableRawPointer(mrp) _ = UnsafeMutableRawPointer(rp) // expected-error {{'init(_:)' has been renamed to 'init(mutating:)'}} _ = UnsafeMutableRawPointer(umpv) _ = UnsafeMutableRawPointer(upv) // expected-error {{'init(_:)' has been renamed to 'init(mutating:)'}} _ = UnsafeMutableRawPointer(umpi) _ = UnsafeMutableRawPointer(upi) // expected-error {{'init(_:)' has been renamed to 'init(mutating:)'}} _ = UnsafeMutableRawPointer(umps) _ = UnsafeMutableRawPointer(ups) // expected-error {{'init(_:)' has been renamed to 'init(mutating:)'}} _ = UnsafeMutableRawPointer(omrp) _ = UnsafeMutableRawPointer(orp) // expected-error {{'init(_:)' has been renamed to 'init(mutating:)'}} _ = UnsafeMutableRawPointer(oumpv) _ = UnsafeMutableRawPointer(oupv) // expected-error {{'init(_:)' has been renamed to 'init(mutating:)'}} _ = UnsafeMutableRawPointer(oumpi) _ = UnsafeMutableRawPointer(oupi) // expected-error {{'init(_:)' has been renamed to 'init(mutating:)'}} _ = UnsafeMutableRawPointer(oumps) _ = UnsafeMutableRawPointer(oups) // expected-error {{'init(_:)' has been renamed to 'init(mutating:)'}} // These all correctly pass with no error. _ = UnsafeRawPointer(mrp) _ = UnsafeRawPointer(rp) _ = UnsafeRawPointer(umpv) _ = UnsafeRawPointer(upv) _ = UnsafeRawPointer(umpi) _ = UnsafeRawPointer(upi) _ = UnsafeRawPointer(umps) _ = UnsafeRawPointer(ups) _ = UnsafeRawPointer(omrp) _ = UnsafeRawPointer(orp) _ = UnsafeRawPointer(oumpv) _ = UnsafeRawPointer(oupv) _ = UnsafeRawPointer(oumpi) _ = UnsafeRawPointer(oupi) _ = UnsafeRawPointer(oumps) _ = UnsafeRawPointer(oups) _ = UnsafePointer(upi) _ = UnsafePointer(oumpi) _ = UnsafePointer(oupi) _ = UnsafeMutablePointer(umpi) _ = UnsafeMutablePointer(oumpi) _ = UnsafeMutablePointer(rp) // expected-warning 4 {{UnsafeMutablePointer has been replaced by UnsafeMutableRawPointer}} expected-error {{cannot invoke initializer for type 'UnsafeMutablePointer' with an argument list of type '(UnsafeRawPointer)'}} expected-note {{overloads for 'UnsafeMutablePointer' exist with these partially matching parameter lists: (RawPointer), (UnsafeMutablePointer), (UnsafeMutablePointer?)}} expected-note {{Pointer conversion restricted: use '.assumingMemoryBound(to:)' or '.bindMemory(to:capacity:)' to view memory as a type.}} _ = UnsafeMutablePointer(mrp) // expected-warning 4 {{UnsafeMutablePointer has been replaced by UnsafeMutableRawPointer}} expected-error {{cannot invoke initializer for type 'UnsafeMutablePointer' with an argument list of type '(UnsafeMutableRawPointer)'}} expected-note {{overloads for 'UnsafeMutablePointer' exist with these partially matching parameter lists: (RawPointer), (UnsafeMutablePointer), (UnsafeMutablePointer?)}} expected-note {{Pointer conversion restricted: use '.assumingMemoryBound(to:)' or '.bindMemory(to:capacity:)' to view memory as a type.}} _ = UnsafeMutablePointer(umpv) // expected-warning {{UnsafeMutablePointer has been replaced by UnsafeMutableRawPointer}} _ = UnsafeMutablePointer(umpi) // expected-warning {{UnsafeMutablePointer has been replaced by UnsafeMutableRawPointer}} _ = UnsafeMutablePointer(umps) // expected-warning {{UnsafeMutablePointer has been replaced by UnsafeMutableRawPointer}} _ = UnsafePointer(rp) // expected-error {{cannot convert value of type 'UnsafeRawPointer' to expected argument type 'RawPointer'}} expected-warning 4 {{UnsafePointer has been replaced by UnsafeRawPointer}} _ = UnsafePointer(mrp) // expected-error {{cannot convert value of type 'UnsafeMutableRawPointer' to expected argument type 'RawPointer'}} expected-warning 4 {{UnsafePointer has been replaced by UnsafeRawPointer}} _ = UnsafePointer(umpv) // expected-warning {{UnsafePointer has been replaced by UnsafeRawPointer}} _ = UnsafePointer(upv) // expected-warning {{UnsafePointer has been replaced by UnsafeRawPointer}} _ = UnsafePointer(umpi) // expected-warning {{UnsafePointer has been replaced by UnsafeRawPointer}} _ = UnsafePointer(upi) // expected-warning {{UnsafePointer has been replaced by UnsafeRawPointer}} _ = UnsafePointer(umps) // expected-warning {{UnsafePointer has been replaced by UnsafeRawPointer}} _ = UnsafePointer(ups) // expected-warning {{UnsafePointer has been replaced by UnsafeRawPointer}} _ = UnsafeMutablePointer(rp) // expected-error {{cannot invoke initializer for type 'UnsafeMutablePointer' with an argument list of type '(UnsafeRawPointer)'}} expected-note {{overloads for 'UnsafeMutablePointer' exist with these partially matching parameter lists: (RawPointer), (UnsafeMutablePointer), (UnsafeMutablePointer?)}} expected-note {{Pointer conversion restricted: use '.assumingMemoryBound(to:)' or '.bindMemory(to:capacity:)' to view memory as a type.}} _ = UnsafeMutablePointer(mrp) // expected-error {{cannot invoke initializer for type 'UnsafeMutablePointer' with an argument list of type '(UnsafeMutableRawPointer)'}} expected-note {{Pointer conversion restricted: use '.assumingMemoryBound(to:)' or '.bindMemory(to:capacity:)' to view memory as a type.}} expected-note {{overloads for 'UnsafeMutablePointer' exist with these partially matching parameter lists: (RawPointer), (UnsafeMutablePointer), (UnsafeMutablePointer?)}} _ = UnsafeMutablePointer(orp) // expected-error {{cannot invoke initializer for type 'UnsafeMutablePointer' with an argument list of type '(UnsafeRawPointer?)'}} expected-note {{overloads for 'UnsafeMutablePointer' exist with these partially matching parameter lists: (RawPointer), (UnsafeMutablePointer), (UnsafeMutablePointer?)}} expected-note {{Pointer conversion restricted: use '.assumingMemoryBound(to:)' or '.bindMemory(to:capacity:)' to view memory as a type.}} _ = UnsafeMutablePointer(omrp) // expected-error {{cannot invoke initializer for type 'UnsafeMutablePointer' with an argument list of type '(UnsafeMutableRawPointer?)'}} expected-note {{overloads for 'UnsafeMutablePointer' exist with these partially matching parameter lists: (RawPointer), (UnsafeMutablePointer), (UnsafeMutablePointer?)}} expected-note {{Pointer conversion restricted: use '.assumingMemoryBound(to:)' or '.bindMemory(to:capacity:)' to view memory as a type.}} _ = UnsafePointer(rp) // expected-error {{cannot convert value of type 'UnsafeRawPointer' to expected argument type 'RawPointer'}} _ = UnsafePointer(mrp) // expected-error {{cannot convert value of type 'UnsafeMutableRawPointer' to expected argument type 'RawPointer'}} _ = UnsafePointer(orp) // expected-error {{cannot convert value of type 'UnsafeRawPointer?' to expected argument type 'RawPointer'}} _ = UnsafePointer(omrp) // expected-error {{cannot convert value of type 'UnsafeMutableRawPointer?' to expected argument type 'RawPointer'}} _ = UnsafePointer(ups) // expected-error {{cannot convert value of type 'UnsafePointer' to expected argument type 'RawPointer'}} _ = UnsafeMutablePointer(umps) // expected-error {{cannot convert value of type 'UnsafeMutablePointer' to expected argument type 'UnsafeMutablePointer<_>'}} _ = UnsafePointer(upi) // expected-error {{cannot convert value of type 'UnsafePointer' to expected argument type 'RawPointer'}} _ = UnsafeMutablePointer(umpi) // expected-error {{cannot convert value of type 'UnsafeMutablePointer' to expected argument type 'UnsafeMutablePointer<_>'}} } func unsafeRawBufferPointerConversions( mrp: UnsafeMutableRawPointer, rp: UnsafeRawPointer, mrbp: UnsafeMutableRawBufferPointer, rbp: UnsafeRawBufferPointer, mbpi: UnsafeMutableBufferPointer, bpi: UnsafeBufferPointer) { let omrp: UnsafeMutableRawPointer? = mrp let orp: UnsafeRawPointer? = rp _ = UnsafeMutableRawBufferPointer(start: mrp, count: 1) _ = UnsafeRawBufferPointer(start: mrp, count: 1) _ = UnsafeMutableRawBufferPointer(start: rp, count: 1) // expected-error {{cannot convert value of type 'UnsafeRawPointer' to expected argument type 'UnsafeMutableRawPointer?'}} _ = UnsafeRawBufferPointer(start: rp, count: 1) _ = UnsafeMutableRawBufferPointer(mrbp) _ = UnsafeRawBufferPointer(mrbp) _ = UnsafeMutableRawBufferPointer(rbp) // expected-error {{cannot invoke initializer for type 'UnsafeMutableRawBufferPointer' with an argument list of type '(UnsafeRawBufferPointer)'}} expected-note {{overloads for 'UnsafeMutableRawBufferPointer' exist with these partially matching parameter lists: (UnsafeMutableBufferPointer), (UnsafeMutableRawBufferPointer)}} _ = UnsafeRawBufferPointer(rbp) _ = UnsafeMutableRawBufferPointer(mbpi) _ = UnsafeRawBufferPointer(mbpi) _ = UnsafeMutableRawBufferPointer(bpi) // expected-error {{cannot invoke initializer for type 'UnsafeMutableRawBufferPointer' with an argument list of type '(UnsafeBufferPointer)'}} expected-note {{overloads for 'UnsafeMutableRawBufferPointer' exist with these partially matching parameter lists: (UnsafeMutableBufferPointer), (UnsafeMutableRawBufferPointer)}} _ = UnsafeRawBufferPointer(bpi) _ = UnsafeMutableRawBufferPointer(start: omrp, count: 1) _ = UnsafeRawBufferPointer(start: omrp, count: 1) _ = UnsafeMutableRawBufferPointer(start: orp, count: 1) // expected-error {{cannot convert value of type 'UnsafeRawPointer?' to expected argument type 'UnsafeMutableRawPointer?'}} _ = UnsafeRawBufferPointer(start: orp, count: 1) } struct SR9800 { func foo(_: UnsafePointer) {} func foo(_: UnsafePointer) {} func ambiguityTest(buf: UnsafeMutablePointer) { _ = foo(UnsafePointer(buf)) // this call should be unambiguoius } }