@@ -359,6 +359,30 @@ func s220_____openExistBox(_ x: Error) -> String {
359
359
// CHECK: bb6:
360
360
// CHECK: return %{{.*}} : $()
361
361
// CHECK-LABEL: } // end sil function '_T020opaque_values_silgen21s230______condFromAnyyypF'
362
+ func s230______condFromAny( _ x: Any ) {
363
+ if let f = x as? ( Int , ( Int , ( Int , Int ) ) , Int ) -> ( Int , ( Int , ( Int , Int ) ) , Int ) {
364
+ _ = f ( 24 , ( 4 , ( 2 , 42 ) ) , 42 )
365
+ }
366
+ }
367
+
368
+ // Tests conditional value casts and correspondingly generated reabstraction thunk, with <T> types
369
+ // ---
370
+ // CHECK-LABEL: sil hidden @_T020opaque_values_silgen21s240_____condTFromAnyyyp_xtlF : $@convention(thin) <T> (@in Any, @in T) -> () {
371
+ // CHECK: bb0([[ARG0:%.*]] : $Any, [[ARG1:%.*]] : $T):
372
+ // CHECK: [[BORROWED_ARG:%.*]] = begin_borrow [[ARG0]]
373
+ // CHECK: [[COPY__ARG:%.*]] = copy_value [[BORROWED_ARG]]
374
+ // CHECK: checked_cast_value_br [[COPY__ARG]] : $Any to $@callee_owned (@in (Int, T)) -> @out (Int, T), bb2, bb1
375
+ // CHECK: bb2([[THUNK_PARAM:%.*]] : $@callee_owned (@in (Int, T)) -> @out (Int, T)):
376
+ // CHECK: [[THUNK_REF:%.*]] = function_ref @{{.*}} : $@convention(thin) <τ_0_0> (Int, @in τ_0_0, @owned @callee_owned (@in (Int, τ_0_0)) -> @out (Int, τ_0_0)) -> (Int, @out τ_0_0)
377
+ // CHECK: partial_apply [[THUNK_REF]]<T>([[THUNK_PARAM]])
378
+ // CHECK: bb6:
379
+ // CHECK: return %{{.*}} : $()
380
+ // CHECK-LABEL: } // end sil function '_T020opaque_values_silgen21s240_____condTFromAnyyyp_xtlF'
381
+ func s240_____condTFromAny< T> ( _ x: Any , _ y: T ) {
382
+ if let f = x as? ( Int , T ) -> ( Int , T ) {
383
+ f ( 42 , y)
384
+ }
385
+ }
362
386
// CHECK-LABEL: sil shared [transparent] [reabstraction_thunk] @{{.*}} : $@convention(thin) (Int, Int, Int, Int, Int, @owned @callee_owned (@in (Int, (Int, (Int, Int)), Int)) -> @out (Int, (Int, (Int, Int)), Int)) -> (Int, Int, Int, Int, Int)
363
387
// CHECK: bb0([[ARG0:%.*]] : $Int, [[ARG1:%.*]] : $Int, [[ARG2:%.*]] : $Int, [[ARG3:%.*]] : $Int, [[ARG4:%.*]] : $Int, [[ARG5:%.*]] : $@callee_owned (@in (Int, (Int, (Int, Int)), Int)) -> @out (Int, (Int, (Int, Int)), Int)):
364
388
// CHECK: [[TUPLE_TO_APPLY0:%.*]] = tuple ([[ARG2]] : $Int, [[ARG3]] : $Int)
@@ -375,11 +399,21 @@ func s220_____openExistBox(_ x: Error) -> String {
375
399
// CHECK: [[RET_VAL_TUPLE:%.*]] = tuple ([[RET_VAL0]] : $Int, [[RET_VAL1]] : $Int, [[RET_VAL2]] : $Int, [[RET_VAL3]] : $Int, [[RET_VAL4]] : $Int)
376
400
// CHECK: return [[RET_VAL_TUPLE]] : $(Int, Int, Int, Int, Int)
377
401
// CHECK-LABEL: } // end sil function '{{.*}}'
378
- func s230______condFromAny( _ x: Any ) {
379
- if let f = x as? ( Int , ( Int , ( Int , Int ) ) , Int ) -> ( Int , ( Int , ( Int , Int ) ) , Int ) {
380
- _ = f ( 24 , ( 4 , ( 2 , 42 ) ) , 42 )
381
- }
382
- }
402
+
403
+ // CHECK-LABEL: sil shared [transparent] [reabstraction_thunk] @{{.*}} : $@convention(thin) <T> (Int, @in T, @owned @callee_owned (@in (Int, T)) -> @out (Int, T)) -> (Int, @out T) {
404
+ // CHECK: bb0([[ARG0:%.*]] : $Int, [[ARG1:%.*]] : $T, [[ARG2:%.*]] : $@callee_owned (@in (Int, T)) -> @out (Int, T)):
405
+ // CHECK: [[TUPLE_TO_APPLY:%.*]] = tuple ([[ARG0]] : $Int, [[ARG1]] : $T)
406
+ // CHECK: [[TUPLE_APPLY:%.*]] = apply [[ARG2]]([[TUPLE_TO_APPLY]]) : $@callee_owned (@in (Int, T)) -> @out (Int, T)
407
+ // CHECK: [[TUPLE_BORROW:%.*]] = begin_borrow [[TUPLE_APPLY]] : $(Int, T)
408
+ // CHECK: [[RET_VAL0:%.*]] = tuple_extract [[TUPLE_BORROW]] : $(Int, T), 0
409
+ // CHECK: [[TUPLE_EXTRACT:%.*]] = tuple_extract [[TUPLE_BORROW]] : $(Int, T), 1
410
+ // CHECK: [[RET_VAL1:%.*]] = copy_value [[TUPLE_EXTRACT]] : $T
411
+ // CHECK: end_borrow [[TUPLE_BORROW]] from [[TUPLE_APPLY]] : $(Int, T), $(Int, T)
412
+ // CHECK: destroy_value [[TUPLE_APPLY]] : $(Int, T)
413
+ // CHECK: [[RET_VAL_TUPLE:%.*]] = tuple ([[RET_VAL0]] : $Int, [[RET_VAL1]] : $T)
414
+ // CHECK: return [[RET_VAL_TUPLE]] : $(Int, T)
415
+ // CHECK-LABEL: } // end sil function '{{.*}}'
416
+
383
417
384
418
// Tests LogicalPathComponent's writeback for opaque value types
385
419
// ---
0 commit comments