| // RUN: %target-sil-opt -assume-parsing-unqualified-ownership-sil -enable-sil-verify-all %s -sil-combine | %FileCheck %s |
| |
| sil_stage canonical |
| |
| import Builtin |
| import Swift |
| |
| class Foo { |
| } |
| |
| |
| sil @_TFC4main3Food : $@convention(method) (@owned Foo) -> @owned Builtin.NativeObject { |
| bb0(%0 : $Foo): |
| debug_value %0 : $Foo, let, name "self" // id: %1 |
| %2 = unchecked_ref_cast %0 : $Foo to $Builtin.NativeObject // user: %3 |
| return %2 : $Builtin.NativeObject // id: %3 |
| } |
| |
| sil @_TFC4main3FooD : $@convention(method) (@owned Foo) -> () { |
| bb0(%0 : $Foo): |
| debug_value %0 : $Foo, let, name "self" // id: %1 |
| // function_ref main.Foo.deinit |
| %2 = function_ref @_TFC4main3Food : $@convention(method) (@owned Foo) -> @owned Builtin.NativeObject // user: %3 |
| %3 = apply %2(%0) : $@convention(method) (@owned Foo) -> @owned Builtin.NativeObject // user: %4 |
| %4 = unchecked_ref_cast %3 : $Builtin.NativeObject to $Foo // user: %5 |
| dealloc_ref %4 : $Foo // id: %5 |
| %6 = tuple () // user: %7 |
| return %6 : $() // id: %7 |
| } |
| |
| sil @_TFC4main3FoocfMS0_FT_S0_ : $@convention(method) (@owned Foo) -> @owned Foo { |
| bb0(%0 : $Foo): |
| debug_value %0 : $Foo, let, name "self" // id: %1 |
| return %0 : $Foo // id: %2 |
| } |
| |
| sil @_TFC4main3FooCfMS0_FT_S0_ : $@convention(thin) (@thick Foo.Type) -> @owned Foo { |
| bb0(%0 : $@thick Foo.Type): |
| %1 = alloc_ref $Foo // user: %3 |
| // function_ref main.Foo.init (main.Foo.Type)() -> main.Foo |
| %2 = function_ref @_TFC4main3FoocfMS0_FT_S0_ : $@convention(method) (@owned Foo) -> @owned Foo // user: %3 |
| %3 = apply %2(%1) : $@convention(method) (@owned Foo) -> @owned Foo // user: %4 |
| return %3 : $Foo // id: %4 |
| } |
| |
| sil [readonly] @_TF4main9readonly_funcFT_CS_3Foo : $@convention(thin) () -> @owned Foo { |
| bb0: |
| // function_ref main.Foo.__allocating_init (main.Foo.Type)() -> main.Foo |
| %0 = function_ref @_TFC4main3FooCfMS0_FT_S0_ : $@convention(thin) (@thick Foo.Type) -> @owned Foo // user: %2 |
| %1 = metatype $@thick Foo.Type // user: %2 |
| %2 = apply %0(%1) : $@convention(thin) (@thick Foo.Type) -> @owned Foo // user: %3 |
| return %2 : $Foo // id: %3 |
| } |
| |
| //CHECK-LABEL: @_TF4main3bazFT_T_ |
| //CHECK-NOT: function_ref |
| //CHECK-NOT: apply |
| //CHECK: tuple |
| //CHECK-NEXT: return |
| sil @_TF4main3bazFT_T_ : $@convention(thin) () -> () { |
| bb0: |
| // function_ref main.readonly_func () -> main.Foo |
| %0 = function_ref @_TF4main9readonly_funcFT_CS_3Foo : $@convention(thin) () -> @owned Foo // user: %1 |
| %1 = apply %0() : $@convention(thin) () -> @owned Foo // users: %2, %3 |
| debug_value %1 : $Foo, let, name "unused" // id: %2 |
| strong_release %1 : $Foo // id: %3 |
| %4 = tuple () // user: %5 |
| return %4 : $() // id: %5 |
| } |
| |
| sil_vtable Foo { |
| #Foo.init!initializer.1: _TFC4main3FoocfMS0_FT_S0_ // main.Foo.init (main.Foo.Type)() -> main.Foo |
| } |
| |
| |
| |