// RUN: rm -rf %t && mkdir -p %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${suffix}'}} takesMutableVoidPointer(ap) // expected-error{{cannot convert value of type 'AutoreleasingUnsafeMutablePointer' to expected argument type 'UnsafeMutableRawPointer${suffix}'}} 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${suffix}'}} takesAutoreleasingPointer(cp) // expected-error{{cannot convert value of type 'UnsafePointer' to expected argument type 'AutoreleasingUnsafeMutablePointer${suffix}'}} takesAutoreleasingPointer(ap) var c: C = C() takesAutoreleasingPointer(&c) takesAutoreleasingPointer(c) // expected-error{{cannot convert value of type 'C' to expected argument type 'AutoreleasingUnsafeMutablePointer${suffix}'}} var d: D = D() takesAutoreleasingPointer(&d) // expected-error{{cannot convert value of type 'D' to expected argument type 'C'}} takesAutoreleasingPointer(d) // expected-error{{cannot convert value of type 'D' to expected argument type 'AutoreleasingUnsafeMutablePointer${suffix}'}} var cc: [C] = [C(), C()] var dd: [D] = [D(), D()] takesAutoreleasingPointer(&cc) // expected-error{{cannot convert value of type '[C]' to expected argument type 'C'}} takesAutoreleasingPointer(&dd) // expected-error{{cannot convert value of type '[D]' to expected argument type 'C'}} let _: AutoreleasingUnsafeMutablePointer = &c // expected-error{{cannot pass immutable value of type 'C' as inout argument}} }