blob: d304e6b3410b9fe6462fbcc2f4624b444ead8eb3 [file] [log] [blame]
// RUN: %empty-directory(%t)
// RUN: %target-swift-frontend -disable-availability-checking -primary-file %S/Inputs/specialize_opaque_result_types.swift -enable-library-evolution -module-name A -emit-sib -o %t/A.sib
// RUN: %target-swift-frontend -emit-sil -primary-file %s -enable-library-evolution -O -module-name A %t/A.sib -o - | %FileCheck %s
// REQUIRES: CPU=x86_64
sil_stage canonical
import Builtin
import Swift
import SwiftShims
typealias SomeButt = @_opaqueReturnTypeOf("$s1A19exportsOpaqueReturnQryF", 0) opaque
sil @$foobar : $@convention(thin) () -> @out SomeButt {
bb0(%0 : $*Int):
%1 = integer_literal $Builtin.Int64, 0 // user: %2
%2 = struct $Int (%1 : $Builtin.Int64) // user: %3
store %2 to %0 : $*Int // id: %3
%4 = tuple () // user: %5
return %4 : $() // id: %5
}
sil @getGenericClosure_closure : $@convention(thin) <T> (@owned _0_0> { var τ_0_0 } <T>) -> @out T
sil [noinline] @getGenericClosure : $@convention(thin) <T> (@in T) -> @owned @callee_owned () -> @out T {
bb0(%0 : $*T):
debug_value_addr %0 : $*T, let, name "t" // id: %1
%2 = function_ref @getGenericClosure_closure : $@convention(thin) _0_0> (@owned _0_0> { var τ_0_0 } _0_0>) -> @out τ_0_0 // user: %5
%3 = alloc_box $_0_0> { var τ_0_0 } <T> // users: %4, %5, %5
%3a = project_box %3 : $_0_0> { var τ_0_0 } <T>, 0
copy_addr %0 to [initialization] %3a : $*T // id: %4
%5 = partial_apply %2<T>(%3) : $@convention(thin) _0_0> (@owned _0_0> { var τ_0_0 } _0_0>) -> @out τ_0_0 // user: %7
destroy_addr %0 : $*T // id: %6
return %5 : $@callee_owned () -> @out T // id: %7
}
// CHECK-LABEL: sil shared [noinline] @$s17getGenericClosure1A19exportsOpaqueReturnQryFQOyQo__Tg5 : $@convention(thin) (Int) -> @owned @callee_owned () -> @out Int {
// CHECK: alloc_box $<τ_0_0> { var τ_0_0 } <Int>
// CHECK: } // end sil function '$s17getGenericClosure1A19exportsOpaqueReturnQryFQOyQo__Tg5'
sil [transparent] [serialized] @specializePartialApplies : $@convention(thin) (@in SomeButt) -> () {
bb0(%0 : $*SomeButt):
%5 = function_ref @getGenericClosure : $@convention(thin) _0_0> (@in τ_0_0) -> @owned @callee_owned () -> @out τ_0_0
%8 = apply %5<SomeButt>(%0) : $@convention(thin) _0_0> (@in τ_0_0) -> @owned @callee_owned () -> @out τ_0_0
%15 = tuple()
return %15 : $()
}