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