mirror of
https://github.com/apple/swift.git
synced 2026-06-27 12:25:55 +02:00
d466d9b3aa
This removes the partially-correct ABI check in Sema and diagnoses unsupported conversions in SILGen instead. The new check is more accurate and correctly diagnoses conversions of DeclRef's to ABI-incompatible @convention(c) types. This also fixes two cases where we used to crash but could instead emit a trivial cast: - Conversions between ABI-compatible (but not identical) @convention(c) types - Conversions of a DeclRef to an ABI-compatible (but not identical) @convention(c) type Fixes <rdar://problem/22470105>. Swift SVN r32163
54 lines
1.9 KiB
Swift
54 lines
1.9 KiB
Swift
// RUN: %target-swift-frontend -emit-silgen -verify %s | FileCheck %s
|
|
|
|
func values(arg: @convention(c) Int -> Int) -> @convention(c) Int -> Int {
|
|
return arg
|
|
}
|
|
// CHECK-LABEL: sil hidden @_TF19c_function_pointers6valuesFcSiSicSiSi
|
|
// CHECK: bb0(%0 : $@convention(c) (Int) -> Int):
|
|
// CHECK: return %0 : $@convention(c) (Int) -> Int
|
|
|
|
func calls(arg: @convention(c) Int -> Int, _ x: Int) -> Int {
|
|
return arg(x)
|
|
}
|
|
// CHECK-LABEL: sil hidden @_TF19c_function_pointers5callsFTcSiSiSi_Si
|
|
// CHECK: bb0(%0 : $@convention(c) (Int) -> Int, %1 : $Int):
|
|
// CHECK: [[RESULT:%.*]] = apply %0(%1)
|
|
// CHECK: return [[RESULT]]
|
|
|
|
func calls_no_args(arg: @convention(c) () -> Int) -> Int {
|
|
return arg()
|
|
}
|
|
|
|
func global(x: Int) -> Int { return x }
|
|
|
|
func no_args() -> Int { return 42 }
|
|
|
|
// CHECK-LABEL: sil hidden @_TF19c_function_pointers27pointers_to_swift_functionsFSiT_
|
|
func pointers_to_swift_functions(x: Int) {
|
|
// CHECK: bb0([[X:%.*]] : $Int):
|
|
|
|
func local(y: Int) -> Int { return y }
|
|
|
|
// CHECK: [[GLOBAL_C:%.*]] = function_ref @_TToF19c_function_pointers6globalFSiSi
|
|
// CHECK: apply {{.*}}([[GLOBAL_C]], [[X]])
|
|
calls(global, x)
|
|
|
|
// CHECK: [[LOCAL_C:%.*]] = function_ref @_TToFF19c_function_pointers27pointers_to_swift_functionsFSiT_L_5localFSiSi
|
|
// CHECK: apply {{.*}}([[LOCAL_C]], [[X]])
|
|
calls(local, x)
|
|
|
|
// CHECK: [[CLOSURE_C:%.*]] = function_ref @_TToFF19c_function_pointers27pointers_to_swift_functionsFSiT_U_FSiSi
|
|
// CHECK: apply {{.*}}([[CLOSURE_C]], [[X]])
|
|
calls({ $0 + 1 }, x)
|
|
|
|
calls_no_args(no_args)
|
|
// CHECK: [[NO_ARGS_C:%.*]] = function_ref @_TToF19c_function_pointers7no_argsFT_Si
|
|
// CHECK: apply {{.*}}([[NO_ARGS_C]])
|
|
}
|
|
|
|
func unsupported(a: Any) -> Int { return 0 }
|
|
|
|
func pointers_to_bad_swift_functions(x: Int) {
|
|
calls(unsupported, x) // expected-error{{C function pointer signature '(Any) -> Int' is not compatible with expected type '@convention(c) Int -> Int'}}
|
|
}
|