mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
67 lines
2.7 KiB
Swift
67 lines
2.7 KiB
Swift
// RUN: %target-swift-emit-ir -import-objc-header %S/../Inputs/objc_direct.h -o - %s | %FileCheck %s
|
|
|
|
// REQUIRES: objc_interop
|
|
|
|
func markUsed<T>(_ t: T) {}
|
|
|
|
protocol BarProtocol {
|
|
func directProtocolMethod() -> String!
|
|
}
|
|
|
|
extension Bar: BarProtocol {}
|
|
|
|
let bar = Bar()
|
|
|
|
bar.directProperty = 123
|
|
// CHECK: call void @"\01-[Bar setDirectProperty:]"({{.*}}, i8* undef, i32 {{.*}})
|
|
|
|
markUsed(bar.directProperty)
|
|
// CHECK: call i32 @"\01-[Bar directProperty]"({{.*}}, i8* undef)
|
|
|
|
bar.directProperty2 = 456
|
|
// CHECK: call void @"\01-[Bar setDirectProperty2:]"({{.*}}, i8* undef, i32 {{.*}})
|
|
|
|
markUsed(bar.directProperty2)
|
|
// CHECK: call i32 @"\01-[Bar directProperty2]"({{.*}}, i8* undef)
|
|
|
|
bar[0] = 789
|
|
// CHECK: call void @"\01-[Bar setObject:atIndexedSubscript:]"({{.*}}, i8* undef, i32 789, i32 0)
|
|
|
|
markUsed(bar[0])
|
|
// CHECK: call i32 @"\01-[Bar objectAtIndexedSubscript:]"({{.*}}, i8* undef, i32 0)
|
|
|
|
markUsed(bar.directMethod())
|
|
// CHECK: call {{.*}} @"\01-[Bar directMethod]"({{.*}}, i8* undef)
|
|
|
|
markUsed(bar.directMethod2())
|
|
// CHECK: call {{.*}} @"\01-[Bar directMethod2]"({{.*}}, i8* undef)
|
|
|
|
markUsed(Bar.directClassMethod())
|
|
// NOTE: The class must be realized before calling objc_direct class methods, even if
|
|
// Swift avoids explicit class realization before calling regular class methods.
|
|
// CHECK: [[R0:%.*]] = load %objc_class*, %objc_class** @"OBJC_CLASS_REF_$_Bar"
|
|
// CHECK: [[R1:%.*]] = call %objc_class* @{{(swift_getInitializedObjCClass|objc_opt_self)}}(%objc_class* [[R0]])
|
|
// CHECK: [[R2:%.*]] = bitcast %objc_class* [[R1]] to i8*
|
|
// CHECK: call {{.*}} @"\01+[Bar directClassMethod]"(i8* [[R2]], i8* undef)
|
|
|
|
markUsed(Bar.directClassMethod2())
|
|
// CHECK: [[R3:%.*]] = load %objc_class*, %objc_class** @"OBJC_CLASS_REF_$_Bar"
|
|
// CHECK: [[R4:%.*]] = call %objc_class* @{{(swift_getInitializedObjCClass|objc_opt_self)}}(%objc_class* [[R3]])
|
|
// CHECK: [[R5:%.*]] = bitcast %objc_class* [[R4]] to i8*
|
|
// CHECK: call {{.*}} @"\01+[Bar directClassMethod2]"(i8* [[R5]], i8* undef)
|
|
|
|
markUsed(bar.directProtocolMethod())
|
|
// CHECK: call {{.*}} @"\01-[Bar directProtocolMethod]"({{.*}}, i8* undef)
|
|
|
|
// CHECK-DAG: declare i32 @"\01-[Bar directProperty]"
|
|
// CHECK-DAG: declare void @"\01-[Bar setDirectProperty:]"
|
|
// CHECK-DAG: declare i32 @"\01-[Bar directProperty2]"
|
|
// CHECK-DAG: declare void @"\01-[Bar setDirectProperty2:]"
|
|
// CHECK-DAG: declare void @"\01-[Bar setObject:atIndexedSubscript:]"
|
|
// CHECK-DAG: declare i32 @"\01-[Bar objectAtIndexedSubscript:]"
|
|
// CHECK-DAG: declare {{.*}} @"\01-[Bar directMethod]"
|
|
// CHECK-DAG: declare {{.*}} @"\01-[Bar directMethod2]"
|
|
// CHECK-DAG: declare {{.*}} @"\01+[Bar directClassMethod]"
|
|
// CHECK-DAG: declare {{.*}} @"\01+[Bar directClassMethod2]"
|
|
// CHECK-DAG: declare {{.*}} @"\01-[Bar directProtocolMethod]"
|