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
|
// RUN: %target-swift-frontend -primary-file %s -emit-ir -module-name protocol_with_superclass | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-runtime -DINT=i%target-ptrsize
sil_stage canonical
import Builtin
import Swift
// CHECK-LABEL: @"$s24protocol_with_superclass17ProtoRefinesClassMp" =
class Concrete {}
class SubConcrete : Concrete {}
protocol SuperProto where Self : AnyObject {}
protocol ProtoRefinesClass where Self : SuperProto, Self : Concrete {}
protocol SubProto where Self : ProtoRefinesClass {}
protocol OtherProto {}
class Derived : Concrete, ProtoRefinesClass {}
class SubDerived : Derived {}
class MoreDerived : Concrete, SubProto {}
// CHECK-objc-LABEL: define hidden swiftcc void @checkExistentialDowncast(ptr %0, {{.*}} {
// CHECK-native-LABEL: define hidden swiftcc void @checkExistentialDowncast(ptr %0, ptr %1, ptr %2, ptr %3, ptr %4, ptr %5, ptr %6, ptr %7, ptr %8) {{.*}} {
sil hidden @checkExistentialDowncast : $@convention(thin) (@owned Concrete, @owned SuperProto, @owned SuperProto & Concrete, @owned ProtoRefinesClass, @owned SubProto) -> () {
bb0(%0 : $Concrete, %1 : $SuperProto, %2 : $SuperProto & Concrete, %3 : $ProtoRefinesClass, %4 : $SubProto):
// CHECK: [[ISA:%.*]] = load ptr, ptr %0
// CHECK-NEXT: [[RESULT:%.*]] = call { ptr, ptr } @dynamic_cast_existential_1_unconditional(ptr %0, ptr [[ISA]], {{.*}} @"$s24protocol_with_superclass17ProtoRefinesClassMp"
// CHECK-NEXT: [[FIRST:%.*]] = extractvalue { ptr, ptr } [[RESULT]], 0
%5 = unconditional_checked_cast %0 : $Concrete to ProtoRefinesClass
// CHECK: call void @swift_release(ptr [[FIRST]])
strong_release %5 : $ProtoRefinesClass
// CHECK: [[ISA:%.*]] = load ptr, ptr %0
// CHECK-NEXT: [[RESULT:%.*]] = call { ptr, ptr } @dynamic_cast_existential_1_unconditional(ptr %0, ptr [[ISA]], {{.*}} @"$s24protocol_with_superclass8SubProtoMp"
// CHECK-NEXT: [[FIRST:%.*]] = extractvalue { ptr, ptr } [[RESULT]], 0
%6 = unconditional_checked_cast %0 : $Concrete to SubProto
// CHECK: call void @swift_release(ptr [[FIRST]])
strong_release %6 : $SubProto
// CHECK-objc: [[ISA:%.*]] = call ptr @swift_getObjectType(ptr %{{[0-9]+}})
// CHECK-native-NEXT: [[ISA:%.*]] = load ptr, ptr %1
// CHECK-NEXT: [[RESULT:%.*]] = call { ptr, ptr } @dynamic_cast_existential_1_unconditional(ptr %1, ptr [[ISA]], {{.*}} @"$s24protocol_with_superclass17ProtoRefinesClassMp"
// CHECK-NEXT: [[FIRST:%.*]] = extractvalue { ptr, ptr } [[RESULT]], 0
%7 = unconditional_checked_cast %1 : $SuperProto to ProtoRefinesClass
// CHECK: call void @swift_release(ptr [[FIRST]])
strong_release %7 : $ProtoRefinesClass
// CHECK-objc: [[ISA:%.*]] = call ptr @swift_getObjectType(ptr %{{[0-9]+}})
// CHECK-native-NEXT: [[ISA:%.*]] = load ptr, ptr %1
// CHECK-NEXT: [[RESULT:%.*]] = call { ptr, ptr } @dynamic_cast_existential_1_unconditional(ptr %1, ptr [[ISA]], {{.*}} @"$s24protocol_with_superclass8SubProtoMp"
// CHECK-NEXT: [[FIRST:%.*]] = extractvalue { ptr, ptr } [[RESULT]], 0
%8 = unconditional_checked_cast %1 : $SuperProto to SubProto
// CHECK: call void @swift_release(ptr [[FIRST]])
strong_release %8 : $SubProto
// CHECK: [[ISA:%.*]] = load ptr, ptr %{{[0-9]+}}
// CHECK-NEXT: [[RESULT:%.*]] = call { ptr, ptr } @dynamic_cast_existential_1_unconditional(ptr %{{[0-9]+}}, ptr [[ISA]], {{.*}} @"$s24protocol_with_superclass17ProtoRefinesClassMp"
// CHECK-NEXT: [[FIRST:%.*]] = extractvalue { ptr, ptr } [[RESULT]], 0
%9 = unconditional_checked_cast %2 : $SuperProto & Concrete to ProtoRefinesClass
// CHECK: call void @swift_release(ptr [[FIRST]])
strong_release %9 : $ProtoRefinesClass
// CHECK: [[ISA:%.*]] = load ptr, ptr %{{[0-9]+}}
// CHECK-NEXT: [[RESULT:%.*]] = call { ptr, ptr } @dynamic_cast_existential_1_unconditional(ptr %{{[0-9]+}}, ptr [[ISA]], {{.*}} @"$s24protocol_with_superclass8SubProtoMp"
// CHECK-NEXT: [[FIRST:%.*]] = extractvalue { ptr, ptr } [[RESULT]], 0
%10 = unconditional_checked_cast %2 : $SuperProto & Concrete to SubProto
// CHECK: call void @swift_release(ptr [[FIRST]])
strong_release %10 : $SubProto
// CHECK: [[RESPONSE:%.*]] = call swiftcc %swift.metadata_response @"$s24protocol_with_superclass7DerivedCMa"(i{{[0-9]+}} 0)
// CHECK-NEXT: [[METADATA:%.*]] = extractvalue %swift.metadata_response [[RESPONSE]], 0
// CHECK-NEXT: [[RESULT:%.*]] = call ptr @swift_dynamicCastClassUnconditional(ptr %{{[0-9]+}}, ptr [[METADATA]], {{.*}})
%11 = unconditional_checked_cast %3 : $ProtoRefinesClass to Derived
// CHECK: call void @swift_release(ptr [[RESULT]])
strong_release %11 : $Derived
// CHECK: [[RESPONSE:%.*]] = call swiftcc %swift.metadata_response @"$s24protocol_with_superclass10SubDerivedCMa"(i{{[0-9]+}} 0)
// CHECK-NEXT: [[METADATA:%.*]] = extractvalue %swift.metadata_response [[RESPONSE]], 0
// CHECK-NEXT: [[RESULT:%.*]] = call ptr @swift_dynamicCastClassUnconditional(ptr %{{[0-9]+}}, ptr [[METADATA]], {{.*}})
%12 = unconditional_checked_cast %3 : $ProtoRefinesClass to SubDerived
// CHECK: call void @swift_release(ptr [[RESULT]])
strong_release %12 : $SubDerived
// CHECK: [[ISA:%.*]] = load ptr, ptr %{{[0-9]+}}
// CHECK-NEXT: [[RESULT:%.*]] = call { ptr, ptr } @dynamic_cast_existential_1_unconditional(ptr %{{[0-9]+}}, ptr [[ISA]], {{.*}} @"$s24protocol_with_superclass10OtherProtoMp"
// CHECK-NEXT: [[FIRST:%.*]] = extractvalue { ptr, ptr } [[RESULT]], 0
%13 = unconditional_checked_cast %3 : $ProtoRefinesClass to OtherProto & Concrete
// CHECK: call void @swift_release(ptr [[FIRST]])
strong_release %13 : $OtherProto & Concrete
// CHECK: [[ISA:%.*]] = load ptr, ptr %{{[0-9]+}}
// CHECK-NEXT: [[RESPONSE:%.*]] = call swiftcc %swift.metadata_response @"$s24protocol_with_superclass11SubConcreteCMa"(i{{[0-9]+}} 0)
// CHECK-NEXT: [[METADATA:%.*]] = extractvalue %swift.metadata_response [[RESPONSE]], 0
// CHECK-NEXT: [[RESULT:%.*]] = call { ptr, ptr } @dynamic_cast_existential_1_superclass_unconditional(ptr %{{[0-9]+}}, ptr [[ISA]], ptr [[METADATA]], {{.*}} @"$s24protocol_with_superclass10OtherProtoMp"
// CHECK-NEXT: [[FIRST:%.*]] = extractvalue { ptr, ptr } [[RESULT]], 0
%14 = unconditional_checked_cast %3 : $ProtoRefinesClass to OtherProto & SubConcrete
// CHECK: call void @swift_release(ptr [[FIRST]])
strong_release %14 : $OtherProto & SubConcrete
// CHECK: [[RESPONSE:%.*]] = call swiftcc %swift.metadata_response @"$s24protocol_with_superclass11MoreDerivedCMa"(i{{[0-9]+}} 0)
// CHECK-NEXT: [[METADATA:%.*]] = extractvalue %swift.metadata_response [[RESPONSE]], 0
// CHECK-NEXT: [[RESULT:%.*]] = call ptr @swift_dynamicCastClassUnconditional(ptr %{{[0-9]+}}, ptr [[METADATA]], {{.*}})
%15 = unconditional_checked_cast %4 : $SubProto to MoreDerived
// CHECK: call void @swift_release(ptr [[RESULT]])
strong_release %15 : $MoreDerived
// CHECK: [[ISA:%.*]] = load ptr, ptr %{{[0-9]+}}
// CHECK-NEXT: [[RESULT:%.*]] = call { ptr, ptr } @dynamic_cast_existential_1_unconditional(ptr %{{[0-9]+}}, ptr [[ISA]], {{.*}} @"$s24protocol_with_superclass10OtherProtoMp"
// CHECK-NEXT: [[FIRST:%.*]] = extractvalue { ptr, ptr } [[RESULT]], 0
%16 = unconditional_checked_cast %4 : $SubProto to OtherProto & Concrete
// CHECK: call void @swift_release(ptr [[FIRST]])
strong_release %16 : $OtherProto & Concrete
%result = tuple ()
return %result : $()
}
sil_vtable Concrete {}
sil_vtable SubConcrete {}
sil_vtable Derived {}
sil_vtable SubDerived {}
sil_vtable MoreDerived {}
|