| // RUN: %target-sil-opt %s | %FileCheck %s |
| |
| import Builtin |
| import Swift |
| |
| // This testing case is extracted from the sil dump of stdlib. |
| // CHECK-LABEL: sil @test : $@convention(thin) (UnsafeMutablePointer<Optional<AnyObject>>) -> () { |
| sil @test : $@convention(thin) (UnsafeMutablePointer<Optional<AnyObject>>) -> () { |
| bb0(%0 : $UnsafeMutablePointer<Optional<AnyObject>>): |
| %1 = function_ref @callee1 : $@convention(thin) (UnsafeMutablePointer<OpaquePointer>) -> OpaquePointer |
| %2 = struct_extract %0 : $UnsafeMutablePointer<Optional<AnyObject>>, #UnsafeMutablePointer._rawValue |
| %3 = struct $UnsafeMutablePointer<OpaquePointer> (%2 : $Builtin.RawPointer) |
| %4 = apply %1(%3) : $@convention(thin) (UnsafeMutablePointer<OpaquePointer>) -> OpaquePointer |
| %21 = function_ref @callee2 : $@convention(method) <τ_0_0 where τ_0_0 : AnyObject> (Unmanaged<τ_0_0>) -> @owned τ_0_0 |
| %22 = function_ref @callee3 : $@convention(thin) <τ_0_0 where τ_0_0 : AnyObject> (OpaquePointer, @thin Unmanaged<τ_0_0>.Type) -> Unmanaged<τ_0_0> |
| %23 = metatype $@thin Unmanaged<AnyObject>.Type |
| // CHECK: apply %{{[0-9]+}}<AnyObject>(%{{[0-9]+}}, %{{[0-9]+}}) : $@convention(thin) <τ_0_0 where τ_0_0 : AnyObject> (OpaquePointer, @thin Unmanaged<τ_0_0>.Type) -> Unmanaged<τ_0_0> |
| %24 = apply %22<AnyObject>(%4, %23) : $@convention(thin) <τ_0_0 where τ_0_0 : AnyObject> (OpaquePointer, @thin Unmanaged<τ_0_0>.Type) -> Unmanaged<τ_0_0> |
| // CHECK: apply %{{[0-9]+}}<AnyObject>(%{{[0-9]+}}) : $@convention(method) <τ_0_0 where τ_0_0 : AnyObject> (Unmanaged<τ_0_0>) -> @owned τ_0_0 |
| %25 = apply %21<AnyObject>(%24) : $@convention(method) <τ_0_0 where τ_0_0 : AnyObject> (Unmanaged<τ_0_0>) -> @owned τ_0_0 |
| %26 = tuple () |
| return %26 : $() |
| } |
| |
| sil @callee1 : $@convention(thin) (UnsafeMutablePointer<OpaquePointer>) -> OpaquePointer |
| sil @callee2 : $@convention(method) <τ_0_0 where τ_0_0 : AnyObject> (Unmanaged<τ_0_0>) -> @owned τ_0_0 |
| sil @callee3 : $@convention(thin) <τ_0_0 where τ_0_0 : AnyObject> (OpaquePointer, @thin Unmanaged<τ_0_0>.Type) -> Unmanaged<τ_0_0> |