// RUN: %empty-directory(%t) // RUN: %gyb %s -o %t/swift_to_c_pointer_conversions.swift // RUN: %line-directive %t/swift_to_c_pointer_conversions.swift -- %target-swift-frontend(mock-sdk: %clang-importer-sdk-nosource -I %t) -import-objc-header %S/Inputs/c_pointer_conversions.h %t/swift_to_c_pointer_conversions.swift -typecheck -verify // REQUIRES: objc_interop func test_raw_ptr(ptr: UnsafeRawPointer) { char_ptr_func(ptr) // expected-error {{}} unsigned_char_ptr_func(ptr) // expected-error {{}} const_char_ptr_func(ptr) // Ok const_unsigned_char_ptr_func(ptr) // Ok % for Size in ['16', '32', '64']: int_${Size}_ptr_func(ptr) // expected-error {{}} uint_${Size}_ptr_func(ptr) // expected-error {{}} const_int_${Size}_ptr_func(ptr) // expected-error {{}} const_uint_${Size}_ptr_func(ptr) // expected-error {{}} % end } func test_mutable_raw_pointer(ptr: UnsafeMutableRawPointer) { char_ptr_func(ptr) // Ok unsigned_char_ptr_func(ptr) // Ok const_char_ptr_func(ptr) // Ok const_unsigned_char_ptr_func(ptr) // Ok % for Size in ['16', '32', '64']: int_${Size}_ptr_func(ptr) // expected-error {{}} uint_${Size}_ptr_func(ptr) // expected-error {{}} const_int_${Size}_ptr_func(ptr) // expected-error {{}} const_uint_${Size}_ptr_func(ptr) // expected-error {{}} % end } %for TestPtrSize in ['8', '16', '32', '64']: // Immutable pointers can be converted only to their immutable (regardless of sign) counterparts. func test_${TestPtrSize}_bit_ptrs(sptr: UnsafePointer, uptr: UnsafePointer, osptr: UnsafePointer?, ouptr: UnsafePointer?) { % for pointer in ['sptr', 'uptr']: char_ptr_func(${pointer}) // expected-error {{}} opt_char_ptr_func(${pointer}) // expected-error {{}} const_char_ptr_func(${pointer}) // Ok const_opt_char_ptr_func(${pointer}) // Ok unsigned_char_ptr_func(${pointer}) // expected-error {{}} unsigned_opt_char_ptr_func(${pointer}) // expected-error {{}} const_unsigned_char_ptr_func(${pointer}) // Ok const_opt_unsigned_char_ptr_func(${pointer}) // Ok % end % for pointer in ['osptr', 'ouptr']: opt_char_ptr_func(${pointer}) // expected-error {{}} expected-note {{arguments to generic parameter 'Wrapped'}} const_opt_char_ptr_func(${pointer}) // Ok unsigned_opt_char_ptr_func(${pointer}) // expected-error {{}} const_opt_unsigned_char_ptr_func(${pointer}) // Ok % end % for pointer in ['sptr', 'uptr']: % for Size in ['16', '32', '64']: % if Size == TestPtrSize: int_${TestPtrSize}_ptr_func(${pointer}) // expected-error {{}} uint_${TestPtrSize}_ptr_func(${pointer}) // expected-error {{}} opt_int_${TestPtrSize}_ptr_func(${pointer}) // expected-error {{}} opt_uint_${TestPtrSize}_ptr_func(${pointer}) // expected-error {{}} const_int_${TestPtrSize}_ptr_func(${pointer}) // Ok const_uint_${TestPtrSize}_ptr_func(${pointer}) // Ok const_opt_int_${TestPtrSize}_ptr_func(${pointer}) // Ok const_opt_uint_${TestPtrSize}_ptr_func(${pointer}) // Ok % else: int_${Size}_ptr_func(${pointer}) // expected-error {{}} uint_${Size}_ptr_func(${pointer}) // expected-error {{}} opt_int_${Size}_ptr_func(${pointer}) // expected-error {{}} opt_uint_${Size}_ptr_func(${pointer}) // expected-error {{}} const_int_${Size}_ptr_func(${pointer}) // expected-error {{}} expected-note {{}} const_uint_${Size}_ptr_func(${pointer}) // expected-error {{}} expected-note {{}} const_opt_int_${Size}_ptr_func(${pointer}) // expected-error {{}} expected-note {{}} const_opt_uint_${Size}_ptr_func(${pointer}) // expected-error {{}} expected-note {{}} % end % end % end % for pointer in ['osptr', 'ouptr']: % for Size in ['16', '32', '64']: % if Size == TestPtrSize: opt_int_${TestPtrSize}_ptr_func(${pointer}) // expected-error {{}} expected-note {{arguments to generic parameter 'Wrapped'}} opt_uint_${TestPtrSize}_ptr_func(${pointer}) // expected-error {{}} expected-note {{arguments to generic parameter 'Wrapped'}} const_opt_int_${TestPtrSize}_ptr_func(${pointer}) // Ok const_opt_uint_${TestPtrSize}_ptr_func(${pointer}) // Ok % else: opt_int_${Size}_ptr_func(${pointer}) // expected-error {{}} expected-note {{arguments to generic parameter 'Wrapped'}} opt_uint_${Size}_ptr_func(${pointer}) // expected-error {{}} expected-note {{arguments to generic parameter 'Wrapped'}} const_opt_int_${Size}_ptr_func(${pointer}) // expected-error {{}} expected-note {{}} const_opt_uint_${Size}_ptr_func(${pointer}) // expected-error {{}} expected-note {{}} % end % end % end } % end %for TestPtrSize in ['8', '16', '32', '64']: // Mutable pointers can be converted to both immutable and mutable pointers when // passed to C/ObjC imported functions. func test_mutable_${TestPtrSize}_bit_ptrs(sptr: UnsafeMutablePointer, uptr: UnsafeMutablePointer, osptr: UnsafeMutablePointer?, ouptr: UnsafeMutablePointer?) { % for pointer in ['sptr', 'uptr']: char_ptr_func(${pointer}) // Ok opt_char_ptr_func(${pointer}) // Ok const_char_ptr_func(${pointer}) // Ok const_opt_char_ptr_func(${pointer}) // Ok unsigned_char_ptr_func(${pointer}) // Ok opt_unsigned_char_ptr_func(${pointer}) // Ok const_unsigned_char_ptr_func(${pointer}) // Ok const_opt_unsigned_char_ptr_func(${pointer}) // Ok % end % for pointer in ['osptr', 'ouptr']: opt_char_ptr_func(${pointer}) // Ok const_opt_char_ptr_func(${pointer}) // Ok opt_unsigned_char_ptr_func(${pointer}) // Ok const_opt_unsigned_char_ptr_func(${pointer}) // Ok % end % for pointer in ['sptr', 'uptr']: % for Size in ['16', '32', '64']: % if Size == TestPtrSize: int_${TestPtrSize}_ptr_func(${pointer}) // Ok uint_${TestPtrSize}_ptr_func(${pointer}) // Ok opt_int_${TestPtrSize}_ptr_func(${pointer}) // Ok opt_uint_${TestPtrSize}_ptr_func(${pointer}) // Ok const_int_${TestPtrSize}_ptr_func(${pointer}) // Ok const_uint_${TestPtrSize}_ptr_func(${pointer}) // Ok const_opt_int_${TestPtrSize}_ptr_func(${pointer}) // Ok const_opt_uint_${TestPtrSize}_ptr_func(${pointer}) // Ok % else: int_${Size}_ptr_func(${pointer}) // expected-error {{}} expected-note {{}} uint_${Size}_ptr_func(${pointer}) // expected-error {{}} expected-note {{}} opt_int_${Size}_ptr_func(${pointer}) // expected-error {{}} expected-note {{}} opt_uint_${Size}_ptr_func(${pointer}) // expected-error {{}} expected-note {{}} const_int_${Size}_ptr_func(${pointer}) // expected-error {{}} expected-note {{}} const_uint_${Size}_ptr_func(${pointer}) // expected-error {{}} expected-note {{}} const_opt_int_${Size}_ptr_func(${pointer}) // expected-error {{}} expected-note {{}} const_opt_uint_${Size}_ptr_func(${pointer}) // expected-error {{}} expected-note {{}} % end % end % end % for pointer in ['osptr', 'ouptr']: % for Size in ['16', '32', '64']: % if Size == TestPtrSize: opt_int_${TestPtrSize}_ptr_func(${pointer}) // Ok opt_uint_${TestPtrSize}_ptr_func(${pointer}) // Ok const_opt_int_${TestPtrSize}_ptr_func(${pointer}) // Ok const_opt_uint_${TestPtrSize}_ptr_func(${pointer}) // Ok % else: opt_int_${Size}_ptr_func(${pointer}) // expected-error {{}} expected-note {{}} opt_uint_${Size}_ptr_func(${pointer}) // expected-error {{}} expected-note {{}} const_opt_int_${Size}_ptr_func(${pointer}) // expected-error {{}} expected-note {{}} const_opt_uint_${Size}_ptr_func(${pointer}) // expected-error {{}} expected-note {{}} % end % end % end } % end func test_raw_ptr_value_to_optional_promotion( riptr: UnsafeRawPointer, rmptr: UnsafeMutableRawPointer) { opt_char_ptr_func(riptr) // expected-error {{}} const_opt_char_ptr_func(riptr) // Ok opt_char_ptr_func(rmptr) // Ok const_opt_char_ptr_func(rmptr) // Ok opt_unsigned_char_ptr_func(riptr) // expected-error {{}} const_opt_unsigned_char_ptr_func(riptr) // Ok opt_unsigned_char_ptr_func(rmptr) // Ok const_opt_unsigned_char_ptr_func(rmptr) // Ok % for Ptr in ['riptr', 'rmptr']: % for Size in ['16', '32', '64']: opt_int_${Size}_ptr_func(${Ptr}) // expected-error {{}} opt_uint_${Size}_ptr_func(${Ptr}) // expected-error {{}} const_opt_int_${Size}_ptr_func(${Ptr}) // expected-error {{}} const_opt_uint_${Size}_ptr_func(${Ptr}) // expected-error {{}} % end % end } func test_raw_ptr_optional_to_optional_conversion( riptr: UnsafeRawPointer?, rmptr: UnsafeMutableRawPointer?) { opt_char_ptr_func(riptr) // expected-error {{}} expected-note {{arguments to generic parameter 'Wrapped'}} const_opt_char_ptr_func(riptr) // Ok opt_char_ptr_func(rmptr) // Ok const_opt_char_ptr_func(rmptr) // Ok opt_unsigned_char_ptr_func(rmptr) // Ok const_opt_unsigned_char_ptr_func(rmptr) // Ok % for Ptr in ['riptr', 'rmptr']: % for Size in ['16', '32', '64']: opt_int_${Size}_ptr_func(${Ptr}) // expected-error {{}} expected-note {{arguments to generic parameter 'Wrapped'}} opt_uint_${Size}_ptr_func(${Ptr}) // expected-error {{}} expected-note {{arguments to generic parameter 'Wrapped'}} const_opt_int_${Size}_ptr_func(${Ptr}) // expected-error {{}} expected-note {{arguments to generic parameter 'Wrapped'}} const_opt_uint_${Size}_ptr_func(${Ptr}) // expected-error {{}} expected-note {{arguments to generic parameter 'Wrapped'}} % end % end } // Check that implicit conversions don't make expressions ambiguous func test_overloaded_ref_is_not_ambiguous() { func overloaded_func() -> UnsafeRawPointer { fatalError() } func overloaded_func() -> UnsafePointer { fatalError() } const_char_ptr_func(overloaded_func()) // Ok const_opt_char_ptr_func(overloaded_func()) // Ok } func test_tailored_diagnostic(ptr: UnsafeRawPointer, tptr: UnsafePointer) { func swift_uint8_func(_: UnsafePointer) {} func swift_int8_func(_: UnsafePointer) {} func opt_arg_func(_: UnsafePointer?) {} swift_uint8_func(ptr) // expected-error@-1 {{cannot convert value of type 'UnsafeRawPointer' to expected argument type 'UnsafePointer' because local function 'swift_uint8_func' was not imported from C header}} swift_uint8_func(tptr) // expected-error@-1 {{cannot convert value of type 'UnsafePointer' to expected argument type 'UnsafePointer' because local function 'swift_uint8_func' was not imported from C header}} swift_int8_func(ptr) // expected-error@-1 {{cannot convert value of type 'UnsafeRawPointer' to expected argument type 'UnsafePointer' because local function 'swift_int8_func' was not imported from C header}} swift_int8_func(tptr) // Ok opt_arg_func(ptr) // expected-error@-1 {{cannot convert value of type 'UnsafeRawPointer' to expected argument type 'UnsafePointer?' because local function 'opt_arg_func' was not imported from C header}} opt_arg_func(tptr) // Ok let optrS8: UnsafePointer? = nil let optrU8: UnsafePointer? = nil opt_arg_func(optrS8) // Ok opt_arg_func(optrU8) // expected-error@-1 {{cannot convert value of type 'UnsafePointer?' to expected argument type 'UnsafePointer?' because local function 'opt_arg_func' was not imported from C header}} } func test_inout_to_pointer_conversion() { % for Size in ['16', '32', '64']: var x${Size}: Int${Size} = 0 void_ptr_func(&x${Size}) // Ok const_void_ptr_func(&x${Size}) // Ok opt_void_ptr_func(&x${Size}) // Ok char_ptr_func(&x${Size}) // Ok opt_char_ptr_func(&x${Size}) // Ok const_char_ptr_func(&x${Size}) // Ok const_opt_char_ptr_func(&x${Size}) // Ok int_${Size}_ptr_func(&x${Size}) // Ok uint_${Size}_ptr_func(&x${Size}) // Ok opt_int_${Size}_ptr_func(&x${Size}) // Ok opt_uint_${Size}_ptr_func(&x${Size}) // Ok const_int_${Size}_ptr_func(&x${Size}) // OK const_uint_${Size}_ptr_func(&x${Size}) // OK const_opt_int_${Size}_ptr_func(&x${Size}) // OK const_opt_uint_${Size}_ptr_func(&x${Size}) // OK % end } func test_array_to_pointer_conversion() { % for Size in ['16', '32', '64']: var x${Size}: [Int${Size}] = [] void_ptr_func(&x${Size}) // Ok const_void_ptr_func(x${Size}) // Ok opt_void_ptr_func(x${Size}) // expected-error@-1 {{cannot convert value of type '[Int${Size}]' to expected argument type 'UnsafeMutableRawPointer'}} char_ptr_func(x${Size}) // expected-error@-1 {{cannot convert value of type '[Int${Size}]' to expected argument type 'UnsafeMutablePointer' (aka 'UnsafeMutablePointer')}} opt_char_ptr_func(x${Size}) // expected-error@-1 {{cannot convert value of type '[Int${Size}]' to expected argument type 'UnsafeMutablePointer' (aka 'UnsafeMutablePointer')}} const_char_ptr_func(x${Size}) // Ok const_opt_char_ptr_func(x${Size}) // Ok int_${Size}_ptr_func(x${Size}) // expected-error@-1 {{cannot convert value of type '[Int${Size}]' to expected argument type 'UnsafeMutablePointer'}} uint_${Size}_ptr_func(x${Size}) // expected-error@-1 {{cannot convert value of type '[Int${Size}]' to expected argument type 'UnsafeMutablePointer'}} opt_int_${Size}_ptr_func(x${Size}) // expected-error@-1 {{cannot convert value of type '[Int${Size}]' to expected argument type 'UnsafeMutablePointer'}} opt_uint_${Size}_ptr_func(x${Size}) // expected-error@-1 {{cannot convert value of type '[Int${Size}]' to expected argument type 'UnsafeMutablePointer'}} const_int_${Size}_ptr_func(x${Size}) // OK const_uint_${Size}_ptr_func(x${Size}) // OK const_opt_int_${Size}_ptr_func(x${Size}) // OK const_opt_uint_${Size}_ptr_func(x${Size}) // OK % end }