Files
swift-mirror/test/DebugInfo/indirect_enum_generic.swift
T
Augusto Noronha 9a42678cd0 [DebugInfo] Emit DW_TAG_reference_type for indirect enum cases in DWARF
Wrap indirect enum case payload types in DW_TAG_reference_type to indicate
that the case stores a pointer to a heap-allocated box rather than the
payload directly.

rdar://170687015
2026-02-23 15:53:16 -08:00

49 lines
2.2 KiB
Swift

// RUN: %target-swift-frontend -primary-file %s -emit-ir -gdwarf-types -o - | %FileCheck %s
// Test that indirect cases in generic enums are represented with
// DW_TAG_reference_type in debug info.
// CHECK-DAG: !DICompositeType(tag: DW_TAG_structure_type, name: "Tree", {{.*}}elements: ![[TREE_OUTER:[0-9]+]]
// CHECK-DAG: ![[TREE_OUTER]] = !{![[TREE_VP:[0-9]+]]}
// CHECK-DAG: ![[TREE_VP]] = !DICompositeType(tag: DW_TAG_variant_part, {{.*}}elements: ![[TREE_ELTS:[0-9]+]])
// CHECK-DAG: ![[TREE_ELTS]] = !{![[LEAF:[0-9]+]], ![[BRANCH:[0-9]+]]}
// Both cases should have reference types since the entire enum is indirect
// CHECK-DAG: ![[LEAF]] = !DIDerivedType(tag: DW_TAG_member, name: "leaf", {{.*}}baseType: ![[LEAF_REF:[0-9]+]]
// CHECK-DAG: ![[LEAF_REF]] = !DIDerivedType(tag: DW_TAG_reference_type,
// CHECK-DAG: ![[BRANCH]] = !DIDerivedType(tag: DW_TAG_member, name: "branch", {{.*}}baseType: ![[BRANCH_REF:[0-9]+]]
// CHECK-DAG: ![[BRANCH_REF]] = !DIDerivedType(tag: DW_TAG_reference_type,
indirect enum Tree<T> {
case leaf(T)
case branch(Tree<T>, Tree<T>)
}
// CHECK-DAG: !DICompositeType(tag: DW_TAG_structure_type, name: "GenericOption", {{.*}}elements: ![[OPT_OUTER:[0-9]+]]
// CHECK-DAG: ![[OPT_OUTER]] = !{![[OPT_VP:[0-9]+]]}
// CHECK-DAG: ![[OPT_VP]] = !DICompositeType(tag: DW_TAG_variant_part, {{.*}}elements: ![[OPT_ELTS:[0-9]+]])
// CHECK-DAG: ![[OPT_ELTS]] = !{![[NONE:[0-9]+]], ![[SOME:[0-9]+]], ![[REC:[0-9]+]]}
// The empty case has no type
// CHECK-DAG: ![[NONE]] = !DIDerivedType(tag: DW_TAG_member, name: "none",
// The `some` case should NOT have a reference type (it's not indirect)
// CHECK-DAG: ![[SOME]] = !DIDerivedType(tag: DW_TAG_member, name: "some", {{.*}}baseType: ![[SOME_TY:[0-9]+]]
// CHECK-DAG: ![[SOME_TY]] = !DICompositeType(tag: DW_TAG_structure_type,
// The `recursive` case should have a reference type
// CHECK-DAG: ![[REC]] = !DIDerivedType(tag: DW_TAG_member, name: "recursive", {{.*}}baseType: ![[REC_REF:[0-9]+]]
// CHECK-DAG: ![[REC_REF]] = !DIDerivedType(tag: DW_TAG_reference_type,
enum GenericOption<T> {
case none
case some(T)
indirect case recursive(GenericOption<T>)
}
let tree = Tree<Int>.leaf(42)
let opt = GenericOption<String>.some("hello")