Skip to content

Commit d3fb604

Browse files
committed
[clang][DebugInfo] Set EnumKind for enums marked with enum_extensibility
1 parent f5d6880 commit d3fb604

File tree

2 files changed

+54
-1
lines changed

2 files changed

+54
-1
lines changed

clang/lib/CodeGen/CGDebugInfo.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3617,13 +3617,17 @@ llvm::DIType *CGDebugInfo::CreateTypeDefinition(const EnumType *Ty) {
36173617
// Return a CompositeType for the enum itself.
36183618
llvm::DINodeArray EltArray = DBuilder.getOrCreateArray(Enumerators);
36193619

3620+
std::optional<clang::EnumExtensibilityAttr::Kind> EnumKind;
3621+
if (auto *Attr = ED->getAttr<clang::EnumExtensibilityAttr>())
3622+
EnumKind = Attr->getExtensibility();
3623+
36203624
llvm::DIFile *DefUnit = getOrCreateFile(ED->getLocation());
36213625
unsigned Line = getLineNumber(ED->getLocation());
36223626
llvm::DIScope *EnumContext = getDeclContextDescriptor(ED);
36233627
llvm::DIType *ClassTy = getOrCreateType(ED->getIntegerType(), DefUnit);
36243628
return DBuilder.createEnumerationType(
36253629
EnumContext, ED->getName(), DefUnit, Line, Size, Align, EltArray, ClassTy,
3626-
/*RunTimeLang=*/0, Identifier, ED->isScoped());
3630+
/*RunTimeLang=*/0, Identifier, ED->isScoped(), EnumKind);
36273631
}
36283632

36293633
llvm::DIMacro *CGDebugInfo::CreateMacro(llvm::DIMacroFile *Parent,
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
// RUN: %clang_cc1 -emit-llvm -debug-info-kind=limited %s -o - | FileCheck %s
2+
3+
// CHECK-NOT: enumKind
4+
// CHECK: !DICompositeType(tag: DW_TAG_enumeration_type, name: "ClosedEnum"
5+
// CHECK-SAME: enumKind: DW_APPLE_ENUM_KIND_Closed)
6+
// CHECK: !DICompositeType(tag: DW_TAG_enumeration_type, name: "OpenEnum"
7+
// CHECK-SAME: enumKind: DW_APPLE_ENUM_KIND_Open)
8+
// CHECK: !DICompositeType(tag: DW_TAG_enumeration_type, name: "ClosedFlagEnum"
9+
// CHECK-SAME: enumKind: DW_APPLE_ENUM_KIND_Closed)
10+
// CHECK: !DICompositeType(tag: DW_TAG_enumeration_type, name: "OpenFlagEnum"
11+
// CHECK-SAME: enumKind: DW_APPLE_ENUM_KIND_Open)
12+
// CHECK: !DICompositeType(tag: DW_TAG_enumeration_type, name: "MixedEnum"
13+
// CHECK-SAME: enumKind: DW_APPLE_ENUM_KIND_Open)
14+
15+
enum Enum {
16+
E0, E1
17+
};
18+
19+
enum FlagEnum {
20+
FE0 = 1 << 0, FE1 = 1 << 1
21+
};
22+
23+
enum __attribute__((enum_extensibility(closed))) ClosedEnum {
24+
A0, A1
25+
};
26+
27+
enum __attribute__((enum_extensibility(open))) OpenEnum {
28+
B0, B1
29+
};
30+
31+
enum __attribute__((enum_extensibility(closed),flag_enum)) ClosedFlagEnum {
32+
C0 = 1 << 0, C1 = 1 << 1
33+
};
34+
35+
enum __attribute__((enum_extensibility(open),flag_enum)) OpenFlagEnum {
36+
D0 = 1 << 0, D1 = 1 << 1
37+
};
38+
39+
enum __attribute__((enum_extensibility(open), enum_extensibility(closed))) MixedEnum {
40+
M0, M1
41+
};
42+
43+
enum Enum e;
44+
enum FlagEnum fe;
45+
enum ClosedEnum ce;
46+
enum OpenEnum oe;
47+
enum ClosedFlagEnum cfe;
48+
enum OpenFlagEnum ofe;
49+
enum MixedEnum me;

0 commit comments

Comments
 (0)