@@ -18,6 +18,10 @@ protocol EmptyP {}
18
18
19
19
struct AddressOnlyStruct : EmptyP { }
20
20
21
+ struct AnyStruct {
22
+ let a : Any
23
+ }
24
+
21
25
func s010_hasVarArg( _ args: Any ... ) { }
22
26
23
27
// Tests Address only enums's construction
@@ -459,6 +463,27 @@ func s260_______AOnly_enum(_ s: AddressOnlyStruct) {
459
463
_ = AddressOnlyEnum . phantom ( s)
460
464
}
461
465
466
+ // Tests InjectOptional for opaque value types + conversion of opaque structs
467
+ // ---
468
+ // CHECK-LABEL: sil hidden @_T020opaque_values_silgen21s270_convOptAnyStructyAA0gH0VADSgcF : $@convention(thin) (@owned @callee_owned (@in Optional<AnyStruct>) -> @out AnyStruct) -> () {
469
+ // CHECK: bb0([[ARG:%.*]] : $@callee_owned (@in Optional<AnyStruct>) -> @out AnyStruct):
470
+ // CHECK: [[BORROWED_ARG:%.*]] = begin_borrow [[ARG]]
471
+ // CHECK: [[COPY_ARG:%.*]] = copy_value [[BORROWED_ARG]]
472
+ // CHECK: [[PAPPLY:%.*]] = partial_apply %{{.*}}([[COPY_ARG]]) : $@convention(thin) (@in Optional<AnyStruct>, @owned @callee_owned (@in Optional<AnyStruct>) -> @out AnyStruct) -> @out Optional<AnyStruct>
473
+ // CHECK: destroy_value [[PAPPLY]] : $@callee_owned (@in Optional<AnyStruct>) -> @out Optional<AnyStruct>
474
+ // CHECK: end_borrow [[BORROWED_ARG]] from [[ARG]] : $@callee_owned (@in Optional<AnyStruct>) -> @out AnyStruct, $@callee_owned (@in Optional<AnyStruct>) -> @out AnyStruct
475
+ // CHECK: [[BORROWED_ARG2:%.*]] = begin_borrow [[ARG]]
476
+ // CHECK: [[COPY_ARG2:%.*]] = copy_value [[BORROWED_ARG2]]
477
+ // CHECK: [[PAPPLY2:%.*]] = partial_apply %{{.*}}([[COPY_ARG2]]) : $@convention(thin) (@in Optional<AnyStruct>, @owned @callee_owned (@in Optional<AnyStruct>) -> @out AnyStruct) -> @out Optional<AnyStruct>
478
+ // CHECK: destroy_value [[PAPPLY2]] : $@callee_owned (@in Optional<AnyStruct>) -> @out Optional<AnyStruct>
479
+ // CHECK: end_borrow [[BORROWED_ARG2]] from [[ARG]] : $@callee_owned (@in Optional<AnyStruct>) -> @out AnyStruct, $@callee_owned (@in Optional<AnyStruct>) -> @out AnyStruct
480
+ // CHECK: destroy_value [[ARG]] : $@callee_owned (@in Optional<AnyStruct>) -> @out AnyStruct
481
+ // CHECK: return %{{.*}} : $()
482
+ // CHECK-LABEL: } // end sil function '_T020opaque_values_silgen21s270_convOptAnyStructyAA0gH0VADSgcF'
483
+ func s270_convOptAnyStruct( _ a1: @escaping ( AnyStruct ? ) -> AnyStruct ) {
484
+ let _: ( AnyStruct ? ) -> AnyStruct ? = a1
485
+ let _: ( AnyStruct ! ) -> AnyStruct ? = a1
486
+ }
462
487
463
488
// Tests conditional value casts and correspondingly generated reabstraction thunk, with <T> types
464
489
// ---
@@ -479,14 +504,23 @@ func s999_____condTFromAny<T>(_ x: Any, _ y: T) {
479
504
}
480
505
}
481
506
482
- // s250_________testBoxT continued Tests Implicit Value Construction under Opaque value mode
507
+ // s250_________testBoxT continued Test Implicit Value Construction under Opaque value mode
483
508
// ---
484
509
// CHECK-LABEL: sil hidden @_T020opaque_values_silgen3BoxVACyxGx1t_tcfC : $@convention(method) <T> (@in T, @thin Box<T>.Type) -> @out Box<T> {
485
510
// CHECK: bb0([[ARG0:%.*]] : $T, [[ARG1:%.*]] : $@thin Box<T>.Type):
486
511
// CHECK: [[RETVAL:%.*]] = struct $Box<T> ([[ARG0]] : $T)
487
512
// CHECK: return [[RETVAL]] : $Box<T>
488
513
// CHECK-LABEL: } // end sil function '_T020opaque_values_silgen3BoxVACyxGx1t_tcfC'
489
514
515
+ // s270_convOptAnyStruct continued Test: reabstraction thunk helper
516
+ // ---
517
+ // CHECK-LABEL: sil shared [transparent] [reabstraction_thunk] @_T020opaque_values_silgen9AnyStructVSgACIxir_A2DIxir_TR : $@convention(thin) (@in Optional<AnyStruct>, @owned @callee_owned (@in Optional<AnyStruct>) -> @out AnyStruct) -> @out Optional<AnyStruct> {
518
+ // CHECK: bb0([[ARG0:%.*]] : $Optional<AnyStruct>, [[ARG1:%.*]] : $@callee_owned (@in Optional<AnyStruct>) -> @out AnyStruct):
519
+ // CHECK: [[APPLYARG:%.*]] = apply [[ARG1]]([[ARG0]]) : $@callee_owned (@in Optional<AnyStruct>) -> @out AnyStruct
520
+ // CHECK: [[RETVAL:%.*]] = enum $Optional<AnyStruct>, #Optional.some!enumelt.1, [[APPLYARG]] : $AnyStruct
521
+ // CHECK: return [[RETVAL]] : $Optional<AnyStruct>
522
+ // CHECK-LABEL: } // end sil function '_T020opaque_values_silgen9AnyStructVSgACIxir_A2DIxir_TR'
523
+
490
524
// 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)
491
525
// 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)):
492
526
// CHECK: [[TUPLE_TO_APPLY0:%.*]] = tuple ([[ARG2]] : $Int, [[ARG3]] : $Int)
0 commit comments