@@ -359,3 +359,51 @@ entry(%a : $OA):
359
359
%b = unconditional_checked_cast %a : $OA to $OB
360
360
return %b : $OB
361
361
}
362
+
363
+ protocol P {}
364
+ protocol PAnyObject: AnyObject {}
365
+ class C {}
366
+ sil_vtable C {}
367
+
368
+ // CHECK-LABEL: define{{.*}} @cast_protocol_composition_with_anyobject
369
+ // CHECK: [[C:%.*]] = call swiftcc %swift.metadata_response @"$s5casts1CCMa"
370
+ // CHECK: [[C_META:%.*]] = extractvalue %swift.metadata_response [[C]], 0
371
+ // CHECK: call { i8*, i8** } @dynamic_cast_existential_1_superclass_conditional({{.*}}, %swift.type* [[C_META]], %swift.protocol* {{.*}}@"$s5casts1PMp"
372
+
373
+ sil @cast_protocol_composition_with_anyobject : $@convention(thin) (@owned P & AnyObject ) -> @owned Optional<C & P> {
374
+ bb0(%0: $P & AnyObject):
375
+ checked_cast_br %0 : $P & AnyObject to $C & P, bb1, bb2
376
+
377
+ bb1(%2 : $C & P):
378
+ %3 = enum $Optional<C & P>, #Optional.some!enumelt.1, %2 : $C & P
379
+ br bb3(%3 : $Optional<C & P>)
380
+
381
+ bb2:
382
+ strong_release %0 : $P & AnyObject
383
+ %6 = enum $Optional<C & P>, #Optional.none!enumelt
384
+ br bb3(%6 : $Optional<C & P>)
385
+
386
+ bb3(%11 : $Optional<C & P>):
387
+ return %11 : $Optional<C & P>
388
+ }
389
+
390
+ // CHECK-LABEL: define{{.*}} @cast_protocol_with_anyobject
391
+ // CHECK: [[C:%.*]] = call swiftcc %swift.metadata_response @"$s5casts1CCMa"
392
+ // CHECK: [[C_META:%.*]] = extractvalue %swift.metadata_response [[C]], 0
393
+ // CHECK: call { i8*, i8** } @dynamic_cast_existential_1_superclass_conditional({{.*}}, %swift.type* [[C_META]], %swift.protocol* {{.*}}@"$s5casts10PAnyObjectMp"
394
+ sil @cast_protocol_with_anyobject : $@convention(thin) (@owned PAnyObject ) -> @owned Optional<C & PAnyObject> {
395
+ bb0(%0: $PAnyObject):
396
+ checked_cast_br %0 : $PAnyObject to $C & PAnyObject, bb1, bb2
397
+
398
+ bb1(%2 : $C & PAnyObject):
399
+ %3 = enum $Optional<C & PAnyObject>, #Optional.some!enumelt.1, %2 : $C & PAnyObject
400
+ br bb3(%3 : $Optional<C & PAnyObject>)
401
+
402
+ bb2:
403
+ strong_release %0 : $PAnyObject
404
+ %6 = enum $Optional<C & PAnyObject>, #Optional.none!enumelt
405
+ br bb3(%6 : $Optional<C & PAnyObject>)
406
+
407
+ bb3(%11 : $Optional<C & PAnyObject>):
408
+ return %11 : $Optional<C & PAnyObject>
409
+ }
0 commit comments