blob: fc454e1388784ca1f1fd86b98eb6f3e0ce92812b [file] [log] [blame]
// RUN: %target-sil-opt -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 {
@_hasStorage 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