blob: c37bbcda413eec8c573f2159bb2d26a49d6b1b58 [file] [log] [blame]
// RUN: %empty-directory(%t)
// RUN: %target-build-swift -lswiftSwiftReflectionTest %s -o %t/reflect_Enum_value
// RUN: %target-codesign %t/reflect_Enum_value
// RUN: %target-run %target-swift-reflection-test %t/reflect_Enum_value | tee /dev/stderr | %FileCheck %s --check-prefix=CHECK --check-prefix=X%target-ptrsize --dump-input=fail
// REQUIRES: objc_interop
// REQUIRES: executable_test
// UNSUPPORTED: use_os_stdlib
import Foundation
import SwiftReflectionTest
enum OneCaseNoPayload {
case only
}
reflect(enum: OneCaseNoPayload.only)
// CHECK: Reflecting an enum.
// CHECK-NEXT: Instance pointer in child address space: 0x{{[0-9a-fA-F]+}}
// CHECK-NEXT: Type reference:
// CHECK-NEXT: (enum reflect_Enum_value.OneCaseNoPayload)
// CHECK: Type info:
// CHECK-NEXT: (no_payload_enum size=0 alignment=1 stride=1 num_extra_inhabitants=0 bitwise_takable=1
// CHECK-NEXT: (case name=only index=0))
// CHECK: Enum value:
// CHECK-NEXT: (enum_value name=only index=0)
reflect(enumValue: Optional<OneCaseNoPayload>.some(.only))
// CHECK: Reflecting an enum value.
// CHECK-NEXT: Type reference:
// CHECK-NEXT: (bound_generic_enum Swift.Optional
// CHECK-NEXT: (enum reflect_Enum_value.OneCaseNoPayload))
// CHECK-NEXT: Value: .some(.only)
reflect(enumValue: Optional<Optional<OneCaseNoPayload>>.some(.some(.only)))
// CHECK: Reflecting an enum value.
// CHECK-NEXT: Type reference:
// CHECK-NEXT: (bound_generic_enum Swift.Optional
// CHECK-NEXT: (bound_generic_enum Swift.Optional
// CHECK-NEXT: (enum reflect_Enum_value.OneCaseNoPayload)))
// CHECK-NEXT: Value: .some(.some(.only))
reflect(enumValue: Optional<Optional<OneCaseNoPayload>>.some(.none))
// CHECK: Reflecting an enum value.
// CHECK-NEXT: Type reference:
// CHECK-NEXT: (bound_generic_enum Swift.Optional
// CHECK-NEXT: (bound_generic_enum Swift.Optional
// CHECK-NEXT: (enum reflect_Enum_value.OneCaseNoPayload)))
// CHECK-NEXT: Value: .some(.none)
struct StructInt {
var a: Int
}
enum OneStructPayload {
case payloadA(StructInt)
case cowboyAlice
case cowboyBob
case cowboyCharlie
}
reflect(enumValue: OneStructPayload.payloadA(StructInt(a: 0)))
// CHECK: Reflecting an enum value.
// CHECK-NEXT: Type reference:
// CHECK-NEXT: (enum reflect_Enum_value.OneStructPayload)
// CHECK-NEXT: Value: .payloadA(_)
reflect(enumValue: OneStructPayload.cowboyCharlie)
// CHECK: Reflecting an enum value.
// CHECK-NEXT: Type reference:
// CHECK-NEXT: (enum reflect_Enum_value.OneStructPayload)
// CHECK-NEXT: Value: .cowboyCharlie
@objc class ObjCClass : NSObject {
var a: Int = 0
}
enum OneObjCPayload {
case payloadA(ObjCClass)
case otherA
case otherB
case otherC
case otherD
case otherE
}
reflect(enumValue: OneObjCPayload.payloadA(ObjCClass()))
// CHECK: Reflecting an enum value.
// CHECK-NEXT: Type reference:
// CHECK-NEXT: (enum reflect_Enum_value.OneObjCPayload)
// CHECK-NEXT: Value: .payloadA(_)
reflect(enumValue: OneObjCPayload.otherC)
// CHECK: Reflecting an enum value.
// CHECK-NEXT: Type reference:
// CHECK-NEXT: (enum reflect_Enum_value.OneObjCPayload)
// CHECK-NEXT: Value: .otherC
class SwiftClass {
var a: Int = 0
}
enum OneSwiftClassPayload {
case payloadA(SwiftClass)
case otherA
case otherB
case otherC
case otherD
case otherE
}
reflect(enumValue: OneSwiftClassPayload.payloadA(SwiftClass()))
// CHECK: Reflecting an enum value.
// CHECK-NEXT: Type reference:
// CHECK-NEXT: (enum reflect_Enum_value.OneSwiftClassPayload)
// CHECK-NEXT: Value: .payloadA(_)
reflect(enum: OneSwiftClassPayload.otherC)
// CHECK: Reflecting an enum.
// CHECK-NEXT: Instance pointer in child address space: 0x{{[0-9a-fA-F]+}}
// CHECK-NEXT: Type reference:
// CHECK-NEXT: (enum reflect_Enum_value.OneSwiftClassPayload)
// CHECK: Type info:
// X64-NEXT: (single_payload_enum size=8 alignment=8 stride=8 num_extra_inhabitants=2147483642 bitwise_takable=1
// X32-NEXT: (single_payload_enum size=4 alignment=4 stride=4 num_extra_inhabitants=4091 bitwise_takable=1
// CHECK-NEXT: (case name=payloadA index=0 offset=0
// CHECK-NEXT: (reference kind=strong refcounting=native))
// CHECK-NEXT: (case name=otherA index=1)
// CHECK-NEXT: (case name=otherB index=2)
// CHECK-NEXT: (case name=otherC index=3)
// CHECK-NEXT: (case name=otherD index=4)
// CHECK-NEXT: (case name=otherE index=5))
// CHECK: Enum value:
// CHECK-NEXT: (enum_value name=otherC index=3)
reflect(enumValue: Optional<OneSwiftClassPayload>.none)
// CHECK: Reflecting an enum value.
// CHECK-NEXT: Type reference:
// CHECK-NEXT: (bound_generic_enum Swift.Optional
// CHECK-NEXT: (enum reflect_Enum_value.OneSwiftClassPayload))
// CHECK-NEXT: Value: .none
reflect(enumValue: Optional<Optional<OneSwiftClassPayload>>.none)
// CHECK: Reflecting an enum value.
// CHECK-NEXT: Type reference:
// CHECK-NEXT: (bound_generic_enum Swift.Optional
// CHECK-NEXT: (bound_generic_enum Swift.Optional
// CHECK-NEXT: (enum reflect_Enum_value.OneSwiftClassPayload)))
// CHECK-NEXT: Value: .none
reflect(enumValue: Optional<Optional<OneSwiftClassPayload>>.some(.none))
// CHECK: Reflecting an enum value.
// CHECK-NEXT: Type reference:
// CHECK-NEXT: (bound_generic_enum Swift.Optional
// CHECK-NEXT: (bound_generic_enum Swift.Optional
// CHECK-NEXT: (enum reflect_Enum_value.OneSwiftClassPayload)))
// CHECK-NEXT: Value: .some(.none)
reflect(enumValue: Optional<Optional<OneSwiftClassPayload>>.some(.some(.otherC)))
// CHECK: Reflecting an enum value.
// CHECK-NEXT: Type reference:
// CHECK-NEXT: (bound_generic_enum Swift.Optional
// CHECK-NEXT: (bound_generic_enum Swift.Optional
// CHECK-NEXT: (enum reflect_Enum_value.OneSwiftClassPayload)))
// CHECK-NEXT: Value: .some(.some(.otherC))
reflect(enumValue: Optional<Optional<OneSwiftClassPayload>>.some(.some(.otherE)))
// CHECK: Reflecting an enum value.
// CHECK-NEXT: Type reference:
// CHECK-NEXT: (bound_generic_enum Swift.Optional
// CHECK-NEXT: (bound_generic_enum Swift.Optional
// CHECK-NEXT: (enum reflect_Enum_value.OneSwiftClassPayload)))
// CHECK-NEXT: Value: .some(.some(.otherE))
reflect(enumValue: Optional<Optional<OneSwiftClassPayload>>.some(.some(.payloadA(SwiftClass()))))
// CHECK: Reflecting an enum value.
// CHECK-NEXT: Type reference:
// CHECK-NEXT: (bound_generic_enum Swift.Optional
// CHECK-NEXT: (bound_generic_enum Swift.Optional
// CHECK-NEXT: (enum reflect_Enum_value.OneSwiftClassPayload)))
// CHECK-NEXT: Value: .some(.some(.payloadA(_)))
struct MixedStruct {
var a = Int(0)
var b = SwiftClass()
}
enum OneMixedStructPayload {
case otherA
case otherB
case payloadA(MixedStruct)
}
reflect(enumValue: OneMixedStructPayload.otherB)
// CHECK: Reflecting an enum value.
// CHECK-NEXT: Type reference:
// CHECK-NEXT: (enum reflect_Enum_value.OneMixedStructPayload)
// CHECK-NEXT: Value: .otherB
reflect(enumValue: OneMixedStructPayload.payloadA(MixedStruct()))
// CHECK: Reflecting an enum value.
// CHECK-NEXT: Type reference:
// CHECK-NEXT: (enum reflect_Enum_value.OneMixedStructPayload)
// CHECK-NEXT: Value: .payloadA(_)
reflect(enumValue: Optional<OneMixedStructPayload>.none)
// CHECK: Reflecting an enum value.
// CHECK-NEXT: Type reference:
// CHECK-NEXT: (bound_generic_enum Swift.Optional
// CHECK-NEXT: (enum reflect_Enum_value.OneMixedStructPayload))
// CHECK-NEXT: Value: .none
enum OneNestedPayload {
case cargoA(OneMixedStructPayload)
case alternateA
case alternateB
case alternateC
}
reflect(enumValue: OneNestedPayload.alternateB)
// CHECK: Reflecting an enum value.
// CHECK-NEXT: Type reference:
// CHECK-NEXT: (enum reflect_Enum_value.OneNestedPayload)
// CHECK-NEXT: Value: .alternateB
enum OneTuplePayload {
case holderA((i: Int, c: SwiftClass))
case emptyA
case emptyB
case emptyC
}
reflect(enumValue: OneTuplePayload.holderA((i: 7, c: SwiftClass())))
// CHECK: Reflecting an enum value.
// CHECK-NEXT: Type reference:
// CHECK-NEXT: (enum reflect_Enum_value.OneTuplePayload)
// CHECK-NEXT: Value: .holderA(_)
reflect(enumValue: OneTuplePayload.emptyB)
// CHECK: Reflecting an enum value.
// CHECK-NEXT: Type reference:
// CHECK-NEXT: (enum reflect_Enum_value.OneTuplePayload)
// CHECK-NEXT: Value: .emptyB
func foo() -> Int { return 7; }
enum OneFunctionPayload {
case cargoA(() -> Int)
case alternateA
case alternateB
case alternateC
}
reflect(enumValue: OneFunctionPayload.cargoA(foo))
// CHECK: Reflecting an enum value.
// CHECK-NEXT: Type reference:
// CHECK-NEXT: (enum reflect_Enum_value.OneFunctionPayload)
// CHECK-NEXT: Value: .cargoA(_)
reflect(enumValue: OneFunctionPayload.alternateC)
// CHECK: Reflecting an enum value.
// CHECK-NEXT: Type reference:
// CHECK-NEXT: (enum reflect_Enum_value.OneFunctionPayload)
// CHECK-NEXT: Value: .alternateC
func tester1() {
let a = 7
func foo() -> Int { return a; }
enum OneClosurePayload {
case cargoA(() -> Int)
case alternateA
case alternateB
case alternateC
}
reflect(enumValue: OneClosurePayload.cargoA(foo))
// CHECK: Reflecting an enum value.
// CHECK-NEXT: Type reference:
// XXX TODO: Figure out why the type reference is dumped differently sometimes:
// XXXX-NEXT: (nominal with unmangled suffix
// XXXX-NEXT: (enum OneClosurePayload #1 in reflect_Enum_value.tester1() -> ())
// CHECK: Value: .cargoA(_)
reflect(enumValue: OneClosurePayload.alternateB)
// CHECK: Reflecting an enum value.
// CHECK-NEXT: Type reference:
// XXX TODO: Figure out why the type reference is dumped differently sometimes:
// XXXX-NEXT: (nominal with unmangled suffix
// XXXX-NEXT: (enum OneClosurePayload #1 in reflect_Enum_value.tester1() -> ())
// CHECK: Value: .alternateB
}
tester1()
enum OneOptionalPayload {
case boxA(Optional<Int>)
case unboxA
case unboxB
case unboxC
case unboxD
case unboxE
}
reflect(enumValue: OneOptionalPayload.boxA(7))
// CHECK: Reflecting an enum value.
// CHECK-NEXT: Type reference:
// CHECK-NEXT: (enum reflect_Enum_value.OneOptionalPayload)
// CHECK-NEXT: Value: .boxA(.some(_))
reflect(enumValue: OneOptionalPayload.unboxE)
// CHECK: Reflecting an enum value.
// CHECK-NEXT: Type reference:
// CHECK-NEXT: (enum reflect_Enum_value.OneOptionalPayload)
// CHECK-NEXT: Value: .unboxE
indirect enum OneIndirectPayload {
case child(OneIndirectPayload)
case leafA
case leafB
case leafC
case leafD
case leafE
case leafF
}
reflect(enumValue: OneIndirectPayload.child(.leafF))
// CHECK: Reflecting an enum value.
// CHECK-NEXT: Type reference:
// CHECK-NEXT: (enum reflect_Enum_value.OneIndirectPayload)
// CHECK-NEXT: Value: .child(_)
reflect(enumValue: OneIndirectPayload.leafF)
// CHECK: Reflecting an enum value.
// CHECK-NEXT: Type reference:
// CHECK-NEXT: (enum reflect_Enum_value.OneIndirectPayload)
// CHECK-NEXT: Value: .leafF
class SimpleSwiftClass {
let value = 7
}
struct StructWrappingSimpleSwiftClass {
let wrapped = SimpleSwiftClass()
}
enum EnumWrappingStructWrappingSimpleSwiftClass {
case payload(StructWrappingSimpleSwiftClass)
case nonpayloadA
case nonpayloadB
}
reflect(enumValue: EnumWrappingStructWrappingSimpleSwiftClass.payload(StructWrappingSimpleSwiftClass()))
// CHECK: Reflecting an enum value.
// CHECK-NEXT: Type reference:
// CHECK-NEXT: (enum reflect_Enum_value.EnumWrappingStructWrappingSimpleSwiftClass)
// CHECK-NEXT: Value: .payload(_)
reflect(enumValue: Optional<EnumWrappingStructWrappingSimpleSwiftClass>.some(.payload(StructWrappingSimpleSwiftClass())))
// CHECK: Reflecting an enum value.
// CHECK-NEXT: Type reference:
// CHECK-NEXT: (bound_generic_enum Swift.Optional
// CHECK-NEXT: (enum reflect_Enum_value.EnumWrappingStructWrappingSimpleSwiftClass))
// CHECK-NEXT: Value: .some(.payload(_))
reflect(enumValue: Optional<EnumWrappingStructWrappingSimpleSwiftClass>.none)
// CHECK: Reflecting an enum value.
// CHECK-NEXT: Type reference:
// CHECK-NEXT: (bound_generic_enum Swift.Optional
// CHECK-NEXT: (enum reflect_Enum_value.EnumWrappingStructWrappingSimpleSwiftClass))
// CHECK-NEXT: Value: .none
// XXX TODO: test enum with thin function payload XXX
doneReflecting()
// CHECK: Done.