| // RUN: %target-swift-frontend -assume-parsing-unqualified-ownership-sil %s -gnone -emit-ir -disable-objc-attr-requires-foundation-module -enable-objc-interop | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize |
| |
| // REQUIRES: CPU=i386 || CPU=x86_64 |
| |
| // We have to claim this is raw SIL because there are critical edges from non |
| // cond_br instructions. |
| sil_stage raw |
| |
| import Builtin |
| import Swift |
| |
| @objc class OC {} |
| sil_vtable OC {} |
| sil hidden @$s9enum_objc2OCCACycfcTo : $@convention(thin) (OC) -> OC { |
| entry(%x : $OC): |
| return %x : $OC |
| } |
| |
| protocol PC : class {} |
| @objc protocol PO {} |
| |
| enum SinglePayloadClassProtocol { |
| case x(PC) |
| case y, z, w |
| } |
| |
| enum SinglePayloadObjCProtocol { |
| case x(PO) |
| case y, z, w |
| } |
| |
| // CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @single_payload_class_protocol_switch(i64, i64) {{.*}} { |
| // CHECK-64: switch i64 %0, label {{%.*}} [ |
| // CHECK-64: i64 0, label {{%.*}} |
| // CHECK-64: i64 2, label {{%.*}} |
| // CHECK-64: i64 4, label {{%.*}} |
| // CHECK-64: ] |
| |
| // CHECK-64: inttoptr i64 %0 to %objc_object* |
| // CHECK-64: inttoptr i64 %1 to i8** |
| |
| // CHECK-32: define{{( dllexport)?}}{{( protected)?}} swiftcc void @single_payload_class_protocol_switch(i32, i32) {{.*}} { |
| // CHECK-32: switch i32 %0, label {{%.*}} [ |
| // CHECK-32: i32 0, label {{%.*}} |
| // CHECK-32: i32 1, label {{%.*}} |
| // CHECK-32: i32 2, label {{%.*}} |
| // CHECK-32: ] |
| |
| // CHECK-32: inttoptr i32 %0 to %objc_object* |
| // CHECK-32: inttoptr i32 %1 to i8** |
| |
| sil @single_payload_class_protocol_switch : $(SinglePayloadClassProtocol) -> () { |
| entry(%c : $SinglePayloadClassProtocol): |
| switch_enum %c : $SinglePayloadClassProtocol, case #SinglePayloadClassProtocol.x!enumelt.1: x_dest, case #SinglePayloadClassProtocol.y!enumelt: y_dest, case #SinglePayloadClassProtocol.z!enumelt: z_dest, case #SinglePayloadClassProtocol.w!enumelt: w_dest |
| |
| x_dest(%d : $PC): |
| br end |
| y_dest: |
| br end |
| z_dest: |
| br end |
| w_dest: |
| br end |
| |
| end: |
| return undef : $() |
| } |
| |
| // CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @single_payload_objc_protocol_switch(i64) {{.*}} { |
| // CHECK-64: switch i64 %0, label {{%.*}} |
| // CHECK-64: i64 0, label {{%.*}} |
| // CHECK-64: i64 2, label {{%.*}} |
| // CHECK-64: i64 4, label {{%.*}} |
| // CHECK-64: ] |
| // CHECK-64: inttoptr i64 %0 to %objc_object* |
| |
| // CHECK-32: define{{( dllexport)?}}{{( protected)?}} swiftcc void @single_payload_objc_protocol_switch(i32) {{.*}} { |
| // CHECK-32: switch i32 %0, label {{%.*}} |
| // CHECK-32: i32 0, label {{%.*}} |
| // CHECK-32: i32 1, label {{%.*}} |
| // CHECK-32: i32 2, label {{%.*}} |
| // CHECK-32: ] |
| // CHECK-32: inttoptr i32 %0 to %objc_object* |
| |
| sil @single_payload_objc_protocol_switch : $(SinglePayloadObjCProtocol) -> () { |
| entry(%c : $SinglePayloadObjCProtocol): |
| switch_enum %c : $SinglePayloadObjCProtocol, case #SinglePayloadObjCProtocol.x!enumelt.1: x_dest, case #SinglePayloadObjCProtocol.y!enumelt: y_dest, case #SinglePayloadObjCProtocol.z!enumelt: z_dest, case #SinglePayloadObjCProtocol.w!enumelt: w_dest |
| |
| x_dest(%d : $PO): |
| br end |
| y_dest: |
| br end |
| z_dest: |
| br end |
| w_dest: |
| br end |
| |
| end: |
| return undef : $() |
| } |
| |
| protocol delegateProtocol : AnyObject { } |
| |
| struct StructWithWeakVar { |
| weak var delegate: delegateProtocol? |
| } |
| |
| // CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @weak_optional(%T9enum_objc17StructWithWeakVarVSg* noalias nocapture dereferenceable({{.*}})) |
| sil @weak_optional : $@convention(thin) (@in StructWithWeakVar?) -> () { |
| entry(%x : $*StructWithWeakVar?): |
| // CHECK: icmp eq [[WORD:i32|i64]] {{%.*}}, 0 |
| switch_enum_addr %x : $*StructWithWeakVar?, |
| case #Optional.some!enumelt.1: a, |
| case #Optional.none!enumelt: b |
| a: |
| br x |
| b: |
| // CHECK: store [[WORD]] 0 |
| // CHECK: store [[WORD]] 1 |
| inject_enum_addr %x : $*StructWithWeakVar?, #Optional.none!enumelt |
| br x |
| |
| x: |
| return undef : $() |
| } |
| |
| // Weak existentials allow extra inhabitants if not @objc, therefore StructWithWeakVar must emit: |
| // CHECK: define linkonce_odr hidden void @"$s9enum_objc17StructWithWeakVarVwxs" |