@@ -14,6 +14,11 @@ func genericInout<T>(_: inout T) {}
14
14
15
15
func hasVarArg( _ args: Any ... ) { }
16
16
17
+ @_silgen_name ( " sink " )
18
+ func sink< T> ( _ t: consuming T ) { }
19
+ @_silgen_name ( " source " )
20
+ func source< T> ( _ t: T . Type ) -> T
21
+
17
22
// Test array initialization - we are still (somewhat) using addresses
18
23
// ---
19
24
// CHECK-LABEL: sil [ossa] @$s20opaque_values_silgen10callVarArgyyF : $@convention(thin) () -> () {
@@ -797,5 +802,24 @@ func intIntoAnyHashableLet() {
797
802
func consumeExprOfOwnedAddrOnlyValue< T> ( _ t: __owned T) {
798
803
sink ( consume t)
799
804
}
800
- @_silgen_name ( " sink " )
801
- func sink< T> ( _ t: consuming T ) { }
805
+
806
+ // CHECK-LABEL: sil {{.*}}[ossa] @consumeExprOfLoadExprOfOwnedAddrOnlyLValue : {{.*}} {
807
+ // CHECK: [[VAR:%[^,]+]] = alloc_box $<τ_0_0> { var τ_0_0 } <T>
808
+ // CHECK: [[VAR_LIFETIME:%[^,]+]] = begin_borrow [lexical] [[VAR]]
809
+ // CHECK: [[VAR_ADDR:%[^,]+]] = project_box [[VAR_LIFETIME]]
810
+ // CHECK: store {{%[^,]+}} to [init] [[VAR_ADDR]]
811
+ // CHECK: [[VAR_ACCESS:%[^,]+]] = begin_access [modify] [unknown] [[VAR_ADDR]]
812
+ // CHECK: [[TEMPORARY_ADDR:%[^,]+]] = alloc_stack $T
813
+ // CHECK: mark_unresolved_move_addr [[VAR_ACCESS]] to [[TEMPORARY_ADDR]]
814
+ // CHECK: [[TEMPORARY:%[^,]+]] = load [take] [[TEMPORARY_ADDR]]
815
+ // CHECK: end_access [[VAR_ACCESS]]
816
+ // CHECK: [[SINK:%[^,]+]] = function_ref @sink
817
+ // CHECK: apply [[SINK]]<T>([[TEMPORARY]])
818
+ // CHECK: dealloc_stack [[TEMPORARY_ADDR]]
819
+ // CHECK: destroy_value [[VAR]]
820
+ // CHECK-LABEL: } // end sil function 'consumeExprOfLoadExprOfOwnedAddrOnlyLValue'
821
+ @_silgen_name ( " consumeExprOfLoadExprOfOwnedAddrOnlyLValue " )
822
+ func consumeExprOfLoadExprOfOwnedAddrOnlyLValue< T> ( _ ty: T . Type ) {
823
+ var t = source ( ty)
824
+ sink ( consume t)
825
+ }
0 commit comments