|
| 1 | +// RUN: %empty-directory(%t) |
| 2 | +// RUN: split-file %s %t |
| 3 | + |
| 4 | +// RUN: %target-swift-frontend -emit-module %t/Utils.swift \ |
| 5 | +// RUN: -module-name Utils -swift-version 5 -I %t \ |
| 6 | +// RUN: -package-name mypkg \ |
| 7 | +// RUN: -enable-library-evolution \ |
| 8 | +// RUN: -emit-module -emit-module-path %t/Utils.swiftmodule |
| 9 | + |
| 10 | +// RUN: %target-swift-frontend -typecheck %t/Client.swift -I %t -swift-version 5 -package-name mypkg -verify |
| 11 | + |
| 12 | +// RUN: %target-swift-frontend -emit-sil %t/Client.swift -package-name mypkg -I %t > %t/Client.sil |
| 13 | +// RUN: %FileCheck %s < %t/Client.sil |
| 14 | + |
| 15 | + |
| 16 | +//--- Utils.swift |
| 17 | + |
| 18 | +// Resilient; public. Acessed indirectly. |
| 19 | +public struct PublicStruct { |
| 20 | + public var data: Int |
| 21 | +} |
| 22 | + |
| 23 | +// Non-resilient; non-public. Accessed directly. |
| 24 | +package struct PkgStruct { |
| 25 | + package var data: Int |
| 26 | +} |
| 27 | + |
| 28 | +// Non-resilient but accessed indirectly since generic. |
| 29 | +package struct PkgStructGeneric<T> { |
| 30 | + package var data: T |
| 31 | +} |
| 32 | + |
| 33 | +// Non-resilient but accessed indirectly; member is of a resilient type. |
| 34 | +package struct PkgStructWithPublicMember { |
| 35 | + package var member: PublicStruct |
| 36 | +} |
| 37 | + |
| 38 | +// Non-resilient but accessed indirectly; contains existential. |
| 39 | +package struct PkgStructWithPublicExistential { |
| 40 | + package var member: any PublicProto |
| 41 | +} |
| 42 | + |
| 43 | +// Non-resilient but accessed indirectly; contains existential. |
| 44 | +package struct PkgStructWithPkgExistential { |
| 45 | + package var member: any PkgProto |
| 46 | +} |
| 47 | + |
| 48 | +// Resilient; public. Acessed indirectly. |
| 49 | +public protocol PublicProto { |
| 50 | + var data: Int { get set } |
| 51 | +} |
| 52 | + |
| 53 | +// Non-resilient but acessed indirectly; existential. |
| 54 | +package protocol PkgProto { |
| 55 | + var data: Int { get set } |
| 56 | +} |
| 57 | + |
| 58 | + |
| 59 | +//--- Client.swift |
| 60 | +import Utils |
| 61 | + |
| 62 | +package func f(_ arg: PublicStruct) -> Int { |
| 63 | + return arg.data |
| 64 | +} |
| 65 | + |
| 66 | +// CHECK: // f(_:) |
| 67 | +// CHECK-NEXT: sil @$s6Client1fySi5Utils12PublicStructVF : $@convention(thin) (@in_guaranteed PublicStruct) -> Int { |
| 68 | +// CHECK-NEXT: // %0 "arg" // users: %3, %1 |
| 69 | +// CHECK-NEXT: bb0(%0 : $*PublicStruct): |
| 70 | +// CHECK-NEXT: debug_value %0 : $*PublicStruct, let, name "arg", argno 1, expr op_deref // id: %1 |
| 71 | +// CHECK-NEXT: %2 = alloc_stack $PublicStruct // users: %7, %6, %5, %3 |
| 72 | +// CHECK-NEXT: copy_addr %0 to [init] %2 : $*PublicStruct // id: %3 |
| 73 | +// CHECK-NEXT: // function_ref PublicStruct.data.getter |
| 74 | +// CHECK-NEXT: %4 = function_ref @$s5Utils12PublicStructV4dataSivg : $@convention(method) (@in_guaranteed PublicStruct) -> Int // user: %5 |
| 75 | +// CHECK-NEXT: %5 = apply %4(%2) : $@convention(method) (@in_guaranteed PublicStruct) -> Int // user: %8 |
| 76 | +// CHECK-NEXT: destroy_addr %2 : $*PublicStruct // id: %6 |
| 77 | +// CHECK-NEXT: dealloc_stack %2 : $*PublicStruct // id: %7 |
| 78 | +// CHECK-NEXT: return %5 : $Int // id: %8 |
| 79 | +// CHECK-NEXT: } // end sil function '$s6Client1fySi5Utils12PublicStructVF' |
| 80 | + |
| 81 | + |
| 82 | +package func g(_ arg: PkgStruct) -> Int { |
| 83 | + return arg.data |
| 84 | +} |
| 85 | + |
| 86 | +// CHECK: // g(_:) |
| 87 | +// CHECK-NEXT: sil @$s6Client1gySi5Utils9PkgStructVF : $@convention(thin) (PkgStruct) -> Int { |
| 88 | +// CHECK-NEXT: // %0 "arg" // users: %2, %1 |
| 89 | +// CHECK-NEXT: bb0(%0 : $PkgStruct): |
| 90 | +// CHECK-NEXT: debug_value %0 : $PkgStruct, let, name "arg", argno 1 // id: %1 |
| 91 | +// CHECK-NEXT: %2 = struct_extract %0 : $PkgStruct, #PkgStruct.data // user: %3 |
| 92 | +// CHECK-NEXT: return %2 : $Int // id: %3 |
| 93 | +// CHECK-NEXT: } // end sil function '$s6Client1gySi5Utils9PkgStructVF' |
| 94 | + |
| 95 | +package func m<T>(_ arg: PkgStructGeneric<T>) -> T { |
| 96 | + return arg.data |
| 97 | +} |
| 98 | + |
| 99 | +// CHECK: // m<A>(_:) |
| 100 | +// CHECK-NEXT: sil @$s6Client1myx5Utils16PkgStructGenericVyxGlF : $@convention(thin) <T> (@in_guaranteed PkgStructGeneric<T>) -> @out T { |
| 101 | +// CHECK-NEXT: // %0 "$return_value" // user: %4 |
| 102 | +// CHECK-NEXT: // %1 "arg" // users: %3, %2 |
| 103 | +// CHECK-NEXT: bb0(%0 : $*T, %1 : $*PkgStructGeneric<T>): |
| 104 | +// CHECK-NEXT: debug_value %1 : $*PkgStructGeneric<T>, let, name "arg", argno 1, expr op_deref // id: %2 |
| 105 | +// CHECK-NEXT: %3 = struct_element_addr %1 : $*PkgStructGeneric<T>, #PkgStructGeneric.data // user: %4 |
| 106 | +// CHECK-NEXT: copy_addr %3 to [init] %0 : $*T // id: %4 |
| 107 | +// CHECK-NEXT: %5 = tuple () // user: %6 |
| 108 | +// CHECK-NEXT: return %5 : $() // id: %6 |
| 109 | +// CHECK-NEXT: } // end sil function '$s6Client1myx5Utils16PkgStructGenericVyxGlF' |
| 110 | + |
| 111 | +package func n(_ arg: PkgStructWithPublicMember) -> Int { |
| 112 | + return arg.member.data |
| 113 | +} |
| 114 | + |
| 115 | +// CHECK: // n(_:) |
| 116 | +// CHECK-NEXT: sil @$s6Client1nySi5Utils25PkgStructWithPublicMemberVF : $@convention(thin) (@in_guaranteed PkgStructWithPublicMember) -> Int { |
| 117 | +// CHECK-NEXT: // %0 "arg" // users: %2, %1 |
| 118 | +// CHECK-NEXT: bb0(%0 : $*PkgStructWithPublicMember): |
| 119 | +// CHECK-NEXT: debug_value %0 : $*PkgStructWithPublicMember, let, name "arg", argno 1, expr op_deref // id: %1 |
| 120 | +// CHECK-NEXT: %2 = struct_element_addr %0 : $*PkgStructWithPublicMember, #PkgStructWithPublicMember.member // user: %4 |
| 121 | +// CHECK-NEXT: %3 = alloc_stack $PublicStruct // users: %12, %10, %6, %4 |
| 122 | +// CHECK-NEXT: copy_addr %2 to [init] %3 : $*PublicStruct // id: %4 |
| 123 | +// CHECK-NEXT: %5 = alloc_stack $PublicStruct // users: %11, %9, %8, %6 |
| 124 | +// CHECK-NEXT: copy_addr %3 to [init] %5 : $*PublicStruct // id: %6 |
| 125 | +// CHECK-NEXT: // function_ref PublicStruct.data.getter |
| 126 | +// CHECK-NEXT: %7 = function_ref @$s5Utils12PublicStructV4dataSivg : $@convention(method) (@in_guaranteed PublicStruct) -> Int // user: %8 |
| 127 | +// CHECK-NEXT: %8 = apply %7(%5) : $@convention(method) (@in_guaranteed PublicStruct) -> Int // user: %13 |
| 128 | +// CHECK-NEXT: destroy_addr %5 : $*PublicStruct // id: %9 |
| 129 | +// CHECK-NEXT: destroy_addr %3 : $*PublicStruct // id: %10 |
| 130 | +// CHECK-NEXT: dealloc_stack %5 : $*PublicStruct // id: %11 |
| 131 | +// CHECK-NEXT: dealloc_stack %3 : $*PublicStruct // id: %12 |
| 132 | +// CHECK-NEXT: return %8 : $Int // id: %13 |
| 133 | +// CHECK-NEXT: } // end sil function '$s6Client1nySi5Utils25PkgStructWithPublicMemberVF' |
| 134 | + |
| 135 | +package func p(_ arg: PkgStructWithPublicExistential) -> any PublicProto { |
| 136 | + return arg.member |
| 137 | +} |
| 138 | + |
| 139 | +// CHECK: // p(_:) |
| 140 | +// CHECK-NEXT: sil @$s6Client1py5Utils11PublicProto_pAC013PkgStructWithC11ExistentialVF : $@convention(thin) (@in_guaranteed PkgStructWithPublicExistential) -> @out any PublicProto { |
| 141 | +// CHECK-NEXT: // %0 "$return_value" // user: %4 |
| 142 | +// CHECK-NEXT: // %1 "arg" // users: %3, %2 |
| 143 | +// CHECK-NEXT: bb0(%0 : $*any PublicProto, %1 : $*PkgStructWithPublicExistential): |
| 144 | +// CHECK-NEXT: debug_value %1 : $*PkgStructWithPublicExistential, let, name "arg", argno 1, expr op_deref // id: %2 |
| 145 | +// CHECK-NEXT: %3 = struct_element_addr %1 : $*PkgStructWithPublicExistential, #PkgStructWithPublicExistential.member // user: %4 |
| 146 | +// CHECK-NEXT: copy_addr %3 to [init] %0 : $*any PublicProto // id: %4 |
| 147 | +// CHECK-NEXT: %5 = tuple () // user: %6 |
| 148 | +// CHECK-NEXT: return %5 : $() // id: %6 |
| 149 | +// CHECK-NEXT: } // end sil function '$s6Client1py5Utils11PublicProto_pAC013PkgStructWithC11ExistentialVF' |
| 150 | + |
| 151 | +package func q(_ arg: PkgStructWithPkgExistential) -> any PkgProto { |
| 152 | + return arg.member |
| 153 | +} |
| 154 | + |
| 155 | +// CHECK: // q(_:) |
| 156 | +// CHECK-NEXT: sil @$s6Client1qy5Utils8PkgProto_pAC0c10StructWithC11ExistentialVF : $@convention(thin) (@in_guaranteed PkgStructWithPkgExistential) -> @out any PkgProto { |
| 157 | +// CHECK-NEXT: // %0 "$return_value" // user: %4 |
| 158 | +// CHECK-NEXT: // %1 "arg" // users: %3, %2 |
| 159 | +// CHECK-NEXT: bb0(%0 : $*any PkgProto, %1 : $*PkgStructWithPkgExistential): |
| 160 | +// CHECK-NEXT: debug_value %1 : $*PkgStructWithPkgExistential, let, name "arg", argno 1, expr op_deref // id: %2 |
| 161 | +// CHECK-NEXT: %3 = struct_element_addr %1 : $*PkgStructWithPkgExistential, #PkgStructWithPkgExistential.member // user: %4 |
| 162 | +// CHECK-NEXT: copy_addr %3 to [init] %0 : $*any PkgProto // id: %4 |
| 163 | +// CHECK-NEXT: %5 = tuple () // user: %6 |
| 164 | +// CHECK-NEXT: return %5 : $() // id: %6 |
| 165 | +// CHECK-NEXT: } // end sil function '$s6Client1qy5Utils8PkgProto_pAC0c10StructWithC11ExistentialVF' |
| 166 | + |
| 167 | +package func r(_ arg: PublicProto) -> Int { |
| 168 | + return arg.data |
| 169 | +} |
| 170 | + |
| 171 | +// CHECK: // r(_:) |
| 172 | +// CHECK-NEXT: sil @$s6Client1rySi5Utils11PublicProto_pF : $@convention(thin) (@in_guaranteed any PublicProto) -> Int { |
| 173 | +// CHECK-NEXT: // %0 "arg" // users: %2, %1 |
| 174 | +// CHECK-NEXT: bb0(%0 : $*any PublicProto): |
| 175 | +// CHECK-NEXT: debug_value %0 : $*any PublicProto, let, name "arg", argno 1, expr op_deref // id: %1 |
| 176 | +// CHECK-NEXT: %2 = open_existential_addr immutable_access %0 : $*any PublicProto |
| 177 | +// CHECK-NEXT: %3 = alloc_stack $@opened |
| 178 | +// CHECK-NEXT: copy_addr %2 to [init] %3 : $*@opened |
| 179 | +// CHECK-NEXT: %5 = witness_method $@opened |
| 180 | +// CHECK-NEXT: %6 = apply %5<@opened |
| 181 | +// CHECK-NEXT: destroy_addr %3 : $*@opened |
| 182 | +// CHECK-NEXT: dealloc_stack %3 : $*@opened |
| 183 | +// CHECK-NEXT: return %6 : $Int |
| 184 | +// CHECK-NEXT: } // end sil function '$s6Client1rySi5Utils11PublicProto_pF' |
| 185 | + |
| 186 | +package func s(_ arg: PkgProto) -> Int { |
| 187 | + return arg.data |
| 188 | +} |
| 189 | +// CHECK: // s(_:) |
| 190 | +// CHECK-NEXT: sil @$s6Client1sySi5Utils8PkgProto_pF : $@convention(thin) (@in_guaranteed any PkgProto) -> Int { |
| 191 | +// CHECK-NEXT: // %0 "arg" // users: %2, %1 |
| 192 | +// CHECK-NEXT: bb0(%0 : $*any PkgProto): |
| 193 | +// CHECK-NEXT: debug_value %0 : $*any PkgProto, let, name "arg", argno 1, expr op_deref // id: %1 |
| 194 | +// CHECK-NEXT: %2 = open_existential_addr immutable_access %0 : $*any PkgProto to $*@opened |
| 195 | +// CHECK-NEXT: %3 = alloc_stack $@opened |
| 196 | +// CHECK-NEXT: copy_addr %2 to [init] %3 : $*@opened |
| 197 | +// CHECK-NEXT: %5 = witness_method $@opened |
| 198 | +// CHECK-NEXT: %6 = apply %5<@opened |
| 199 | +// CHECK-NEXT: destroy_addr %3 : $*@opened |
| 200 | +// CHECK-NEXT: dealloc_stack %3 : $*@opened |
| 201 | +// CHECK-NEXT: return %6 : $Int |
| 202 | +// CHECK-NEXT: } // end sil function '$s6Client1sySi5Utils8PkgProto_pF' |
| 203 | + |
0 commit comments