| // RUN: %empty-directory(%t) |
| // RUN: %utils/chex.py < %s > %t/property_descriptor.sil |
| // RUN: %target-swift-frontend -emit-ir %t/property_descriptor.sil | %FileCheck --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK %t/property_descriptor.sil |
| |
| sil_stage canonical |
| |
| import Swift |
| |
| public struct ExternalGeneric<T: Comparable> { |
| public let ro: T |
| public var rw: T |
| |
| public var computedRO: T { get } |
| public var computedRW: T { get set } |
| |
| public subscript<U: Hashable>(_: U) -> T { get set } |
| |
| init() |
| } |
| |
| public struct External { |
| public let ro: Int |
| public var rw: Int |
| |
| public var computedRO: Int { get } |
| public var computedRW: Int { get set } |
| |
| public subscript(_: String) -> Int { get set } |
| |
| init() |
| } |
| |
| public struct ExternalReabstractions<T> { |
| public var ro: T |
| public var reabstracted: () -> () |
| } |
| |
| // -- 0xff_fffe - struct property, offset resolved from field offset vector in metadata |
| // CHECK-64: @"$S19property_descriptor15ExternalGenericV2roxvpMV" ={{( protected)?}}{{( protected)?}} constant |
| // CHECK-64-SAME: <{ <i32 0x00ff_fffe>, i32 32 }>, align 8 |
| // CHECK-32: @"$S19property_descriptor15ExternalGenericV2roxvpMV" ={{( protected)?}}{{( protected)?}} constant |
| // CHECK-32-SAME: <{ <i32 0x00ff_fffe>, i32 16 }>, align 4 |
| sil_property #ExternalGeneric.ro <T: Comparable> ( |
| stored_property #ExternalGeneric.ro : $T) |
| // CHECK-64: @"$S19property_descriptor15ExternalGenericV2rwxvpMV" ={{( protected)?}}{{( protected)?}} constant |
| // CHECK-64-SAME: <{ <i32 0x00ff_fffe>, i32 36 }>, align 8 |
| // CHECK-32: @"$S19property_descriptor15ExternalGenericV2rwxvpMV" ={{( protected)?}} constant |
| // CHECK-32-SAME: <{ <i32 0x00ff_fffe>, i32 20 }>, align 4 |
| sil_property #ExternalGeneric.rw <T: Comparable> ( |
| stored_property #ExternalGeneric.rw : $T) |
| |
| // CHECK: @"$S19property_descriptor15ExternalGenericV10computedROxvpMV" ={{( protected)?}} constant |
| // -- 0x0108_0000 - computed, readonly, has arguments |
| // CHECK-SAME: <{ <i32 0x0108_0000>, |
| // CHECK-SAME: @id_computed, |
| // CHECK-SAME: [[GET_COMPUTEDRO:@keypath_get[.0-9]*]], |
| // CHECK-SAME: [[GET_ARG_LAYOUT_COMPUTEDRO:@keypath_get_arg_layout[.0-9]*]], |
| // CHECK-SAME: @swift_keyPathGenericWitnessTable, |
| // CHECK-SAME: [[ARG_INIT_COMPUTEDRO:@keypath_arg_init[.0-9]*]] }> |
| sil_property #ExternalGeneric.computedRO <T: Comparable> ( |
| gettable_property $T, |
| id @id_computed : $@convention(thin) () -> (), |
| getter @get_computed_generic : $@convention(thin) <T: Comparable> (@in_guaranteed ExternalGeneric<T>) -> @out T) |
| |
| // CHECK: @"$S19property_descriptor15ExternalGenericV10computedRWxvpMV" ={{( protected)?}} constant |
| // -- 0x01c8_0000 - computed, settable, mutating, has arguments |
| // CHECK-SAME: <{ <i32 0x01c8_0000>, |
| // CHECK-SAME: @id_computed, |
| // CHECK-SAME: [[GET_COMPUTEDRW:@keypath_get[.0-9]*]], |
| // CHECK-SAME: [[SET_COMPUTEDRW:@keypath_set[.0-9]*]], |
| // CHECK-SAME: [[GET_ARG_LAYOUT_COMPUTEDRW:@keypath_get_arg_layout[.0-9]*]], |
| // CHECK-SAME: @swift_keyPathGenericWitnessTable, |
| // CHECK-SAME: [[ARG_INIT_COMPUTEDRW:@keypath_arg_init[.0-9]*]] }> |
| sil_property #ExternalGeneric.computedRW <T: Comparable> ( |
| settable_property $T, |
| id @id_computed : $@convention(thin) () -> (), |
| getter @get_computed_generic : $@convention(thin) <T: Comparable> (@in_guaranteed ExternalGeneric<T>) -> @out T, |
| setter @set_computed_generic : $@convention(thin) <T: Comparable> (@in_guaranteed T, @inout ExternalGeneric<T>) -> ()) |
| |
| // CHECK: @"$S19property_descriptor15ExternalGenericVyxqd__cs8HashableRd__luipMV" ={{( protected)?}} constant |
| // -- 0x01c8_0000 - computed, settable, mutating, has arguments |
| // CHECK-SAME: <{ <i32 0x01c8_0000>, |
| // CHECK-SAME: @id_computed, |
| // CHECK-SAME: [[GET_SUBSCRIPT:@keypath_get[.0-9]*]], |
| // CHECK-SAME: [[SET_SUBSCRIPT:@keypath_set[.0-9]*]], |
| // CHECK-SAME: [[GET_ARG_LAYOUT_SUBSCRIPT:@keypath_get_arg_layout[.0-9]*]], |
| // CHECK-SAME: @swift_keyPathGenericWitnessTable, |
| // CHECK-SAME: [[ARG_INIT_SUBSCRIPT:@keypath_arg_init[.0-9]*]] }> |
| sil_property #ExternalGeneric.subscript <T: Comparable><U: Hashable> ( |
| settable_property $T, |
| id @id_computed : $@convention(thin) () -> (), |
| getter @get_computed_generic_subscript : $@convention(thin) <T: Comparable><U: Hashable> (@in_guaranteed ExternalGeneric<T>, UnsafeRawPointer) -> @out T, |
| setter @set_computed_generic_subscript : $@convention(thin) <T: Comparable><U: Hashable> (@in_guaranteed T, @inout ExternalGeneric<T>, UnsafeRawPointer) -> ()) |
| |
| // CHECK: @"$S19property_descriptor8ExternalV2roSivpMV" ={{( protected)?}} constant <{ i32 }> zeroinitializer, align 4 |
| // CHECK-64: @"$S19property_descriptor8ExternalV2rwSivpMV" ={{( protected)?}} constant <{ i32 }> <{ i32 8 }>, align 4 |
| // CHECK-32: @"$S19property_descriptor8ExternalV2rwSivpMV" ={{( protected)?}} constant <{ i32 }> <{ i32 4 }>, align 4 |
| sil_property #External.ro (stored_property #External.ro : $Int) |
| sil_property #External.rw (stored_property #External.rw : $Int) |
| sil_property #External.computedRO ( |
| gettable_property $Int, |
| id @id_computed : $@convention(thin) () -> (), |
| getter @get_computed : $@convention(thin) (@in_guaranteed External) -> @out Int) |
| sil_property #External.computedRW ( |
| settable_property $Int, |
| id @id_computed : $@convention(thin) () -> (), |
| getter @get_computed : $@convention(thin) (@in_guaranteed External) -> @out Int, |
| setter @set_computed : $@convention(thin) (@in_guaranteed Int, @inout External) -> ()) |
| sil_property #External.subscript ( |
| settable_property $Int, |
| id @id_computed : $@convention(thin) () -> (), |
| getter @get_computed_subscript : $@convention(thin) (@in_guaranteed External, UnsafeRawPointer) -> @out Int, |
| setter @set_computed_subscript : $@convention(thin) (@in_guaranteed Int, @inout External, UnsafeRawPointer) -> ()) |
| |
| sil_property #ExternalReabstractions.ro <T> ( |
| stored_property #ExternalReabstractions.ro : $T) |
| |
| sil_property #ExternalReabstractions.reabstracted <T> ( |
| settable_property $() -> (), |
| id ##ExternalReabstractions.reabstracted, |
| getter @get_reabstracted : $@convention(thin) <T> (@in_guaranteed ExternalReabstractions<T>) -> @out @callee_guaranteed (@in_guaranteed ()) -> @out (), |
| setter @set_reabstracted : $@convention(thin) <T> (@in_guaranteed @callee_guaranteed (@in_guaranteed ()) -> @out (), @inout ExternalReabstractions<T>) -> ()) |
| |
| sil @id_computed : $@convention(thin) () -> () |
| sil @get_computed : $@convention(thin) (@in_guaranteed External) -> @out Int |
| sil @set_computed : $@convention(thin) (@in_guaranteed Int, @inout External) -> () |
| |
| sil @get_computed_subscript : $@convention(thin) (@in_guaranteed External, UnsafeRawPointer) -> @out Int |
| sil @set_computed_subscript : $@convention(thin) (@in_guaranteed Int, @inout External, UnsafeRawPointer) -> () |
| |
| sil @get_computed_generic : $@convention(thin) <T: Comparable> (@in_guaranteed ExternalGeneric<T>) -> @out T |
| sil @set_computed_generic : $@convention(thin) <T: Comparable> (@in_guaranteed T, @inout ExternalGeneric<T>) -> () |
| |
| sil @get_computed_generic_subscript : $@convention(thin) <T: Comparable><U: Hashable> (@in_guaranteed ExternalGeneric<T>, UnsafeRawPointer) -> @out T |
| sil @set_computed_generic_subscript : $@convention(thin) <T: Comparable><U: Hashable> (@in_guaranteed T, @inout ExternalGeneric<T>, UnsafeRawPointer) -> () |
| |
| sil @get_reabstracted : $@convention(thin) <T> (@in_guaranteed ExternalReabstractions<T>) -> @out @callee_guaranteed (@in_guaranteed ()) -> @out () |
| sil @set_reabstracted : $@convention(thin) <T> (@in_guaranteed @callee_guaranteed (@in_guaranteed ()) -> @out (), @inout ExternalReabstractions<T>) -> () |