Skip to content

Commit 54a97bb

Browse files
committed
[silgen] Scope ArgEmitter::emit{SubstToOrigValue,NativeToBridgedArgument} using popPreservingValue to move its result into the outer scope.
rdar://31145255
1 parent 225fd4a commit 54a97bb

File tree

3 files changed

+51
-46
lines changed

3 files changed

+51
-46
lines changed

lib/SILGen/SILGenApply.cpp

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2566,16 +2566,18 @@ namespace {
25662566
SILType loweredSubstArgType,
25672567
AbstractionPattern origParamType,
25682568
SILParameterInfo param) {
2569+
Scope scope(SGF, arg.getLocation());
2570+
25692571
// TODO: We should take the opportunity to peephole certain abstraction
25702572
// changes here, for instance, directly emitting a closure literal at the
25712573
// callee's expected abstraction level instead of emitting it maximally
25722574
// substituted and thunking.
25732575
auto emitted = emitArgumentFromSource(std::move(arg), loweredSubstArgType,
25742576
origParamType, param);
2575-
return SGF.emitSubstToOrigValue(emitted.loc,
2576-
std::move(emitted.value).getScalarValue(),
2577-
origParamType, emitted.value.getType(),
2578-
emitted.contextForReabstraction);
2577+
ManagedValue result = SGF.emitSubstToOrigValue(
2578+
emitted.loc, std::move(emitted.value).getScalarValue(), origParamType,
2579+
emitted.value.getType(), emitted.contextForReabstraction);
2580+
return scope.popPreservingValue(result);
25792581
}
25802582

