mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
Use a syntax that declares the layout's generic parameters and fields,
followed by the generic arguments to apply to the layout:
{ var Int, let String } // A concrete box layout with a mutable Int
// and immutable String field
<T, U> { var T, let U } <Int, String> // A generic box layout,
// applied to Int and String
// arguments
208 lines
5.5 KiB
Plaintext
208 lines
5.5 KiB
Plaintext
// RUN: %target-sil-opt -assume-parsing-unqualified-ownership-sil -enable-sil-verify-all %s -split-critical-edges | %FileCheck %s
|
|
|
|
import Builtin
|
|
import Swift
|
|
|
|
sil_stage raw
|
|
|
|
enum OnePayload {
|
|
case x(Builtin.Int64)
|
|
case y
|
|
}
|
|
|
|
// CHECK-LABEL: sil @check_switch_enum
|
|
// CHECK: bb0(
|
|
// CHECK: cond_br %1, bb1, bb2
|
|
// CHECK: bb1:
|
|
// CHECK: integer_literal $Builtin.Int64, 1
|
|
// CHECK: br bb4(
|
|
// CHECK: bb2:
|
|
// CHECK: switch_enum {{.*}} : $OnePayload, case #OnePayload.x!enumelt.1: bb3, case #OnePayload.y!enumelt: bb5
|
|
// CHECK: bb3([[PAYLOAD:%.]] : $Builtin.Int64):
|
|
// CHECK: br bb4([[PAYLOAD]] : $Builtin.Int64)
|
|
// CHECK: bb4([[VAL:%.*]] : $Builtin.Int64):
|
|
// CHECK: struct $Int64 ([[VAL]] : $Builtin.Int64)
|
|
// CHECK: br bb6
|
|
// CHECK: bb5:
|
|
// CHECK: br bb6
|
|
// CHECK: bb6:
|
|
// CHECK: return
|
|
|
|
sil @check_switch_enum : $(OnePayload, Builtin.Int1) -> () {
|
|
entry(%0 : $OnePayload, %1: $Builtin.Int1):
|
|
cond_br %1, bb1, bb2
|
|
|
|
bb1:
|
|
%2 = integer_literal $Builtin.Int64, 1
|
|
br x_dest(%2 : $Builtin.Int64)
|
|
|
|
bb2:
|
|
switch_enum %0 : $OnePayload, case #OnePayload.x!enumelt.1: x_dest, case #OnePayload.y!enumelt: y_dest
|
|
|
|
x_dest(%4: $Builtin.Int64):
|
|
%5 = struct $Int64 (%4 : $Builtin.Int64)
|
|
br end
|
|
|
|
y_dest:
|
|
br end
|
|
|
|
end:
|
|
%v = tuple ()
|
|
return %v : $()
|
|
}
|
|
|
|
// CHECK-LABEL: sil @check_switch_value
|
|
// CHECK: bb0
|
|
// CHECK: cond_br %1, bb1, bb2
|
|
// CHECK: bb1:
|
|
// CHECK: integer_literal $Builtin.Int64, 1
|
|
// CHECK: br bb4
|
|
// CHECK: bb2:
|
|
// CHECK: [[VAL:%[0-9]+]] = integer_literal $Builtin.Int32, 1
|
|
// CHECK: switch_value %0 : $Builtin.Int32, case [[VAL]]: bb3, default bb5
|
|
// CHECK: bb3:
|
|
// CHECK: br bb4
|
|
// CHECK: bb4:
|
|
// CHECK: br bb6
|
|
// CHECK: bb5:
|
|
// CHECK: br bb6
|
|
// CHECK: bb6:
|
|
// CHECK: return
|
|
|
|
sil @check_switch_value : $(Builtin.Int32, Builtin.Int1) -> () {
|
|
entry(%0 : $Builtin.Int32, %1: $Builtin.Int1):
|
|
cond_br %1, bb1, bb2
|
|
|
|
bb1:
|
|
%2 = integer_literal $Builtin.Int64, 1
|
|
br x_dest
|
|
bb2:
|
|
%3 = integer_literal $Builtin.Int32, 1
|
|
switch_value %0 : $Builtin.Int32, case %3: x_dest, default y_dest
|
|
|
|
x_dest:
|
|
br end
|
|
|
|
y_dest:
|
|
br end
|
|
|
|
end:
|
|
%v = tuple ()
|
|
return %v : $()
|
|
}
|
|
|
|
class X {
|
|
@objc func f() { }
|
|
@objc class func g() { }
|
|
@objc var value : Int { get }
|
|
@objc subscript (i : Int) -> Int { get }
|
|
}
|
|
|
|
// CHECK: sil @dynamic_lookup_br : $@convention(thin) (AnyObject, Builtin.Int1) -> () {
|
|
// CHECK: bb0(
|
|
// CHECK: cond_br %1, bb1, bb4
|
|
// CHECK: bb1:
|
|
// CHECK: dynamic_method_br {{.*}} : $Builtin.UnknownObject, #X.f!1.foreign, bb3, bb2
|
|
// CHECK: bb2:
|
|
// CHECK: br bb8
|
|
// CHECK: bb3({{.*}} : $@convention(objc_method) (Builtin.UnknownObject) -> ())
|
|
// CHECK: br bb7({{.*}} : $@convention(objc_method) (Builtin.UnknownObject) -> ())
|
|
// CHECK: bb4:
|
|
// CHECK: dynamic_method_br {{.*}} : $Builtin.UnknownObject, #X.f!1.foreign, bb6, bb5
|
|
// CHECK: bb5:
|
|
// CHECK: br bb8
|
|
// CHECK: bb6({{.*}} : $@convention(objc_method) (Builtin.UnknownObject) -> ()):
|
|
// CHECK: br bb7({{.*}} : $@convention(objc_method) (Builtin.UnknownObject) -> ())
|
|
// CHECK: bb7({{.*}} : $@convention(objc_method) (Builtin.UnknownObject) -> ()):
|
|
// CHECK: br bb9
|
|
// CHECK: bb8:
|
|
// CHECK: br bb9
|
|
// CHECK: bb9:
|
|
// CHECK: return
|
|
|
|
sil @dynamic_lookup_br : $@convention(thin) (AnyObject, Builtin.Int1) -> () {
|
|
bb0(%0 : $AnyObject, %10: $Builtin.Int1):
|
|
cond_br %10, lookup1, lookup2
|
|
|
|
lookup1:
|
|
%1 = alloc_box $<τ_0_0> { var τ_0_0 } <AnyObject>
|
|
%1a = project_box %1 : $<τ_0_0> { var τ_0_0 } <AnyObject>, 0
|
|
store %0 to %1a : $*AnyObject
|
|
%3 = alloc_box $<τ_0_0> { var τ_0_0 } <Optional<() -> ()>>
|
|
%4 = load %1a : $*AnyObject
|
|
strong_retain %4 : $AnyObject
|
|
%6 = open_existential_ref %4 : $AnyObject to $@opened("01234567-89ab-cdef-0123-000000000000") AnyObject
|
|
%7 = unchecked_ref_cast %6 : $@opened("01234567-89ab-cdef-0123-000000000000") AnyObject to $Builtin.UnknownObject
|
|
dynamic_method_br %7 : $Builtin.UnknownObject, #X.f!1.foreign, bb1, bb2
|
|
|
|
lookup2:
|
|
%21 = alloc_box $<τ_0_0> { var τ_0_0 } <AnyObject>
|
|
%21a = project_box %21 : $<τ_0_0> { var τ_0_0 } <AnyObject>, 0
|
|
store %0 to %21a : $*AnyObject
|
|
%23 = alloc_box $<τ_0_0> { var τ_0_0 } <Optional<() -> ()>>
|
|
%24 = load %21a : $*AnyObject
|
|
strong_retain %24 : $AnyObject
|
|
%26 = open_existential_ref %24 : $AnyObject to $@opened("12345678-89ab-cdef-0123-000000000000") AnyObject
|
|
%27 = unchecked_ref_cast %26 : $@opened("12345678-89ab-cdef-0123-000000000000") AnyObject to $Builtin.UnknownObject
|
|
dynamic_method_br %27 : $Builtin.UnknownObject, #X.f!1.foreign, bb1, bb2
|
|
|
|
bb1(%8 : $@convention(objc_method) (Builtin.UnknownObject) -> ()):
|
|
br bb3
|
|
|
|
bb2:
|
|
br bb3
|
|
|
|
bb3:
|
|
%43 = tuple ()
|
|
return %43 : $()
|
|
}
|
|
|
|
class Node {
|
|
}
|
|
|
|
class ParentNode : Node {
|
|
}
|
|
|
|
// CHECK-LABEL: sil @test_checked_cast_br
|
|
// CHECK: bb0(
|
|
// CHECK: cond_br %1, bb1, bb4
|
|
// CHECK: bb1:
|
|
// CHECK: checked_cast_br [exact] {{.*}} : $Node to $ParentNode, bb3, bb2
|
|
// CHECK: bb2:
|
|
// CHECK: br bb8
|
|
// CHECK: bb3({{.*}} : $ParentNode):
|
|
// CHECK: br bb7({{.*}} : $ParentNode)
|
|
// CHECK: bb4:
|
|
// CHECK: checked_cast_br [exact] {{.*}} : $Node to $ParentNode, bb6, bb5
|
|
// CHECK: bb5:
|
|
// CHECK: br bb8
|
|
// CHECK: bb6({{.*}} : $ParentNode):
|
|
// CHECK: br bb7({{.*}} : $ParentNode)
|
|
// CHECK: bb7({{.*}} : $ParentNode):
|
|
// CHECK: br bb9
|
|
// CHECK: bb8:
|
|
// CHECK: br bb9
|
|
// CHECK: bb9:
|
|
// CHECK: return
|
|
|
|
sil @test_checked_cast_br : $@convention(method) (@owned Node, Builtin.Int1) -> () {
|
|
bb0(%0 : $Node, %2 : $Builtin.Int1):
|
|
cond_br %2, ccb1, ccb2
|
|
|
|
ccb1:
|
|
checked_cast_br [exact] %0 : $Node to $ParentNode, bb2, bb3
|
|
|
|
ccb2:
|
|
checked_cast_br [exact] %0 : $Node to $ParentNode, bb2, bb3
|
|
|
|
bb2(%5 : $ParentNode):
|
|
br bb1
|
|
|
|
bb3:
|
|
br bb1
|
|
|
|
bb1:
|
|
%1 = tuple ()
|
|
return %1 : $()
|
|
}
|