|
| 1 | +// RUN: %target-sil-opt -address-lowering -enable-sil-opaque-values -emit-sorted-sil -module-name Swift -sil-verify-all %s | %FileCheck %s |
| 2 | + |
| 3 | +// REQUIRES: objc_interop |
| 4 | + |
| 5 | +import Builtin |
| 6 | + |
| 7 | +typealias AnyObject = Builtin.AnyObject |
| 8 | + |
| 9 | +// The module name must be Swift so that declarations like Error are parsed as the correct loadable type. |
| 10 | + |
| 11 | +struct UnownedBox<T : AnyObject> { |
| 12 | + unowned var value: T |
| 13 | +} |
| 14 | + |
| 15 | +// CHECK-LABEL: sil [ossa] @test_strong_copy_unowned_value : {{.*}} { |
| 16 | +// CHECK: bb0([[INSTANCE_ADDR:%[^,]+]] : |
| 17 | +// CHECK: [[FIELD_ADDR:%[^,]+]] = struct_element_addr [[INSTANCE_ADDR]] |
| 18 | +// CHECK: [[OWNED_VALUE:%[^,]+]] = load_unowned [[FIELD_ADDR]] |
| 19 | +// CHECK: return [[OWNED_VALUE]] |
| 20 | +// CHECK-LABEL: } // end sil function 'test_strong_copy_unowned_value' |
| 21 | +sil [ossa] @test_strong_copy_unowned_value : $@convention(thin) <T where T : AnyObject> (@in_guaranteed UnownedBox<T>) -> @owned T { |
| 22 | +bb0(%instance : @guaranteed $UnownedBox<T>): |
| 23 | + %unowned_value = struct_extract %instance : $UnownedBox<T>, #UnownedBox.value |
| 24 | + %owned_value = strong_copy_unowned_value %unowned_value : $@sil_unowned T |
| 25 | + return %owned_value : $T |
| 26 | +} |
| 27 | + |
| 28 | +// CHECK-LABEL: sil [ossa] @test_unowned_copy_value : {{.*}} { |
| 29 | +// CHECK: bb0([[INSTANCE_OUT:%[^,]+]] : {{.*}}, [[OWNED_VALUE:%[^,]+]] : |
| 30 | +// CHECK: [[FIELD_ADDR:%[^,]+]] = struct_element_addr [[INSTANCE_OUT]] |
| 31 | +// CHECK: store_unowned [[OWNED_VALUE]] to [init] [[FIELD_ADDR]] |
| 32 | +// CHECK: destroy_value [[OWNED_VALUE]] |
| 33 | +// CHECK-LABEL: } // end sil function 'test_unowned_copy_value' |
| 34 | +sil [ossa] @test_unowned_copy_value : $@convention(thin) <T where T : AnyObject> (@owned T) -> @out UnownedBox<T> { |
| 35 | +bb0(%owned_value : @owned $T): |
| 36 | + %unowned_value = unowned_copy_value %owned_value : $T |
| 37 | + destroy_value %owned_value : $T |
| 38 | + %instance = struct $UnownedBox<T> (%unowned_value : $@sil_unowned T) |
| 39 | + return %instance : $UnownedBox<T> |
| 40 | +} |
0 commit comments