// RUN: %empty-directory(%t) // RUN: %gyb -DOPT_KIND=None %s -o %t/pointer_conversion.swift // RUN: %line-directive %t/pointer_conversion.swift -- %target-swift-frontend -typecheck -verify %t/pointer_conversion.swift // RUN: %gyb -DOPT_KIND=Optional %s -o %t/pointer_conversion_opt.swift // RUN: %line-directive %t/pointer_conversion_opt.swift -- %target-swift-frontend -typecheck -verify %t/pointer_conversion_opt.swift // RUN: %gyb -DOPT_KIND=ImplicitlyUnwrappedOptional %s -o %t/pointer_conversion_iuo.swift // RUN: %line-directive %t/pointer_conversion_iuo.swift -- %target-swift-frontend -typecheck -verify %t/pointer_conversion_iuo.swift // REQUIRES: objc_interop %{ if OPT_KIND == 'Optional': suffix='?' elif OPT_KIND == 'ImplicitlyUnwrappedOptional': suffix='!' else: suffix='' }% class C {} class D {} func takesMutablePointer(_ x: UnsafeMutablePointer${suffix}) {} func takesMutableVoidPointer(_ x: UnsafeMutableRawPointer${suffix}) {} @discardableResult func takesConstPointer(_ x: UnsafePointer${suffix}) -> Character { return "x" } func takesConstVoidPointer(_ x: UnsafeRawPointer${suffix}) {} func takesAutoreleasingPointer(_ x: AutoreleasingUnsafeMutablePointer${suffix}) {} func pointerArgumentsObjC(ap: AutoreleasingUnsafeMutablePointer, afp: AutoreleasingUnsafeMutablePointer) { takesMutablePointer(ap) // expected-error{{cannot convert value of type 'AutoreleasingUnsafeMutablePointer' to expected argument type 'UnsafeMutablePointer'}} takesMutableVoidPointer(ap) // expected-error{{cannot convert value of type 'AutoreleasingUnsafeMutablePointer' to expected argument type 'UnsafeMutableRawPointer'}} takesConstPointer(ap) takesConstVoidPointer(ap) takesConstVoidPointer(afp) var x: UnsafeRawPointer x = ap // expected-error{{cannot assign value of type 'AutoreleasingUnsafeMutablePointer' to type 'UnsafeRawPointer'}} _ = x } func autoreleasingPointerArguments(p: UnsafeMutablePointer, cp: UnsafePointer, ap: AutoreleasingUnsafeMutablePointer) { takesAutoreleasingPointer(nil) % if not suffix: // expected-error@-2 {{'nil' is not compatible with expected argument type}} % end takesAutoreleasingPointer(p) // expected-error{{cannot convert value of type 'UnsafeMutablePointer' to expected argument type 'AutoreleasingUnsafeMutablePointer'}} takesAutoreleasingPointer(cp) // expected-error{{cannot convert value of type 'UnsafePointer' to expected argument type 'AutoreleasingUnsafeMutablePointer'}} takesAutoreleasingPointer(ap) var c: C = C() takesAutoreleasingPointer(&c) takesAutoreleasingPointer(c) // expected-error{{cannot convert value of type 'C' to expected argument type 'AutoreleasingUnsafeMutablePointer'}} var d: D = D() takesAutoreleasingPointer(&d) // expected-error{{cannot convert value of type 'AutoreleasingUnsafeMutablePointer' to expected argument type 'AutoreleasingUnsafeMutablePointer'}} // expected-note@-1 {{arguments to generic parameter 'Pointee' ('D' and 'C') are expected to be equal}} takesAutoreleasingPointer(d) // expected-error{{cannot convert value of type 'D' to expected argument type 'AutoreleasingUnsafeMutablePointer'}} var cc: [C] = [C(), C()] var dd: [D] = [D(), D()] takesAutoreleasingPointer(&cc) // expected-error{{cannot convert value of type 'AutoreleasingUnsafeMutablePointer<[C]>' to expected argument type 'AutoreleasingUnsafeMutablePointer'}} // expected-note@-1 {{arguments to generic parameter 'Pointee' ('[C]' and 'C') are expected to be equal}} takesAutoreleasingPointer(&dd) // expected-error{{cannot convert value of type 'AutoreleasingUnsafeMutablePointer<[D]>' to expected argument type 'AutoreleasingUnsafeMutablePointer'}} // expected-note@-1 {{arguments to generic parameter 'Pointee' ('[D]' and 'C') are expected to be equal}} let _: AutoreleasingUnsafeMutablePointer = &c // expected-error {{'&' may only be used to pass an argument to inout parameter}} }