1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
|
// RUN: %empty-directory(%t)
// RUN: %target-clang %S/Inputs/objc_bridging_opt/objc.m -c -o %t/objc.o -g
// RUN: %target-build-swift -module-name=test -O %s -import-objc-header %S/Inputs/objc_bridging_opt/objc.h %t/objc.o -o %t/a.out
// RUN: %target-swift-frontend -module-name=test -O -primary-file %s -import-objc-header %S/Inputs/objc_bridging_opt/objc.h -emit-sil | %FileCheck %s --check-prefix=CHECK-SIL
// RUN: %target-codesign %t/a.out
// RUN: %target-run %t/a.out | %FileCheck %s
// REQUIRES: swift_in_compiler
// REQUIRES: executable_test
// REQUIRES: objc_interop
import Foundation
// CHECK-SIL-LABEL: sil hidden [noinline] @$s4test0A17NonOptionalStringyyF
// CHECK-SIL: [[F1:%[0-9]+]] = function_ref @returnNSString
// CHECK-SIL: apply [[F1]]()
// CHECK-SIL-NOT: apply
// CHECK-SIL: switch_enum
// CHECK-SIL: [[F2:%[0-9]+]] = function_ref @$sSS10FoundationE19_bridgeToObjectiveCSo8NSStringCyF
// CHECK-SIL: apply [[F2]]
// CHECK-SIL-NOT: apply
// CHECK-SIL: [[F3:%[0-9]+]] = function_ref @useNSString
// CHECK-SIL: apply [[F3]]
// CHECK-SIL: // end sil function '$s4test0A17NonOptionalStringyyF'
@inline(never)
func testNonOptionalString() {
useNSString(returnNSString())
}
// CHECK-SIL-LABEL: sil hidden [noinline] @$s4test0A14OptionalStringyySbF
// CHECK-SIL-NOT: bridge
// CHECK-SIL: // end sil function '$s4test0A14OptionalStringyySbF'
@inline(never)
func testOptionalString(_ some: Bool) {
useOptNSString(returnOptNSString(some))
}
// CHECK-SIL-LABEL: sil hidden [noinline] @$s4test0a13NonOptionalToC6StringyyF
// CHECK-SIL: [[F1:%[0-9]+]] = function_ref @returnNSString
// CHECK-SIL: apply [[F1]]()
// CHECK-SIL-NOT: apply
// CHECK-SIL: switch_enum
// CHECK-SIL: [[F2:%[0-9]+]] = function_ref @$sSS10FoundationE19_bridgeToObjectiveCSo8NSStringCyF
// CHECK-SIL: apply [[F2]]
// CHECK-SIL-NOT: apply
// CHECK-SIL: [[F3:%[0-9]+]] = function_ref @useOptNSString
// CHECK-SIL: apply [[F3]]
// CHECK-SIL: // end sil function '$s4test0a13NonOptionalToC6StringyyF'
@inline(never)
func testNonOptionalToOptionalString() {
useOptNSString(returnNSString())
}
// CHECK-SIL-LABEL: sil hidden [noinline] @$s4test0a13OptionalToNonB6StringyySbF
// CHECK-SIL-NOT: bridge
// CHECK-SIL: // end sil function '$s4test0a13OptionalToNonB6StringyySbF'
@inline(never)
func testOptionalToNonOptionalString(_ some: Bool) {
if let s = returnOptNSString(some) {
useNSString(s)
}
}
// CHECK-SIL-LABEL: sil hidden [noinline] @$s4test0A15NonOptionalLoopyySiF
// CHECK-SIL: [[F1:%[0-9]+]] = function_ref @returnNSString
// CHECK-SIL: apply [[F1]]()
// CHECK-SIL-NOT: apply
// CHECK-SIL: switch_enum
// CHECK-SIL: [[F2:%[0-9]+]] = function_ref @$sSS10FoundationE19_bridgeToObjectiveCSo8NSStringCyF
// CHECK-SIL: apply [[F2]]
// CHECK-SIL-NOT: apply
// CHECK-SIL: [[F3:%[0-9]+]] = function_ref @useNSString
// CHECK-SIL: apply [[F3]]
// CHECK-SIL: // end sil function '$s4test0A15NonOptionalLoopyySiF'
@inline(never)
func testNonOptionalLoop(_ n: Int) {
let s = returnNSString()
for _ in 0..<n {
useNSString(s)
}
}
// CHECK-SIL-LABEL: sil hidden [noinline] @$s4test0A12OptionalLoopyySi_SbtF
// CHECK-SIL-NOT: bridge
// CHECK-SIL: // end sil function '$s4test0A12OptionalLoopyySi_SbtF'
@inline(never)
func testOptionalLoop(_ n: Int, _ some: Bool) {
let s = returnOptNSString(some)
for _ in 0..<n {
useOptNSString(s)
}
}
@inline(never)
func testNonOptionalNullString() {
useNSString(returnNullNSString())
}
// CHECK-LABEL: testNonOptionalString
print("testNonOptionalString:")
// CHECK-NEXT: This is an ObjectiveC string!
testNonOptionalString()
// CHECK-NEXT: end
print("end")
// CHECK-LABEL: testOptionalString
print("testOptionalString:")
// CHECK-NEXT: This is an optional ObjectiveC string!
testOptionalString(true)
// CHECK-NEXT: NULL
testOptionalString(false)
// CHECK-NEXT: end
print("end")
// CHECK-LABEL: testNonOptionalToOptionalString
print("testNonOptionalToOptionalString:")
// CHECK-NEXT: This is an ObjectiveC string!
testNonOptionalToOptionalString()
// CHECK-NEXT: end
print("end")
// CHECK-LABEL: testOptionalToNonOptionalString
print("testOptionalToNonOptionalString:")
// CHECK-NEXT: This is an optional ObjectiveC string!
testOptionalToNonOptionalString(true)
testOptionalToNonOptionalString(false)
// CHECK-NEXT: end
print("end")
// CHECK-LABEL: testNonOptionalLoop
print("testNonOptionalLoop:")
// CHECK-NEXT: This is an ObjectiveC string!
// CHECK-NEXT: This is an ObjectiveC string!
// CHECK-NEXT: This is an ObjectiveC string!
testNonOptionalLoop(3)
// CHECK-NEXT: end
print("end")
// CHECK-LABEL: testOptionalLoop
print("testOptionalLoop:")
// CHECK-NEXT: This is an optional ObjectiveC string!
// CHECK-NEXT: This is an optional ObjectiveC string!
// CHECK-NEXT: This is an optional ObjectiveC string!
testOptionalLoop(3, true)
// CHECK-NEXT: NULL
// CHECK-NEXT: NULL
// CHECK-NEXT: NULL
testOptionalLoop(3, false)
// CHECK-NEXT: end
print("end")
// CHECK-LABEL: testNonOptionalNullString
print("testNonOptionalNullString:")
// CHECK-NEXT: <empty>
testNonOptionalNullString()
// CHECK-NEXT: end
print("end")
|