// RUN: %target-sil-opt -enable-sil-verify-all -bcopts %s | %FileCheck %s sil_stage canonical import Builtin import Swift struct ArrayBufferOf { var Ts: Builtin.NativeObject } struct ArrayOf : _DestructorSafeContainer { var Buffer : ArrayBufferOf } struct Foo { @_hasStorage var subFoos: ArrayOf 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.Type %18 = function_ref @array_init : $@convention(thin) (@thin ArrayOf.Type) -> @owned ArrayOf %19 = apply %18(%17) : $@convention(thin) (@thin ArrayOf.Type) -> @owned ArrayOf %25 = function_ref @array_get_count : $@convention(method) (@owned ArrayOf) -> MyInt retain_value %19 : $ArrayOf %27 = apply %25(%19) : $@convention(method) (@owned ArrayOf) -> MyInt %28 = tuple () release_value %19 : $ArrayOf return %28 : $() } sil [serialized] [_semantics "array.init"] @array_init : $@convention(thin) (@thin ArrayOf.Type) -> @owned ArrayOf sil [serialized] [_semantics "array.get_count"] @array_get_count : $@convention(method) (@owned ArrayOf) -> MyInt