@@ -115,17 +115,27 @@ func testForcedMethodResult(dummy: DummyClass) {
115
115
// CHECK-NEXT: apply [[USE]]([[RESULT]])
116
116
useNS ( dummy. fetchNullproneString ( ) as NSString )
117
117
118
+ // This is not a force.
119
+ // TODO: we could do it more efficiently than this, though
118
120
// CHECK: [[SELF:%.*]] = begin_borrow %0
119
121
// CHECK-NEXT: [[METHOD:%.*]] = objc_method
120
122
// CHECK-NEXT: [[RESULT:%.*]] = apply [[METHOD]]([[SELF]])
121
123
// CHECK-NEXT: end_borrow [[SELF]] from %0
122
124
// CHECK-NEXT: switch_enum [[RESULT]]
123
- // CHECK: bb3:
124
- // CHECK: function_ref @_T0s30_diagnoseUnexpectedNilOptionalyBp14_filenameStart_Bw01_E6LengthBi1_01_E7IsASCIIBw5_linetF
125
- // CHECK: bb4([[RESULT:%.*]] : @owned $NSString):
126
- // CHECK-NEXT: [[ANYOBJECT:%.*]] = init_existential_ref [[RESULT]] : $NSString : $NSString, $AnyObject
125
+ // CHECK: bb3([[RESULT:%.*]] : @owned $NSString):
126
+ // CHECK: function_ref @_T0SS10FoundationE36_unconditionallyBridgeFromObjectiveCSSSo8NSStringCSgFZ
127
+ // CHECK: bb4:
128
+ // CHECK: enum $Optional<String>, #Optional.none
129
+ // CHECK: bb5([[OPTSTRING:%.*]] : @owned $Optional<String>):
130
+ // CHECK: [[BRIDGE:%.*]] = function_ref @_T0Sq19_bridgeToObjectiveCyXlyF
131
+ // CHECK-NEXT: [[TEMP:%.*]] = alloc_stack $Optional<String>
132
+ // CHECK-NEXT: [[BORROW:%.*]] = begin_borrow [[OPTSTRING]]
133
+ // CHECK-NEXT: store_borrow [[BORROW]] to [[TEMP]] : $*Optional<String>
134
+ // CHECK-NEXT: [[ANYOBJECT:%.*]] = apply [[BRIDGE]]<String>([[TEMP]])
127
135
// CHECK: [[USE:%.*]] = function_ref @_T022objc_bridging_peephole12useAnyObjectyyXlF
128
136
// CHECK-NEXT: apply [[USE]]([[ANYOBJECT]])
137
+ // CHECK-NEXT: end_borrow [[BORROW]] from [[OPTSTRING]]
138
+ // CHECK-NEXT: dealloc_stack [[TEMP]]
129
139
useAnyObject ( dummy. fetchNullproneString ( ) as AnyObject )
130
140
131
141
// CHECK: return
@@ -233,16 +243,27 @@ func testForcedPropertyValue(dummy: DummyClass) {
233
243
// CHECK-NEXT: end_borrow [[SELF]] from %0
234
244
useNS ( dummy. nullproneStringProperty as NSString )
235
245
246
+ // This is not a force.
247
+ // TODO: we could do it more efficiently than this, though
236
248
// CHECK-NEXT: [[SELF:%.*]] = begin_borrow %0
237
249
// CHECK-NEXT: [[METHOD:%.*]] = objc_method
238
250
// CHECK-NEXT: [[RESULT:%.*]] = apply [[METHOD]]([[SELF]])
239
251
// CHECK-NEXT: switch_enum [[RESULT]]
240
- // CHECK: bb3:
241
- // CHECK: function_ref @_T0s30_diagnoseUnexpectedNilOptionalyBp14_filenameStart_Bw01_E6LengthBi1_01_E7IsASCIIBw5_linetF
242
- // CHECK: bb4([[RESULT:%.*]] : @owned $NSString):
243
- // CHECK-NEXT: [[ANYOBJECT:%.*]] = init_existential_ref [[RESULT]] : $NSString : $NSString, $AnyObject
252
+ // CHECK: bb3([[RESULT:%.*]] : @owned $NSString):
253
+ // CHECK: function_ref @_T0SS10FoundationE36_unconditionallyBridgeFromObjectiveCSSSo8NSStringCSgFZ
254
+ // CHECK: bb4:
255
+ // CHECK: enum $Optional<String>, #Optional.none
256
+ // CHECK: bb5([[OPTSTRING:%.*]] : @owned $Optional<String>):
257
+ // CHECK: [[BRIDGE:%.*]] = function_ref @_T0Sq19_bridgeToObjectiveCyXlyF
258
+ // CHECK-NEXT: [[TEMP:%.*]] = alloc_stack $Optional<String>
259
+ // CHECK-NEXT: [[BORROW:%.*]] = begin_borrow [[OPTSTRING]]
260
+ // CHECK-NEXT: store_borrow [[BORROW]] to [[TEMP]] : $*Optional<String>
261
+ // CHECK-NEXT: [[ANYOBJECT:%.*]] = apply [[BRIDGE]]<String>([[TEMP]])
244
262
// CHECK: [[USE:%.*]] = function_ref @_T022objc_bridging_peephole12useAnyObjectyyXlF
245
263
// CHECK-NEXT: apply [[USE]]([[ANYOBJECT]])
264
+ // CHECK-NEXT: end_borrow [[BORROW]] from [[OPTSTRING]]
265
+ // CHECK-NEXT: dealloc_stack [[TEMP]]
266
+ // CHECK-NEXT: destroy_value [[OPTSTRING]]
246
267
// CHECK-NEXT: end_borrow [[SELF]] from %0
247
268
useAnyObject ( dummy. nullproneStringProperty as AnyObject )
248
269
@@ -627,3 +648,14 @@ protocol P {
627
648
func foo( p: P ) {
628
649
DummyClass ( ) . takeNullableString ( p. title)
629
650
}
651
+
652
+ // rdar://35402853
653
+ // Make sure that we don't peephole AnyObject? -> Any? -> AnyObject naively.
654
+ // CHECK: sil hidden @_T022objc_bridging_peephole017testOptionalToNonE6BridgeyyF
655
+ func testOptionalToNonOptionalBridge( ) {
656
+ // CHECK: apply {{.*}}() : $@convention(c) () -> @autoreleased Optional<AnyObject>
657
+ // CHECK: function_ref @_T0s018_bridgeAnyObjectToB0ypyXlSgF :
658
+ // CHECK: [[T0:%.*]] = function_ref @_T0Sq19_bridgeToObjectiveCyXlyF
659
+ // CHECK: apply [[T0]]<Any>
660
+ useAnyObject ( returnNullableId ( ) as AnyObject )
661
+ } // CHECK: end sil function '_T022objc_bridging_peephole017testOptionalToNonE6BridgeyyF'
0 commit comments