| // RUN: %target-swift-frontend -emit-ir %s -module-name main | %FileCheck %s |
| |
| sil_stage canonical |
| |
| struct Box<T> { |
| @inline(never) |
| static func foo() {} |
| } |
| |
| // Reference a function in a way that will be specialized. |
| sil @test : $@convention(thin) () -> () { |
| bb0: |
| // function_ref static Box.foo() -> () |
| %0 = function_ref @_T04main3BoxV3fooyyFZ : $@convention(thin) <τ_0_0> (@thin Box<τ_0_0>.Type) -> () // user: %2 |
| %1 = metatype $@thin Box<()>.Type // user: %2 |
| %2 = apply %0<()>(%1) : $@convention(thin) <τ_0_0> (@thin Box<τ_0_0>.Type) -> () |
| %3 = tuple () // user: %4 |
| return %3 : $() // id: %4 |
| } |
| |
| // This is the unspecialized form. |
| sil hidden @_T04main3BoxV3fooyyFZ : $@convention(thin) <T> (@thin Box<T>.Type) -> () { |
| bb0(%0 : $@thin Box<T>.Type): |
| %1 = tuple () |
| return %1 : $() |
| } |
| |
| // generic specialization <()> of static main.Box.foo () -> () |
| // This specialization is one that would be matched by the prespecialization |
| // pass. |
| sil shared @_T04main3BoxV3fooyyFZyt_Tg5 : $@convention(thin) (@thin Box<()>.Type) -> () { |
| bb0(%0 : $@thin Box<()>.Type): |
| %1 = tuple () |
| return %1 : $() |
| } |
| |
| // CHECK-DAG: define linkonce_odr hidden swiftcc void @_T04main3BoxV3fooyyFZyt_Tg5() {{.*}}{ |
| // CHECK-DAG: call swiftcc void @_T04main3BoxV3fooyyFZyt_Tg5() |