1
-
2
1
// RUN: %target-swift-emit-silgen -module-name boxed_existentials -Xllvm -sil-full-demangle %s | %FileCheck %s
3
2
// RUN: %target-swift-emit-silgen -module-name boxed_existentials -Xllvm -sil-full-demangle %s | %FileCheck %s --check-prefix=GUARANTEED
4
3
@@ -88,16 +87,17 @@ func test_property_of_lvalue(_ x: Error) -> String {
88
87
// CHECK: store [[ARG_COPY]] to [init] [[PVAR]]
89
88
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[PVAR]] : $*Error
90
89
// CHECK: [[VALUE_BOX:%.*]] = load [copy] [[ACCESS]]
91
- // CHECK: [[VALUE:%.*]] = open_existential_box [[VALUE_BOX]] : $Error to $*[[VALUE_TYPE:@opened\(.*\) Error]]
90
+ // CHECK: [[BORROWED_VALUE_BOX:%.*]] = begin_borrow [[VALUE_BOX]]
91
+ // CHECK: [[VALUE:%.*]] = open_existential_box [[BORROWED_VALUE_BOX]] : $Error to $*[[VALUE_TYPE:@opened\(.*\) Error]]
92
92
// CHECK: [[COPY:%.*]] = alloc_stack $[[VALUE_TYPE]]
93
93
// CHECK: copy_addr [[VALUE]] to [initialization] [[COPY]]
94
+ // CHECK: destroy_value [[VALUE_BOX]]
94
95
// CHECK: [[BORROW:%.*]] = alloc_stack $[[VALUE_TYPE]]
95
96
// CHECK: copy_addr [[COPY]] to [initialization] [[BORROW]]
96
97
// CHECK: [[METHOD:%.*]] = witness_method $[[VALUE_TYPE]], #Error._domain!getter.1
97
98
// CHECK: [[RESULT:%.*]] = apply [[METHOD]]<[[VALUE_TYPE]]>([[BORROW]])
98
99
// CHECK: destroy_addr [[COPY]]
99
100
// CHECK: dealloc_stack [[COPY]]
100
- // CHECK: destroy_value [[VALUE_BOX]]
101
101
// CHECK: destroy_value [[VAR]]
102
102
// CHECK-NOT: destroy_value [[ARG]]
103
103
// CHECK: return [[RESULT]]
@@ -153,7 +153,8 @@ func test_open_existential_semantics(_ guaranteed: Error,
153
153
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[PB]] : $*Error
154
154
// CHECK: [[IMMEDIATE:%.*]] = load [copy] [[ACCESS]]
155
155
// -- need a copy_value to guarantee
156
- // CHECK: [[VALUE:%.*]] = open_existential_box [[IMMEDIATE]]
156
+ // CHECK: [[IMMEDIATE_BORROW:%.*]] = begin_borrow [[IMMEDIATE]]
157
+ // CHECK: [[VALUE:%.*]] = open_existential_box [[IMMEDIATE_BORROW]]
157
158
// CHECK: [[METHOD:%.*]] = function_ref
158
159
// CHECK-NOT: copy_addr
159
160
// CHECK: apply [[METHOD]]<{{.*}}>([[VALUE]])
@@ -165,7 +166,8 @@ func test_open_existential_semantics(_ guaranteed: Error,
165
166
// GUARANTEED: [[ACCESS:%.*]] = begin_access [read] [unknown] [[PB]] : $*Error
166
167
// GUARANTEED: [[IMMEDIATE:%.*]] = load [copy] [[ACCESS]]
167
168
// -- need a copy_value to guarantee
168
- // GUARANTEED: [[VALUE:%.*]] = open_existential_box [[IMMEDIATE]]
169
+ // GUARANTEED: [[BORROWED_IMMEDIATE:%.*]] = begin_borrow [[IMMEDIATE]]
170
+ // GUARANTEED: [[VALUE:%.*]] = open_existential_box [[BORROWED_IMMEDIATE]]
169
171
// GUARANTEED: [[METHOD:%.*]] = function_ref
170
172
// GUARANTEED: apply [[METHOD]]<{{.*}}>([[VALUE]])
171
173
// GUARANTEED-NOT: destroy_addr [[VALUE]]
@@ -175,15 +177,17 @@ func test_open_existential_semantics(_ guaranteed: Error,
175
177
176
178
// CHECK: [[F:%.*]] = function_ref {{.*}}plusOneError
177
179
// CHECK: [[PLUS_ONE:%.*]] = apply [[F]]()
178
- // CHECK: [[VALUE:%.*]] = open_existential_box [[PLUS_ONE]]
180
+ // CHECK: [[PLUS_ONE_BORROW:%.*]] = begin_borrow [[PLUS_ONE]]
181
+ // CHECK: [[VALUE:%.*]] = open_existential_box [[PLUS_ONE_BORROW]]
179
182
// CHECK: [[METHOD:%.*]] = function_ref
180
183
// CHECK-NOT: copy_addr
181
184
// CHECK: apply [[METHOD]]<{{.*}}>([[VALUE]])
182
185
// CHECK: destroy_value [[PLUS_ONE]]
183
186
184
187
// GUARANTEED: [[F:%.*]] = function_ref {{.*}}plusOneError
185
188
// GUARANTEED: [[PLUS_ONE:%.*]] = apply [[F]]()
186
- // GUARANTEED: [[VALUE:%.*]] = open_existential_box [[PLUS_ONE]]
189
+ // GUARANTEED: [[BORROWED_PLUS_ONE:%.*]] = begin_borrow [[PLUS_ONE]]
190
+ // GUARANTEED: [[VALUE:%.*]] = open_existential_box [[BORROWED_PLUS_ONE]]
187
191
// GUARANTEED: [[METHOD:%.*]] = function_ref
188
192
// GUARANTEED: apply [[METHOD]]<{{.*}}>([[VALUE]])
189
193
// GUARANTEED-NOT: destroy_addr [[VALUE]]
@@ -207,15 +211,17 @@ func erasure_to_any(_ guaranteed: Error, _ immediate: Error) -> Any {
207
211
} else if true {
208
212
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unknown] [[PB]]
209
213
// CHECK: [[IMMEDIATE:%.*]] = load [copy] [[ACCESS]]
210
- // CHECK: [[FROM_VALUE:%.*]] = open_existential_box [[IMMEDIATE]]
214
+ // CHECK: [[BORROWED_IMMEDIATE:%.*]] = begin_borrow [[IMMEDIATE]]
215
+ // CHECK: [[FROM_VALUE:%.*]] = open_existential_box [[BORROWED_IMMEDIATE]]
211
216
// CHECK: [[TO_VALUE:%.*]] = init_existential_addr [[OUT]]
212
217
// CHECK: copy_addr [[FROM_VALUE]] to [initialization] [[TO_VALUE]]
213
218
// CHECK: destroy_value [[IMMEDIATE]]
214
219
return immediate
215
220
} else if true {
216
221
// CHECK: function_ref boxed_existentials.plusOneError
217
222
// CHECK: [[PLUS_ONE:%.*]] = apply
218
- // CHECK: [[FROM_VALUE:%.*]] = open_existential_box [[PLUS_ONE]]
223
+ // CHECK: [[BORROWED_PLUS_ONE:%.*]] = begin_borrow [[PLUS_ONE]]
224
+ // CHECK: [[FROM_VALUE:%.*]] = open_existential_box [[BORROWED_PLUS_ONE]]
219
225
// CHECK: [[TO_VALUE:%.*]] = init_existential_addr [[OUT]]
220
226
// CHECK: copy_addr [[FROM_VALUE]] to [initialization] [[TO_VALUE]]
221
227
// CHECK: destroy_value [[PLUS_ONE]]
@@ -236,7 +242,8 @@ extension Error {
236
242
// CHECK: [[ARRAY_GET:%.*]] = function_ref @$sSayxSicig
237
243
// CHECK: apply [[ARRAY_GET]]<Error>([[ERROR_ADDR]]
238
244
// CHECK: [[ERROR:%.*]] = load [take] [[ERROR_ADDR]] : $*Error
239
- // CHECK: open_existential_box [[ERROR]]
245
+ // CHECK: [[BORROWED_ERROR:%.*]] = begin_borrow [[ERROR]]
246
+ // CHECK: open_existential_box [[BORROWED_ERROR]]
240
247
func test( ) {
241
248
var errors : [ Error ] = [ ]
242
249
test_property ( errors [ 0 ] . myError)
0 commit comments