|
1 |
| -// RUN: %target-sil-opt -address-lowering -enable-sil-opaque-values -sil-verify-all %s | %FileCheck %s |
| 1 | +// RUN: %target-sil-opt -address-lowering -emit-sorted-sil -enable-sil-opaque-values -sil-verify-all %s | %FileCheck %s |
2 | 2 | //
|
3 | 3 | import Builtin
|
4 | 4 | import Swift
|
@@ -29,3 +29,34 @@ bb0(%0 : @owned $Error):
|
29 | 29 | %ret = tuple ()
|
30 | 30 | return %ret : $()
|
31 | 31 | }
|
| 32 | + |
| 33 | +struct WeakBox<T : AnyObject> { |
| 34 | + weak var t: T? |
| 35 | +} |
| 36 | + |
| 37 | +// CHECK-LABEL: sil [ossa] @test_strong_copy_weak_value : {{.*}} { |
| 38 | +// CHECK: {{bb[0-9]+}}([[BOX_ADDR:%[^,]+]] : |
| 39 | +// CHECK: [[VALUE_ADDR:%[^,]+]] = struct_element_addr [[BOX_ADDR]] : {{.*}}, #WeakBox.t |
| 40 | +// CHECK: [[VALUE:%[^,]+]] = load_weak [[VALUE_ADDR]] : $*@sil_weak Optional<T> |
| 41 | +// CHECK: return [[VALUE]] : $Optional<T> |
| 42 | +// CHECK-LABEL: } // end sil function 'test_strong_copy_weak_value' |
| 43 | +sil [ossa] @test_strong_copy_weak_value : $@convention(thin) <T where T : AnyObject> (@in_guaranteed WeakBox<T>) -> @owned Optional<T> { |
| 44 | +bb0(%instance : @guaranteed $WeakBox<T>): |
| 45 | + %weak_optional = struct_extract %instance : $WeakBox<T>, #WeakBox.t |
| 46 | + %strong_optional = strong_copy_weak_value %weak_optional : $@sil_weak Optional<T> |
| 47 | + return %strong_optional : $Optional<T> |
| 48 | +} |
| 49 | + |
| 50 | +// CHECK-LABEL: sil [ossa] @test_weak_copy_value_1 : {{.*}} { |
| 51 | +// CHECK: {{bb[0-9]+}}([[RETVAL:%[^,]+]] : $*WeakBox<T>, [[VALUE:%[^,]+]] : |
| 52 | +// CHECK: [[VALUE_ADDR:%[^,]+]] = struct_element_addr [[RETVAL]] : {{.*}}, #WeakBox.t |
| 53 | +// CHECK: store_weak [[VALUE]] to [init] [[VALUE_ADDR]] |
| 54 | +// CHECK: destroy_value [[VALUE]] |
| 55 | +// CHECK-LABEL: } // end sil function 'test_weak_copy_value_1' |
| 56 | +sil [ossa] @test_weak_copy_value_1 : $@convention(thin) <T where T : AnyObject> (@owned Optional<T>) -> @out WeakBox<T> { |
| 57 | +bb0(%value : @owned $Optional<T>): |
| 58 | + %weak_value = weak_copy_value %value : $Optional<T> |
| 59 | + destroy_value %value : $Optional<T> |
| 60 | + %retval = struct $WeakBox<T> (%weak_value : $@sil_weak Optional<T>) |
| 61 | + return %retval : $WeakBox<T> |
| 62 | +} |
0 commit comments