| // RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -emit-ir %s | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize |
| // REQUIRES: objc_interop |
| |
| import Swift |
| import Foundation |
| |
| class C: NSObject { |
| dynamic var x: NSString { get } |
| @sil_stored final var stored: Int |
| override init() |
| } |
| |
| sil_vtable C {} |
| |
| sil @x_get : $@convention(thin) (@in C) -> @out NSString |
| |
| // CHECK: [[KEYPATH_A:@keypath.*]] = private global |
| // -- 0x2000_0002: computed, get-only, indirect identifier |
| // CHECK-SAME: i32 536870914 |
| // CHECK-SAME: i8** @"\01L_selector(x)" |
| |
| // CHECK: [[KEYPATH_B:@keypath.*]] = private global |
| // -- 0x5ffffffd: class stored property with indirect offset |
| // CHECK-SAME: i32 1610612733, |
| // CHECK-SAME: @_T013keypaths_objc1CC6storedSivpWvd |
| |
| // CHECK-LABEL: define swiftcc void @objc_only_property() |
| sil @objc_only_property : $@convention(thin) () -> () { |
| entry: |
| // CHECK: call %swift.refcounted* @swift_getKeyPath({{.*}} [[KEYPATH_A]] |
| %a = keypath $KeyPath<C, NSString>, (objc "x"; root $C; gettable_property $NSString, id #C.x!getter.1.foreign, getter @x_get : $@convention(thin) (@in C) -> @out NSString) |
| unreachable |
| } |
| |
| sil hidden @_T013keypaths_objc1CC1xSo8NSStringCvgTo : $@convention(objc_method) (@guaranteed C) -> NSString { |
| entry(%0 : $C): |
| unreachable |
| } |
| |
| sil hidden @_T013keypaths_objc1CCACycfcTo : $@convention(objc_method) (@objc_metatype C.Type) -> @owned C { |
| entry(%0 : $@objc_metatype C.Type): |
| unreachable |
| } |
| |
| sil @objc_stored_property : $@convention(thin) () -> () { |
| entry: |
| // CHECK: call %swift.refcounted* @swift_getKeyPath({{.*}} [[KEYPATH_B]] |
| %b = keypath $KeyPath<C, Int>, (objc "stored"; root $C; stored_property #C.stored : $Int) |
| unreachable |
| } |