// RUN: %target-swift-frontend -Osize -import-objc-header %S/Inputs/Outliner.h %s -emit-sil | %FileCheck %s // RUN: %target-swift-frontend -Osize -g -import-objc-header %S/Inputs/Outliner.h %s -emit-sil | %FileCheck %s // REQUIRES: objc_interop import Foundation public class MyGizmo { private var gizmo : Gizmo private var optionalGizmo : Gizmo? init() { gizmo = Gizmo() } // CHECK-LABEL: sil @_T08outliner7MyGizmoC11usePropertyyyF // CHECK: [[FUN:%.*]] = function_ref @_T0So5GizmoC14stringPropertySQySSGvgToTeab_ // CHECK: apply [[FUN]]({{.*}}) : $@convention(thin) (@in_guaranteed Gizmo) -> @owned Optional // CHECK-NOT: return // CHECK: apply [[FUN]]({{.*}}) : $@convention(thin) (@in_guaranteed Gizmo) -> @owned Optional // CHECK: return public func useProperty() { print(gizmo.stringProperty) print(optionalGizmo!.stringProperty) } } // CHECK-LABEL: sil @_T08outliner13testOutliningyyF // CHECK: [[FUN:%.*]] = function_ref @_T0So5GizmoC14stringPropertySQySSGvgToTepb_ // CHECK: apply [[FUN]](%{{.*}}) : $@convention(thin) (Gizmo) -> @owned Optional // CHECK: apply [[FUN]](%{{.*}}) : $@convention(thin) (Gizmo) -> @owned Optional // CHECK: [[FUN:%.*]] = function_ref @_T0So5GizmoC14stringPropertySQySSGvsToTembnn_ // CHECK: apply [[FUN]]({{.*}}) : $@convention(thin) (@owned String, Gizmo) -> () // CHECK: apply [[FUN]]({{.*}}) : $@convention(thin) (@owned String, Gizmo) -> () // CHECK: [[FUN:%.*]] = function_ref @_T0So5GizmoC12modifyString_10withNumber0D6FoobarSQySSGAF_SiSQyypGtFToTembnnnb_ // CHECK: apply [[FUN]]({{.*}}) : $@convention(thin) (@owned String, Int, Optional, Gizmo) -> @owned Optional // CHECK: apply [[FUN]]({{.*}}) : $@convention(thin) (@owned String, Int, Optional, Gizmo) -> @owned Optional // CHECK: [[FUN:%.*]] = function_ref @_T0So5GizmoC11doSomethingySQyypGSQySaySSGGFToTembnn_ // CHECK: apply [[FUN]]({{.*}}) : $@convention(thin) (@owned Array, Gizmo) -> @owned Optional // CHECK: apply [[FUN]]({{.*}}) : $@convention(thin) (@owned Array, Gizmo) -> @owned Optional // CHECK: return public func testOutlining() { let gizmo = Gizmo() let foobar = Gizmo() print(gizmo.stringProperty) print(gizmo.stringProperty) gizmo.stringProperty = "foobar" gizmo.stringProperty = "foobar2" gizmo.modifyString("hello", withNumber:1, withFoobar: foobar) gizmo.modifyString("hello", withNumber:1, withFoobar: foobar) let arr = [ "foo", "bar"] gizmo.doSomething(arr) gizmo.doSomething(arr) } // CHECK-LABEL: sil shared [noinline] @_T0So5GizmoC14stringPropertySQySSGvgToTeab_ : $@convention(thin) (@in_guaranteed Gizmo) -> @owned Optional // CHECK: bb0(%0 : $*Gizmo): // CHECK: %1 = load %0 : $*Gizmo // CHECK: %2 = objc_method %1 : $Gizmo, #Gizmo.stringProperty!getter.1.foreign : (Gizmo) -> () -> String! // CHECK: %3 = apply %2(%1) : $@convention(objc_method) (Gizmo) -> @autoreleased Optional // CHECK: switch_enum %3 : $Optional, case #Optional.some!enumelt.1: bb1, case #Optional.none!enumelt: bb2 // CHECK: bb1(%5 : $NSString): // CHECK: %6 = function_ref @_T0SS10FoundationE36_unconditionallyBridgeFromObjectiveCySSSo8NSStringCSgFZ : $@convention(method) (@owned Optional, @thin String.Type) -> @owned String // CHECK: %7 = metatype $@thin String.Type // CHECK: %8 = apply %6(%3, %7) : $@convention(method) (@owned Optional, @thin String.Type) -> @owned String // CHECK: %9 = enum $Optional, #Optional.some!enumelt.1, %8 : $String // CHECK: br bb3(%9 : $Optional) // CHECK: bb2: // CHECK: %11 = enum $Optional, #Optional.none!enumelt // CHECK: br bb3(%11 : $Optional) // CHECK: bb3(%13 : $Optional): // CHECK: return %13 : $Optional // CHECK-LABEL: sil shared [noinline] @_T0So5GizmoC14stringPropertySQySSGvgToTepb_ : $@convention(thin) (Gizmo) -> @owned Optional // CHECK: bb0(%0 : $Gizmo): // CHECK: %1 = objc_method %0 : $Gizmo, #Gizmo.stringProperty!getter.1.foreign : (Gizmo) -> () -> String! // CHECK: %2 = apply %1(%0) : $@convention(objc_method) (Gizmo) -> @autoreleased Optional // CHECK: switch_enum %2 : $Optional, case #Optional.some!enumelt.1: bb1, case #Optional.none!enumelt: bb2 // CHECK:bb1(%4 : $NSString): // CHECK: %5 = function_ref @_T0SS10FoundationE36_unconditionallyBridgeFromObjectiveCySSSo8NSStringCSgFZ : $@convention(method) (@owned Optional, @thin String.Type) -> @owned String // CHECK: %6 = metatype $@thin String.Type // CHECK: %7 = apply %5(%2, %6) : $@convention(method) (@owned Optional, @thin String.Type) -> @owned String // CHECK: %8 = enum $Optional, #Optional.some!enumelt.1, %7 : $String // CHECK: br bb3(%8 : $Optional) // CHECK:bb2: // CHECK: %10 = enum $Optional, #Optional.none!enumelt // CHECK: br bb3(%10 : $Optional) // CHECK:bb3(%12 : $Optional): // CHECK: return %12 : $Optional // CHECK-LABEL: sil shared [noinline] @_T0So5GizmoC14stringPropertySQySSGvsToTembnn_ : $@convention(thin) (@owned String, Gizmo) -> () { // CHECK: bb0(%0 : $String, %1 : $Gizmo): // CHECK: %2 = objc_method %1 : $Gizmo, #Gizmo.stringProperty!setter.1.foreign : (Gizmo) -> (String!) -> () // CHECK: %3 = function_ref @_T0SS10FoundationE19_bridgeToObjectiveCSo8NSStringCyF : $@convention(method) (@guaranteed String) -> @owned NSString // CHECK: %4 = apply %3(%0) : $@convention(method) (@guaranteed String) -> @owned NSString // CHECK: release_value %0 : $String // CHECK: %6 = enum $Optional, #Optional.some!enumelt.1, %4 : $NSString // CHECK: %7 = apply %2(%6, %1) : $@convention(objc_method) (Optional, Gizmo) -> () // CHECK: strong_release %4 : $NSString // CHECK: return %7 : $() // CHECK-LABEL: sil shared [noinline] @_T0So5GizmoC12modifyString_10withNumber0D6FoobarSQySSGAF_SiSQyypGtFToTembnnnb_ : $@convention(thin) (@owned String, Int, Optional, Gizmo) -> @owned Optional { // CHECK: bb0(%0 : $String, %1 : $Int, %2 : $Optional, %3 : $Gizmo): // CHECK: %4 = objc_method %3 : $Gizmo, #Gizmo.modifyString!1.foreign : (Gizmo) -> (String!, Int, Any!) -> String! // CHECK: %5 = function_ref @_T0SS10FoundationE19_bridgeToObjectiveCSo8NSStringCyF : $@convention(method) (@guaranteed String) -> @owned NSString // CHECK: %6 = apply %5(%0) : $@convention(method) (@guaranteed String) -> @owned NSString // CHECK: release_value %0 : $String // CHECK: %8 = enum $Optional, #Optional.some!enumelt.1, %6 : $NSString // CHECK: %9 = apply %4(%8, %1, %2, %3) : $@convention(objc_method) (Optional, Int, Optional, Gizmo) -> @autoreleased Optional // CHECK: strong_release %6 : $NSString // CHECK: switch_enum %9 : $Optional, case #Optional.some!enumelt.1: bb2, case #Optional.none!enumelt: bb1 // // CHECK: bb1: // CHECK: %12 = enum $Optional, #Optional.none!enumelt // CHECK: br bb3(%12 : $Optional) // // CHECK: bb2(%14 : $NSString): // CHECK: %15 = function_ref @_T0SS10FoundationE36_unconditionallyBridgeFromObjectiveCySSSo8NSStringCSgFZ : $@convention(method) (@owned Optional, @thin String.Type) -> @owned String // CHECK: %16 = metatype $@thin String.Type // CHECK: %17 = apply %15(%9, %16) : $@convention(method) (@owned Optional, @thin String.Type) -> @owned String // CHECK: %18 = enum $Optional, #Optional.some!enumelt.1, %17 : $String // CHECK: br bb3(%18 : $Optional) // // CHECK: bb3(%20 : $Optional): // CHECK: return %20 : $Optional // CHECK-LABEL: sil shared [noinline] @_T0So5GizmoC11doSomethingySQyypGSQySaySSGGFToTembnn_ : $@convention(thin) (@owned Array, Gizmo) -> @owned Optional { // CHECK: bb0(%0 : $Array, %1 : $Gizmo): // CHECK: %2 = objc_method %1 : $Gizmo, #Gizmo.doSomething!1.foreign : (Gizmo) -> ([String]!) -> Any! // CHECK: %3 = function_ref @_T0Sa10FoundationE19_bridgeToObjectiveCSo7NSArrayCyF : $@convention(method) <{{.*}}> (@guaranteed Array<{{.*}}>) -> @owned NSArray // CHECK: %4 = apply %3(%0) : $@convention(method) <{{.*}}> (@guaranteed Array<{{.*}}>) -> @owned NSArray // CHECK: release_value %0 : $Array // CHECK: %6 = enum $Optional, #Optional.some!enumelt.1, %4 : $NSArray // CHECK: %7 = apply %2(%6, %1) : $@convention(objc_method) (Optional, Gizmo) -> @autoreleased Optional // CHECK: strong_release %4 : $NSArray // CHECK: return %7 : $Optional public func dontCrash(x : Gizmo2) { let s = x.doSomething() print(s) }