Skip to content

Commit 28c4129

Browse files
authored
Merge pull request #4398 from DougGregor/sr-2380-swift-3.0
[SILGen] Correctly manage boxed opened existentials when bridging to Any
2 parents 7f83ece + c4cb2ba commit 28c4129

File tree

2 files changed

+32
-1
lines changed

2 files changed

+32
-1
lines changed

lib/SILGen/SILGenBridging.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -465,7 +465,7 @@ static ManagedValue emitNativeToCBridgedNonoptionalValue(SILGenFunction &gen,
465465

466466
auto openedExistential = gen.emitOpenExistential(loc, v, openedTy,
467467
gen.getLoweredType(openedTy));
468-
v = openedExistential.Value;
468+
v = gen.manageOpaqueValue(openedExistential, loc, SGFContext());
469469
loweredNativeTy = openedTy;
470470
}
471471

test/SILGen/objc_bridging_any.swift

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ func passingToId<T: CP, U>(receiver: NSIdLover,
1818
classExistential: CP,
1919
generic: U,
2020
existential: P,
21+
error: Error,
2122
any: Any,
2223
knownUnbridged: KnownUnbridged,
2324
optionalA: String?,
@@ -31,6 +32,7 @@ func passingToId<T: CP, U>(receiver: NSIdLover,
3132
// CHECK: [[CLASS_EXISTENTIAL:%.*]] : $CP
3233
// CHECK: [[GENERIC:%.*]] : $*U
3334
// CHECK: [[EXISTENTIAL:%.*]] : $*P
35+
// CHECK: [[ERROR:%.*]] : $Error
3436
// CHECK: [[ANY:%.*]] : $*Any
3537
// CHECK: [[KNOWN_UNBRIDGED:%.*]] : $KnownUnbridged
3638
// CHECK: [[OPT_STRING:%.*]] : $Optional<String>
@@ -90,6 +92,19 @@ func passingToId<T: CP, U>(receiver: NSIdLover,
9092
// CHECK-NEXT: dealloc_stack [[COPY]]
9193
receiver.takesId(existential)
9294

95+
// CHECK: [[METHOD:%.*]] = class_method [volatile] [[SELF]] : $NSIdLover,
96+
// CHECK-NEXT: strong_retain [[ERROR]] : $Error
97+
// CHECK-NEXT: [[ERROR_BOX:%[0-9]+]] = open_existential_box [[ERROR]] : $Error to $*@opened([[ERROR_ARCHETYPE:"[^"]*"]]) Error
98+
// CHECK-NEXT: [[ERROR_STACK:%[0-9]+]] = alloc_stack $@opened([[ERROR_ARCHETYPE]]) Error
99+
// CHECK-NEXT: copy_addr [[ERROR_BOX]] to [initialization] [[ERROR_STACK]] : $*@opened([[ERROR_ARCHETYPE]]) Error
100+
// CHECK: [[BRIDGE_FUNCTION:%[0-9]+]] = function_ref @_TFs27_bridgeAnythingToObjectiveCurFxPs9AnyObject_
101+
// CHECK-NEXT: [[BRIDGED_ERROR:%[0-9]+]] = apply [[BRIDGE_FUNCTION]]<@opened([[ERROR_ARCHETYPE]]) Error>([[ERROR_STACK]])
102+
// CHECK-NEXT: apply [[METHOD]]([[BRIDGED_ERROR]], [[SELF]])
103+
// CHECK-NEXT: strong_release [[BRIDGED_ERROR]] : $AnyObject
104+
// CHECK-NEXT: dealloc_stack [[ERROR_STACK]] : $*@opened([[ERROR_ARCHETYPE]]) Error
105+
// CHECK-NEXT: strong_release [[ERROR]] : $Error
106+
receiver.takesId(error)
107+
93108
// CHECK: [[METHOD:%.*]] = class_method [volatile] [[SELF]] : $NSIdLover,
94109
// CHECK-NEXT: [[COPY:%.*]] = alloc_stack $Any
95110
// CHECK-NEXT: copy_addr [[ANY]] to [initialization] [[COPY]]
@@ -147,6 +162,7 @@ func passingToNullableId<T: CP, U>(receiver: NSIdLover,
147162
classExistential: CP,
148163
generic: U,
149164
existential: P,
165+
error: Error,
150166
any: Any,
151167
knownUnbridged: KnownUnbridged,
152168
optString: String?,
@@ -170,6 +186,7 @@ func passingToNullableId<T: CP, U>(receiver: NSIdLover,
170186
// CHECK: [[CLASS_EXISTENTIAL:%.*]] : $CP
171187
// CHECK: [[GENERIC:%.*]] : $*U
172188
// CHECK: [[EXISTENTIAL:%.*]] : $*P
189+
// CHECK: [[ERROR:%.*]] : $Error
173190
// CHECK: [[ANY:%.*]] : $*Any,
174191
// CHECK: [[KNOWN_UNBRIDGED:%.*]] : $KnownUnbridged,
175192
// CHECK: [[OPT_STRING:%.*]] : $Optional<String>,
@@ -243,6 +260,20 @@ func passingToNullableId<T: CP, U>(receiver: NSIdLover,
243260
// CHECK-NEXT: dealloc_stack [[COPY]]
244261
receiver.takesNullableId(existential)
245262

263+
// CHECK: [[METHOD:%.*]] = class_method [volatile] [[SELF]] : $NSIdLover,
264+
// CHECK-NEXT: strong_retain [[ERROR]] : $Error
265+
// CHECK-NEXT: [[ERROR_BOX:%[0-9]+]] = open_existential_box [[ERROR]] : $Error to $*@opened([[ERROR_ARCHETYPE:"[^"]*"]]) Error
266+
// CHECK-NEXT: [[ERROR_STACK:%[0-9]+]] = alloc_stack $@opened([[ERROR_ARCHETYPE]]) Error
267+
// CHECK-NEXT: copy_addr [[ERROR_BOX]] to [initialization] [[ERROR_STACK]] : $*@opened([[ERROR_ARCHETYPE]]) Error
268+
// CHECK: [[BRIDGE_FUNCTION:%[0-9]+]] = function_ref @_TFs27_bridgeAnythingToObjectiveCurFxPs9AnyObject_
269+
// CHECK-NEXT: [[BRIDGED_ERROR:%[0-9]+]] = apply [[BRIDGE_FUNCTION]]<@opened([[ERROR_ARCHETYPE]]) Error>([[ERROR_STACK]])
270+
// CHECK-NEXT: [[BRIDGED_ERROR_OPT:%[0-9]+]] = enum $Optional<AnyObject>, #Optional.some!enumelt.1, [[BRIDGED_ERROR]] : $AnyObject
271+
// CHECK-NEXT: apply [[METHOD]]([[BRIDGED_ERROR_OPT]], [[SELF]])
272+
// CHECK-NEXT: strong_release [[BRIDGED_ERROR]] : $AnyObject
273+
// CHECK-NEXT: dealloc_stack [[ERROR_STACK]] : $*@opened([[ERROR_ARCHETYPE]]) Error
274+
// CHECK-NEXT: strong_release [[ERROR]] : $Error
275+
receiver.takesNullableId(error)
276+
246277
// CHECK: [[METHOD:%.*]] = class_method [volatile] [[SELF]] : $NSIdLover,
247278
// CHECK-NEXT: [[COPY:%.*]] = alloc_stack $Any
248279
// CHECK-NEXT: copy_addr [[ANY]] to [initialization] [[COPY]]

0 commit comments

Comments
 (0)