blob: 77c1bba0baeff9118302e7d46b1db5c92b1147fa [file] [log] [blame]
// RUN: %target-sil-opt -enable-sil-verify-all %s -inline -specdevirt -code-sinking -sil-verify-without-invalidation
sil_stage canonical
import Builtin
import Swift
public class Foo {
deinit
func doSomething() -> Foo
init()
}
public class Foo2 : Foo {
deinit
override func doSomething() -> Foo
override init()
}
// test.Foo.doSomething (test.Foo)() -> test.Foo
sil hidden_external @_TFC4test3Foo11doSomethingfS0_FT_S0_ : $@convention(method) (@guaranteed Foo) -> @owned Foo
// test.Foo.init (test.Foo.Type)() -> test.Foo
sil hidden_external @_TFC4test3FoocfMS0_FT_S0_ : $@convention(method) (@owned Foo) -> @owned Foo
// test.Foo2.doSomething (test.Foo2)() -> test.Foo
sil hidden @_TFC4test4Foo211doSomethingfS0_FT_CS_3Foo : $@convention(method) (@guaranteed Foo2) -> @owned Foo {
bb0(%0 : $Foo2):
debug_value %0 : $Foo2 // id: %1
strong_retain %0 : $Foo2 // id: %2
%3 = upcast %0 : $Foo2 to $Foo // user: %4
return %3 : $Foo // id: %4
}
// test.Foo2.__deallocating_deinit
sil @_TFC4test4Foo2D : $@convention(method) (@owned Foo2) -> () {
bb0(%0 : $Foo2):
debug_value %0 : $Foo2 // id: %1
%2 = upcast %0 : $Foo2 to $Foo // user: %4
// function_ref test.Foo.deinit
%3 = function_ref @_TFC4test3Food : $@convention(method) (@guaranteed Foo) -> @owned Builtin.NativeObject // user: %4
%4 = apply %3(%2) : $@convention(method) (@guaranteed Foo) -> @owned Builtin.NativeObject // user: %5
%5 = unchecked_ref_cast %4 : $Builtin.NativeObject to $Foo2 // user: %6
dealloc_ref %5 : $Foo2 // id: %6
%7 = tuple () // user: %8
return %7 : $() // id: %8
}
// test.Foo2.deinit
sil @_TFC4test4Foo2d : $@convention(method) (@guaranteed Foo2) -> @owned Builtin.NativeObject {
bb0(%0 : $Foo2):
debug_value %0 : $Foo2 // id: %1
%2 = upcast %0 : $Foo2 to $Foo // user: %4
// function_ref test.Foo.deinit
%3 = function_ref @_TFC4test3Food : $@convention(method) (@guaranteed Foo) -> @owned Builtin.NativeObject // user: %4
%4 = apply %3(%2) : $@convention(method) (@guaranteed Foo) -> @owned Builtin.NativeObject // user: %5
return %4 : $Builtin.NativeObject // id: %5
}
// test.Foo.deinit
sil @_TFC4test3Food : $@convention(method) (@guaranteed Foo) -> @owned Builtin.NativeObject
// test.Foo2.init (test.Foo2.Type)() -> test.Foo2
sil hidden @_TFC4test4Foo2cfMS0_FT_S0_ : $@convention(method) (@owned Foo2) -> @owned Foo2 {
bb0(%0 : $Foo2):
%1 = alloc_stack $Foo2 // users: %2, %6, %9, %10
store %0 to %1 : $*Foo2 // id: %2
%3 = upcast %0 : $Foo2 to $Foo // user: %7
// function_ref test.Foo.init (test.Foo.Type)() -> test.Foo
%4 = function_ref @_TFC4test3FoocfMS0_FT_S0_ : $@convention(method) (@owned Foo) -> @owned Foo // user: %7
%7 = apply %4(%3) : $@convention(method) (@owned Foo) -> @owned Foo // user: %8
%8 = unchecked_ref_cast %7 : $Foo to $Foo2 // users: %9, %11
store %8 to %1 : $*Foo2 // id: %9
dealloc_stack %1 : $*Foo2 // id: %10
return %8 : $Foo2 // id: %11
}
// test.Foo2.__allocating_init (test.Foo2.Type)() -> test.Foo2
sil hidden @_TFC4test4Foo2CfMS0_FT_S0_ : $@convention(thin) (@thick Foo2.Type) -> @owned Foo2 {
bb0(%0 : $@thick Foo2.Type):
%1 = alloc_ref $Foo2 // users: %3, %4
%2 = alloc_stack $Foo2 // users: %3, %7, %10, %11
store %1 to %2 : $*Foo2 // id: %3
%4 = upcast %1 : $Foo2 to $Foo // user: %8
// function_ref test.Foo.init (test.Foo.Type)() -> test.Foo
%5 = function_ref @_TFC4test3FoocfMS0_FT_S0_ : $@convention(method) (@owned Foo) -> @owned Foo // user: %8
%8 = apply %5(%4) : $@convention(method) (@owned Foo) -> @owned Foo // user: %9
%9 = unchecked_ref_cast %8 : $Foo to $Foo2 // users: %10, %12
store %9 to %2 : $*Foo2 // id: %10
dealloc_stack %2 : $*Foo2 // id: %11
return %9 : $Foo2 // id: %12
}
// test.main (test.Foo) -> test.Foo
sil hidden @_TF4test4mainFCS_3FooS0_ : $@convention(thin) (@owned Foo) -> @owned Foo {
bb0(%0 : $Foo):
debug_value %0 : $Foo // id: %1
%2 = class_method %0 : $Foo, #Foo.doSomething!1 : (Foo) -> () -> Foo, $@convention(method) (@guaranteed Foo) -> @owned Foo // user: %3
%3 = apply %2(%0) : $@convention(method) (@guaranteed Foo) -> @owned Foo // user: %5
strong_release %0 : $Foo // id: %4
return %3 : $Foo // id: %5
}
sil_vtable Foo2 {
#Foo.doSomething!1: @_TFC4test4Foo211doSomethingfS0_FT_CS_3Foo // test.Foo2.doSomething (test.Foo2)() -> test.Foo
#Foo.init!initializer.1: @_TFC4test4Foo2cfMS0_FT_S0_ // test.Foo2.init (test.Foo2.Type)() -> test.Foo2
#Foo2.deinit!deallocator.1: @_TFC4test4Foo2D // test.Foo2.__deallocating_deinit
}