mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
The use of 'nocapture' for parameters and return values is incorrect for C++ types, as they can actually capture a pointer into its own value (e.g. std::string in libstdc++) rdar://115062687
130 lines
4.1 KiB
Plaintext
130 lines
4.1 KiB
Plaintext
// RUN: %target-swift-frontend %s -gnone -emit-ir -disable-objc-attr-requires-foundation-module -enable-objc-interop | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-%target-ptrsize-simulator-%target-is-simulator
|
|
|
|
// 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 %0, i64 %1) {{.*}} {
|
|
// CHECK-64: switch i64 %0, label {{%.*}} [
|
|
// CHECK-64: i64 0, label {{%.*}}
|
|
// CHECK-64-simulator-false: i64 2, label {{%.*}}
|
|
// CHECK-64-simulator-false: i64 4, label {{%.*}}
|
|
// CHECK-64-simulator-true: i64 1, label {{%.*}}
|
|
// CHECK-64-simulator-true: i64 2, label {{%.*}}
|
|
// CHECK-64: ]
|
|
|
|
// CHECK-64: inttoptr i64 %0 to ptr
|
|
// CHECK-64: inttoptr i64 %1 to ptr
|
|
|
|
// CHECK-32: define{{( dllexport)?}}{{( protected)?}} swiftcc void @single_payload_class_protocol_switch(i32 %0, i32 %1) {{.*}} {
|
|
// 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 ptr
|
|
// CHECK-32: inttoptr i32 %1 to ptr
|
|
|
|
sil @single_payload_class_protocol_switch : $(SinglePayloadClassProtocol) -> () {
|
|
entry(%c : $SinglePayloadClassProtocol):
|
|
switch_enum %c : $SinglePayloadClassProtocol, case #SinglePayloadClassProtocol.x!enumelt: 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 %0) {{.*}} {
|
|
// CHECK-64: switch i64 %0, label {{%.*}}
|
|
// CHECK-64: i64 0, label {{%.*}}
|
|
// CHECK-64-simulator-false: i64 2, label {{%.*}}
|
|
// CHECK-64-simulator-false: i64 4, label {{%.*}}
|
|
// CHECK-64-simulator-true: i64 1, label {{%.*}}
|
|
// CHECK-64-simulator-true: i64 2, label {{%.*}}
|
|
// CHECK-64: ]
|
|
// CHECK-64: inttoptr i64 %0 to ptr
|
|
|
|
// CHECK-32: define{{( dllexport)?}}{{( protected)?}} swiftcc void @single_payload_objc_protocol_switch(i32 %0) {{.*}} {
|
|
// 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 ptr
|
|
|
|
sil @single_payload_objc_protocol_switch : $(SinglePayloadObjCProtocol) -> () {
|
|
entry(%c : $SinglePayloadObjCProtocol):
|
|
switch_enum %c : $SinglePayloadObjCProtocol, case #SinglePayloadObjCProtocol.x!enumelt: 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(ptr noalias dereferenceable({{.*}}) %0)
|
|
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: 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 : $()
|
|
}
|