Files
swift-mirror/test/SILOptimizer/destructor_analysis.sil
Slava Pestov 8fe8b89b0f SIL: Terminology change: [fragile] => [serialized]
Also, add a third [serializable] state for functions whose bodies we
*can* serialize, but only do so if they're referenced from another
serialized function.

This will be used for bodies synthesized for imported definitions,
such as init(rawValue:), etc, and various thunks, but for now this
change is NFC.
2017-03-29 16:47:28 -07:00

46 lines
1.3 KiB
Plaintext

// 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