| // RUN: %target-sil-opt -assume-parsing-unqualified-ownership-sil -enable-sil-verify-all -abcopts %s | %FileCheck %s |
| |
| sil_stage canonical |
| |
| import Builtin |
| import Swift |
| |
| struct ArrayBufferOf { |
| var Ts: Builtin.NativeObject |
| } |
| |
| struct ArrayOf<T> : _DestructorSafeContainer { |
| var Buffer : ArrayBufferOf |
| } |
| |
| struct Foo { |
| @sil_stored var subFoos: ArrayOf<Foo> |
| init() |
| } |
| |
| struct MyInt { |
| var v : Builtin.Int32 |
| } |
| |
| // We used to crash on this example in DestructorAnalysis because the type 'Foo' |
| // is recursive. |
| |
| // CHECK-LABEL: sil @handle_recursive_types |
| |
| sil @handle_recursive_types : $@convention(c) () -> () { |
| bb0: |
| %17 = metatype $@thin ArrayOf<Foo>.Type |
| %18 = function_ref @array_init : $@convention(thin) (@thin ArrayOf<Foo>.Type) -> @owned ArrayOf<Foo> |
| %19 = apply %18(%17) : $@convention(thin) (@thin ArrayOf<Foo>.Type) -> @owned ArrayOf<Foo> |
| %25 = function_ref @array_get_count : $@convention(method) (@owned ArrayOf<Foo>) -> MyInt |
| retain_value %19 : $ArrayOf<Foo> |
| %27 = apply %25(%19) : $@convention(method) (@owned ArrayOf<Foo>) -> MyInt |
| %28 = tuple () |
| release_value %19 : $ArrayOf<Foo> |
| return %28 : $() |
| } |
| |
| sil [serialized] [_semantics "array.init"] @array_init : $@convention(thin) (@thin ArrayOf<Foo>.Type) -> @owned ArrayOf<Foo> |
| |
| sil [serialized] [_semantics "array.get_count"] @array_get_count : $@convention(method) (@owned ArrayOf<Foo>) -> MyInt |