25812583
CanType getAnyObjectType() {
@@ -2592,6 +2594,8 @@ namespace {
25922594
SILType loweredSubstArgType,
25932595
AbstractionPattern origParamType,
25942596
SILParameterInfo param) {
2597+
Scope scope(SGF, arg.getLocation());
2598+
25952599
// If we're bridging a concrete type to `id` via Any, skip the Any
25962600
// boxing.
25972601

@@ -2601,17 +2605,18 @@ namespace {
26012605
if (auto objTy = paramObjTy.getAnyOptionalObjectType())
26022606
paramObjTy = objTy;
26032607
if (isAnyObjectType(paramObjTy) && !arg.isRValue()) {
2604-
return emitNativeToBridgedObjectArgument(std::move(arg).asKnownExpr(),
2605-
loweredSubstArgType,
2606-
origParamType, param);
2608+
return scope.popPreservingValue(emitNativeToBridgedObjectArgument(
2609+
std::move(arg).asKnownExpr(), loweredSubstArgType, origParamType,
2610+
param));
26072611
}
26082612

26092613
auto emitted = emitArgumentFromSource(std::move(arg), loweredSubstArgType,
26102614
origParamType, param);
2611-
2612-
return SGF.emitNativeToBridgedValue(emitted.loc,
2613-
std::move(emitted.value).getAsSingleValue(SGF, emitted.loc),
2614-
Rep, param.getType());
2615+
2616+
return scope.popPreservingValue(SGF.emitNativeToBridgedValue(
2617+
emitted.loc,
2618+
std::move(emitted.value).getAsSingleValue(SGF, emitted.loc), Rep,
2619+
param.getType()));
26152620
}
26162621

26172622
enum class ExistentialPeepholeOptionality {

test/SILGen/objc_bridging.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -515,10 +515,10 @@ func applyStringBlock(_ f: @convention(block) (String) -> String, x: String) ->
515515
// CHECK: [[STRING_TO_NSSTRING:%.*]] = function_ref @_T0SS10FoundationE19_bridgeToObjectiveCSo8NSStringCyF
516516
// CHECK: [[BORROWED_STRING_COPY:%.*]] = begin_borrow [[STRING_COPY]]
517517
// CHECK: [[NSSTR:%.*]] = apply [[STRING_TO_NSSTRING]]([[BORROWED_STRING_COPY]]) : $@convention(method) (@guaranteed String)
518-
// CHECK: [[RESULT_NSSTR:%.*]] = apply [[BLOCK_COPY_COPY]]([[NSSTR]]) : $@convention(block) (NSString) -> @autoreleased NSString
519-
// CHECK: destroy_value [[NSSTR]]
520518
// CHECK: end_borrow [[BORROWED_STRING_COPY]] from [[STRING_COPY]]
521519
// CHECK: destroy_value [[STRING_COPY]]
520+
// CHECK: [[RESULT_NSSTR:%.*]] = apply [[BLOCK_COPY_COPY]]([[NSSTR]]) : $@convention(block) (NSString) -> @autoreleased NSString
521+
// CHECK: destroy_value [[NSSTR]]
522522
// CHECK: [[FINAL_BRIDGE:%.*]] = function_ref @_T0SS10FoundationE36_unconditionallyBridgeFromObjectiveCSSSo8NSStringCSgFZ
523523
// CHECK: [[OPTIONAL_NSSTR:%.*]] = enum $Optional<NSString>, #Optional.some!enumelt.1, [[RESULT_NSSTR]]
524524
// CHECK: [[RESULT:%.*]] = apply [[FINAL_BRIDGE]]([[OPTIONAL_NSSTR]], {{.*}}) : $@convention(method) (@owned Optional<NSString>, @thin String.Type) -> @owned String

test/SILGen/objc_bridging_any.swift

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,11 @@ func passingToId<T: CP, U>(receiver: NSIdLover,
4747
// CHECK: [[BORROWED_STRING_COPY:%.*]] = begin_borrow [[STRING_COPY]]
4848
// CHECK: [[BRIDGED:%.*]] = apply [[BRIDGE_STRING]]([[BORROWED_STRING_COPY]])
4949
// CHECK: [[ANYOBJECT:%.*]] = init_existential_ref [[BRIDGED]] : $NSString : $NSString, $AnyObject
50-
// CHECK: apply [[METHOD]]([[ANYOBJECT]], [[BORROWED_SELF]])
51-
// CHECK: destroy_value [[BRIDGED]]
5250
// CHECK: end_borrow [[BORROWED_STRING_COPY]] from [[STRING_COPY]]
5351
// CHECK: destroy_value [[STRING_COPY]]
5452
// CHECK: end_borrow [[BORROWED_STRING]] from [[STRING]]
53+
// CHECK: apply [[METHOD]]([[ANYOBJECT]], [[BORROWED_SELF]])
54+
// CHECK: destroy_value [[ANYOBJECT]]
5555
// CHECK: end_borrow [[BORROWED_SELF]] from [[SELF]]
5656
receiver.takesId(string)
5757

@@ -60,9 +60,9 @@ func passingToId<T: CP, U>(receiver: NSIdLover,
6060
// CHECK: [[BORROWED_NSSTRING:%.*]] = begin_borrow [[NSSTRING]]
6161
// CHECK: [[NSSTRING_COPY:%.*]] = copy_value [[BORROWED_NSSTRING]]
6262
// CHECK: [[ANYOBJECT:%.*]] = init_existential_ref [[NSSTRING_COPY]] : $NSString : $NSString, $AnyObject
63-
// CHECK: apply [[METHOD]]([[ANYOBJECT]], [[BORROWED_SELF]])
64-
// CHECK: destroy_value [[NSSTRING_COPY]]
6563
// CHECK: end_borrow [[BORROWED_NSSTRING]] from [[NSSTRING]]
64+
// CHECK: apply [[METHOD]]([[ANYOBJECT]], [[BORROWED_SELF]])
65+
// CHECK: destroy_value [[ANYOBJECT]]
6666
// CHECK: end_borrow [[BORROWED_SELF]] from [[SELF]]
6767
receiver.takesId(nsString)
6868

@@ -71,19 +71,19 @@ func passingToId<T: CP, U>(receiver: NSIdLover,
7171
// CHECK: [[BORROWED_CLASS_GENERIC:%.*]] = begin_borrow [[CLASS_GENERIC]]
7272
// CHECK: [[CLASS_GENERIC_COPY:%.*]] = copy_value [[BORROWED_CLASS_GENERIC]]
7373
// CHECK: [[ANYOBJECT:%.*]] = init_existential_ref [[CLASS_GENERIC_COPY]] : $T : $T, $AnyObject
74-
// CHECK: apply [[METHOD]]([[ANYOBJECT]], [[BORROWED_SELF]])
75-
// CHECK: destroy_value [[CLASS_GENERIC_COPY]]
7674
// CHECK: end_borrow [[BORROWED_CLASS_GENERIC]] from [[CLASS_GENERIC]]
75+
// CHECK: apply [[METHOD]]([[ANYOBJECT]], [[BORROWED_SELF]])
76+
// CHECK: destroy_value [[ANYOBJECT]]
7777
// CHECK: end_borrow [[BORROWED_SELF]] from [[SELF]]
7878
receiver.takesId(classGeneric)
7979

8080
// CHECK: [[BORROWED_SELF:%.*]] = begin_borrow [[SELF]]
8181
// CHECK: [[METHOD:%.*]] = class_method [volatile] [[BORROWED_SELF]] : $NSIdLover,
8282
// CHECK: [[BORROWED_OBJECT:%.*]] = begin_borrow [[OBJECT]]
8383
// CHECK: [[OBJECT_COPY:%.*]] = copy_value [[BORROWED_OBJECT]]
84+
// CHECK: end_borrow [[BORROWED_OBJECT]] from [[OBJECT]]
8485
// CHECK: apply [[METHOD]]([[OBJECT_COPY]], [[BORROWED_SELF]])
8586
// CHECK: destroy_value [[OBJECT_COPY]]
86-
// CHECK: end_borrow [[BORROWED_OBJECT]] from [[OBJECT]]
8787
// CHECK: end_borrow [[BORROWED_SELF]] from [[SELF]]
8888
receiver.takesId(object)
8989

@@ -93,9 +93,9 @@ func passingToId<T: CP, U>(receiver: NSIdLover,
9393
// CHECK: [[CLASS_EXISTENTIAL_COPY:%.*]] = copy_value [[BORROWED_CLASS_EXISTENTIAL]]
9494
// CHECK: [[OPENED:%.*]] = open_existential_ref [[CLASS_EXISTENTIAL_COPY]] : $CP
9595
// CHECK: [[ANYOBJECT:%.*]] = init_existential_ref [[OPENED]]
96-
// CHECK: apply [[METHOD]]([[ANYOBJECT]], [[BORROWED_SELF]])
97-
// CHECK: destroy_value [[CLASS_EXISTENTIAL_COPY]]
9896
// CHECK: end_borrow [[BORROWED_CLASS_EXISTENTIAL]] from [[CLASS_EXISTENTIAL]]
97+
// CHECK: apply [[METHOD]]([[ANYOBJECT]], [[BORROWED_SELF]])
98+
// CHECK: destroy_value [[ANYOBJECT]]
9999
// CHECK: end_borrow [[BORROWED_SELF]] from [[SELF]]
100100
receiver.takesId(classExistential)
101101

@@ -108,9 +108,9 @@ func passingToId<T: CP, U>(receiver: NSIdLover,
108108
// CHECK: // function_ref _bridgeAnythingToObjectiveC
109109
// CHECK: [[BRIDGE_ANYTHING:%.*]] = function_ref
110110
// CHECK: [[ANYOBJECT:%.*]] = apply [[BRIDGE_ANYTHING]]<U>([[COPY]])
111+
// CHECK: dealloc_stack [[COPY]]
111112
// CHECK: apply [[METHOD]]([[ANYOBJECT]], [[BORROWED_SELF]])
112113
// CHECK: destroy_value [[ANYOBJECT]]
113-
// CHECK: dealloc_stack [[COPY]]
114114
// CHECK: end_borrow [[BORROWED_SELF]] from [[SELF]]
115115
receiver.takesId(generic)
116116

@@ -122,10 +122,10 @@ func passingToId<T: CP, U>(receiver: NSIdLover,
122122
// CHECK: // function_ref _bridgeAnythingToObjectiveC
123123
// CHECK: [[BRIDGE_ANYTHING:%.*]] = function_ref
124124
// CHECK: [[ANYOBJECT:%.*]] = apply [[BRIDGE_ANYTHING]]<[[OPENED_TYPE]]>([[OPENED_COPY]])
125-
// CHECK: apply [[METHOD]]([[ANYOBJECT]], [[BORROWED_SELF]])
126-
// CHECK: destroy_value [[ANYOBJECT]]
127125
// CHECK: deinit_existential_addr [[COPY]]
128126
// CHECK: dealloc_stack [[COPY]]
127+
// CHECK: apply [[METHOD]]([[ANYOBJECT]], [[BORROWED_SELF]])
128+
// CHECK: destroy_value [[ANYOBJECT]]
129129
// CHECK: end_borrow [[BORROWED_SELF]] from [[SELF]]
130130
receiver.takesId(existential)
131131

@@ -138,11 +138,11 @@ func passingToId<T: CP, U>(receiver: NSIdLover,
138138
// CHECK: copy_addr [[ERROR_BOX]] to [initialization] [[ERROR_STACK]] : $*@opened([[ERROR_ARCHETYPE]]) Error
139139
// CHECK: [[BRIDGE_FUNCTION:%[0-9]+]] = function_ref @_T0s27_bridgeAnythingToObjectiveCs9AnyObject_pxlF
140140
// CHECK: [[BRIDGED_ERROR:%[0-9]+]] = apply [[BRIDGE_FUNCTION]]<@opened([[ERROR_ARCHETYPE]]) Error>([[ERROR_STACK]])
141-
// CHECK: apply [[METHOD]]([[BRIDGED_ERROR]], [[BORROWED_SELF]])
142-
// CHECK: destroy_value [[BRIDGED_ERROR]] : $AnyObject
143141
// CHECK: dealloc_stack [[ERROR_STACK]] : $*@opened([[ERROR_ARCHETYPE]]) Error
144142
// CHECK: destroy_value [[ERROR_COPY]] : $Error
145143
// CHECK: end_borrow [[BORROWED_ERROR]] from [[ERROR]]
144+
// CHECK: apply [[METHOD]]([[BRIDGED_ERROR]], [[BORROWED_SELF]])
145+
// CHECK: destroy_value [[BRIDGED_ERROR]] : $AnyObject
146146
// CHECK: end_borrow [[BORROWED_SELF]] from [[SELF]]
147147
receiver.takesId(error)
148148

@@ -154,10 +154,10 @@ func passingToId<T: CP, U>(receiver: NSIdLover,
154154
// CHECK: // function_ref _bridgeAnythingToObjectiveC
155155
// CHECK: [[BRIDGE_ANYTHING:%.*]] = function_ref
156156
// CHECK: [[ANYOBJECT:%.*]] = apply [[BRIDGE_ANYTHING]]<[[OPENED_TYPE]]>([[OPENED_COPY]])
157-
// CHECK: apply [[METHOD]]([[ANYOBJECT]], [[BORROWED_SELF]])
158-
// CHECK: destroy_value [[ANYOBJECT]]
159157
// CHECK: deinit_existential_addr [[COPY]]
160158
// CHECK: dealloc_stack [[COPY]]
159+
// CHECK: apply [[METHOD]]([[ANYOBJECT]], [[BORROWED_SELF]])
160+
// CHECK: destroy_value [[ANYOBJECT]]
161161
// CHECK: end_borrow [[BORROWED_SELF]] from [[SELF]]
162162
receiver.takesId(any)
163163

@@ -181,8 +181,8 @@ func passingToId<T: CP, U>(receiver: NSIdLover,
181181
// CHECK: [[TMP:%.*]] = alloc_stack $Optional<String>
182182
// CHECK: store [[OPT_STRING_COPY]] to [init] [[TMP]]
183183
// CHECK: [[ANYOBJECT:%.*]] = apply [[BRIDGE_OPTIONAL]]<String>([[TMP]])
184-
// CHECK: apply [[METHOD]]([[ANYOBJECT]], [[BORROWED_SELF]])
185184
// CHECK: end_borrow [[BORROWED_OPT_STRING]] from [[OPT_STRING]]
185+
// CHECK: apply [[METHOD]]([[ANYOBJECT]], [[BORROWED_SELF]])
186186
// CHECK: end_borrow [[BORROWED_SELF]] from [[SELF]]
187187
receiver.takesId(optionalA)
188188

@@ -194,8 +194,8 @@ func passingToId<T: CP, U>(receiver: NSIdLover,
194194
// CHECK: [[TMP:%.*]] = alloc_stack $Optional<NSString>
195195
// CHECK: store [[OPT_NSSTRING_COPY]] to [init] [[TMP]]
196196
// CHECK: [[ANYOBJECT:%.*]] = apply [[BRIDGE_OPTIONAL]]<NSString>([[TMP]])
197-
// CHECK: apply [[METHOD]]([[ANYOBJECT]], [[BORROWED_SELF]])
198197
// CHECK: end_borrow [[BORROWED_OPT_NSSTRING]] from [[OPT_NSSTRING]]
198+
// CHECK: apply [[METHOD]]([[ANYOBJECT]], [[BORROWED_SELF]])
199199
// CHECK: end_borrow [[BORROWED_SELF]] from [[SELF]]
200200
receiver.takesId(optionalB)
201201

@@ -287,10 +287,10 @@ func passingToNullableId<T: CP, U>(receiver: NSIdLover,
287287
// CHECK: [[BRIDGED:%.*]] = apply [[BRIDGE_STRING]]([[BORROWED_STRING_COPY]])
288288
// CHECK: [[ANYOBJECT:%.*]] = init_existential_ref [[BRIDGED]] : $NSString : $NSString, $AnyObject
289289
// CHECK: [[OPT_ANYOBJECT:%.*]] = enum {{.*}} [[ANYOBJECT]]
290-
// CHECK: apply [[METHOD]]([[OPT_ANYOBJECT]], [[BORROWED_SELF]])
291-
// CHECK: destroy_value [[BRIDGED]]
292290
// CHECK: end_borrow [[BORROWED_STRING_COPY]] from [[STRING_COPY]]
293291
// CHECK: destroy_value [[STRING_COPY]]
292+
// CHECK: apply [[METHOD]]([[OPT_ANYOBJECT]], [[BORROWED_SELF]])
293+
// CHECK: destroy_value [[OPT_ANYOBJECT]]
294294
// CHECK: end_borrow [[BORROWED_SELF]] from [[SELF]]
295295
receiver.takesNullableId(string)
296296

@@ -300,8 +300,8 @@ func passingToNullableId<T: CP, U>(receiver: NSIdLover,
300300
// CHECK: [[NSSTRING_COPY:%.*]] = copy_value [[BORROWED_NSSTRING]]
301301
// CHECK: [[ANYOBJECT:%.*]] = init_existential_ref [[NSSTRING_COPY]] : $NSString : $NSString, $AnyObject
302302
// CHECK: [[OPT_ANYOBJECT:%.*]] = enum {{.*}} [[ANYOBJECT]]
303-
// CHECK: apply [[METHOD]]([[OPT_ANYOBJECT]], [[BORROWED_SELF]])
304303
// CHECK: end_borrow [[BORROWED_NSSTRING]] from [[NSSTRING]]
304+
// CHECK: apply [[METHOD]]([[OPT_ANYOBJECT]], [[BORROWED_SELF]])
305305
// CHECK: end_borrow [[BORROWED_SELF]] from [[SELF]]
306306
receiver.takesNullableId(nsString)
307307

@@ -310,8 +310,8 @@ func passingToNullableId<T: CP, U>(receiver: NSIdLover,
310310
// CHECK: [[BORROWED_OBJECT:%.*]] = begin_borrow [[OBJECT]]
311311
// CHECK: [[OBJECT_COPY:%.*]] = copy_value [[BORROWED_OBJECT]]
312312
// CHECK: [[OPT_ANYOBJECT:%.*]] = enum {{.*}} [[OBJECT_COPY]]
313-
// CHECK: apply [[METHOD]]([[OPT_ANYOBJECT]], [[BORROWED_SELF]])
314313
// CHECK: end_borrow [[BORROWED_OBJECT]] from [[OBJECT]]
314+
// CHECK: apply [[METHOD]]([[OPT_ANYOBJECT]], [[BORROWED_SELF]])
315315
// CHECK: end_borrow [[BORROWED_SELF]] from [[SELF]]
316316
receiver.takesNullableId(object)
317317

@@ -321,8 +321,8 @@ func passingToNullableId<T: CP, U>(receiver: NSIdLover,
321321
// CHECK: [[CLASS_GENERIC_COPY:%.*]] = copy_value [[BORROWED_CLASS_GENERIC]]
322322
// CHECK: [[ANYOBJECT:%.*]] = init_existential_ref [[CLASS_GENERIC_COPY]] : $T : $T, $AnyObject
323323
// CHECK: [[OPT_ANYOBJECT:%.*]] = enum {{.*}} [[ANYOBJECT]]
324-
// CHECK: apply [[METHOD]]([[OPT_ANYOBJECT]], [[BORROWED_SELF]])
325324
// CHECK: end_borrow [[BORROWED_CLASS_GENERIC]] from [[CLASS_GENERIC]]
325+
// CHECK: apply [[METHOD]]([[OPT_ANYOBJECT]], [[BORROWED_SELF]])
326326
// CHECK: end_borrow [[BORROWED_SELF]] from [[SELF]]
327327
receiver.takesNullableId(classGeneric)
328328

@@ -333,8 +333,8 @@ func passingToNullableId<T: CP, U>(receiver: NSIdLover,
333333
// CHECK: [[OPENED:%.*]] = open_existential_ref [[CLASS_EXISTENTIAL_COPY]] : $CP
334334
// CHECK: [[ANYOBJECT:%.*]] = init_existential_ref [[OPENED]]
335335
// CHECK: [[OPT_ANYOBJECT:%.*]] = enum {{.*}} [[ANYOBJECT]]
336-
// CHECK: apply [[METHOD]]([[OPT_ANYOBJECT]], [[BORROWED_SELF]])
337336
// CHECK: end_borrow [[BORROWED_CLASS_EXISTENTIAL]] from [[CLASS_EXISTENTIAL]]
337+
// CHECK: apply [[METHOD]]([[OPT_ANYOBJECT]], [[BORROWED_SELF]])
338338
// CHECK: end_borrow [[BORROWED_SELF]] from [[SELF]]
339339
receiver.takesNullableId(classExistential)
340340

@@ -346,9 +346,9 @@ func passingToNullableId<T: CP, U>(receiver: NSIdLover,
346346
// CHECK-NEXT: [[BRIDGE_ANYTHING:%.*]] = function_ref
347347
// CHECK-NEXT: [[ANYOBJECT:%.*]] = apply [[BRIDGE_ANYTHING]]<U>([[COPY]])
348348
// CHECK-NEXT: [[OPT_ANYOBJECT:%.*]] = enum {{.*}} [[ANYOBJECT]]
349-
// CHECK-NEXT: apply [[METHOD]]([[OPT_ANYOBJECT]], [[BORROWED_SELF]])
350-
// CHECK-NEXT: destroy_value [[ANYOBJECT]]
351349
// CHECK-NEXT: dealloc_stack [[COPY]]
350+
// CHECK-NEXT: apply [[METHOD]]([[OPT_ANYOBJECT]], [[BORROWED_SELF]])
351+
// CHECK-NEXT: destroy_value [[OPT_ANYOBJECT]]
352352
// CHECK-NEXT: end_borrow [[BORROWED_SELF]] from [[SELF]]
353353
receiver.takesNullableId(generic)
354354

@@ -361,10 +361,10 @@ func passingToNullableId<T: CP, U>(receiver: NSIdLover,
361361
// CHECK-NEXT: [[BRIDGE_ANYTHING:%.*]] = function_ref
362362
// CHECK-NEXT: [[ANYOBJECT:%.*]] = apply [[BRIDGE_ANYTHING]]<[[OPENED_TYPE]]>([[OPENED_COPY]])
363363
// CHECK-NEXT: [[OPT_ANYOBJECT:%.*]] = enum {{.*}} [[ANYOBJECT]]
364-
// CHECK-NEXT: apply [[METHOD]]([[OPT_ANYOBJECT]], [[BORROWED_SELF]])
365-
// CHECK-NEXT: destroy_value [[ANYOBJECT]]
366364
// CHECK-NEXT: deinit_existential_addr [[COPY]]
367365
// CHECK-NEXT: dealloc_stack [[COPY]]
366+
// CHECK-NEXT: apply [[METHOD]]([[OPT_ANYOBJECT]], [[BORROWED_SELF]])
367+
// CHECK-NEXT: destroy_value [[OPT_ANYOBJECT]]
368368
// CHECK-NEXT: end_borrow [[BORROWED_SELF]] from [[SELF]]
369369
receiver.takesNullableId(existential)
370370

@@ -378,11 +378,11 @@ func passingToNullableId<T: CP, U>(receiver: NSIdLover,
378378
// CHECK: [[BRIDGE_FUNCTION:%[0-9]+]] = function_ref @_T0s27_bridgeAnythingToObjectiveCs9AnyObject_pxlF
379379
// CHECK-NEXT: [[BRIDGED_ERROR:%[0-9]+]] = apply [[BRIDGE_FUNCTION]]<@opened([[ERROR_ARCHETYPE]]) Error>([[ERROR_STACK]])
380380
// CHECK-NEXT: [[BRIDGED_ERROR_OPT:%[0-9]+]] = enum $Optional<AnyObject>, #Optional.some!enumelt.1, [[BRIDGED_ERROR]] : $AnyObject
381-
// CHECK-NEXT: apply [[METHOD]]([[BRIDGED_ERROR_OPT]], [[BORROWED_SELF]])
382-
// CHECK-NEXT: destroy_value [[BRIDGED_ERROR]] : $AnyObject
383381
// CHECK-NEXT: dealloc_stack [[ERROR_STACK]] : $*@opened([[ERROR_ARCHETYPE]]) Error
384382
// CHECK-NEXT: destroy_value [[ERROR_COPY]] : $Error
385383
// CHECK-NEXT: end_borrow [[BORROWED_ERROR]] from [[ERROR]]
384+
// CHECK-NEXT: apply [[METHOD]]([[BRIDGED_ERROR_OPT]], [[BORROWED_SELF]])
385+
// CHECK-NEXT: destroy_value [[BRIDGED_ERROR_OPT]]
386386
// CHECK-NEXT: end_borrow [[BORROWED_SELF]] from [[SELF]]
387387
receiver.takesNullableId(error)
388388

@@ -395,10 +395,10 @@ func passingToNullableId<T: CP, U>(receiver: NSIdLover,
395395
// CHECK-NEXT: [[BRIDGE_ANYTHING:%.*]] = function_ref
396396
// CHECK-NEXT: [[ANYOBJECT:%.*]] = apply [[BRIDGE_ANYTHING]]<[[OPENED_TYPE]]>([[OPENED_COPY]])
397397
// CHECK-NEXT: [[OPT_ANYOBJECT:%.*]] = enum {{.*}} [[ANYOBJECT]]
398-
// CHECK-NEXT: apply [[METHOD]]([[OPT_ANYOBJECT]], [[BORROWED_SELF]])
399-
// CHECK-NEXT: destroy_value [[ANYOBJECT]]
400398
// CHECK-NEXT: deinit_existential_addr [[COPY]]
401399
// CHECK-NEXT: dealloc_stack [[COPY]]
400+
// CHECK-NEXT: apply [[METHOD]]([[OPT_ANYOBJECT]], [[BORROWED_SELF]])
401+
// CHECK-NEXT: destroy_value [[OPT_ANYOBJECT]]
402402
// CHECK-NEXT: end_borrow [[BORROWED_SELF]] from [[SELF]]
403403
receiver.takesNullableId(any)
404404

@@ -434,9 +434,9 @@ func passingToNullableId<T: CP, U>(receiver: NSIdLover,
434434
// CHECK: br [[JOIN]]([[OPT_NONE]]
435435
//
436436
// CHECK: [[JOIN]]([[PHI:%.*]] : $Optional<AnyObject>):
437+
// CHECK: end_borrow [[BORROWED_OPT_STRING]] from [[OPT_STRING]]
437438
// CHECK: apply [[METHOD]]([[PHI]], [[BORROWED_SELF]])
438439
// CHECK: destroy_value [[PHI]]
439-
// CHECK: end_borrow [[BORROWED_OPT_STRING]] from [[OPT_STRING]]
440440
// CHECK: end_borrow [[BORROWED_SELF]] from [[SELF]]
441441
receiver.takesNullableId(optString)
442442

0 commit comments

Comments
 (0)