diff options
-rw-r--r-- | lldb/lit/SymbolFile/NativePDB/Inputs/nested-types.lldbinit | 1 | ||||
-rw-r--r-- | lldb/lit/SymbolFile/NativePDB/nested-types.cpp | 17 | ||||
-rw-r--r-- | lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp | 5 |
3 files changed, 19 insertions, 4 deletions
diff --git a/lldb/lit/SymbolFile/NativePDB/Inputs/nested-types.lldbinit b/lldb/lit/SymbolFile/NativePDB/Inputs/nested-types.lldbinit index 21c3001e3a1..466df81fc42 100644 --- a/lldb/lit/SymbolFile/NativePDB/Inputs/nested-types.lldbinit +++ b/lldb/lit/SymbolFile/NativePDB/Inputs/nested-types.lldbinit @@ -8,5 +8,6 @@ target variable -T GlobalE target variable -T GlobalF target variable -T GlobalG target variable -T GlobalH +target variable -T GlobalEnum target modules dump ast diff --git a/lldb/lit/SymbolFile/NativePDB/nested-types.cpp b/lldb/lit/SymbolFile/NativePDB/nested-types.cpp index 5693f7f320f..eb2b3ec7e34 100644 --- a/lldb/lit/SymbolFile/NativePDB/nested-types.cpp +++ b/lldb/lit/SymbolFile/NativePDB/nested-types.cpp @@ -11,6 +11,11 @@ struct S { int A = 0; int B = 1; }; + + enum class NestedEnum { + EnumValue1 = 0, + EnumValue2 = 1, + }; int C = 2; int D = 3; using VoidPtrT = void *; @@ -70,6 +75,7 @@ constexpr T::U GlobalE; constexpr U<int> GlobalF; constexpr U<int>::V<int> GlobalG; constexpr U<int>::W GlobalH; +constexpr S::NestedEnum GlobalEnum = S::NestedEnum::EnumValue1; int main(int argc, char **argv) { @@ -113,6 +119,8 @@ int main(int argc, char **argv) { // CHECK: (int) I = 8 // CHECK: (int) J = 9 // CHECK: } +// CHECK: (lldb) target variable -T GlobalEnum +// CHECK: (const S::NestedEnum) GlobalEnum = EnumValue1 // CHECK: (lldb) target modules dump ast // CHECK: Dumping clang ast for 1 modules. // CHECK: TranslationUnitDecl {{.*}} @@ -120,9 +128,12 @@ int main(int argc, char **argv) { // CHECK: | |-FieldDecl {{.*}} C 'int' // CHECK: | |-FieldDecl {{.*}} D 'int' // CHECK: | |-FieldDecl {{.*}} DD 'void *' -// CHECK: | `-CXXRecordDecl {{.*}} struct NestedStruct definition -// CHECK: | |-FieldDecl {{.*}} A 'int' -// CHECK: | `-FieldDecl {{.*}} B 'int' +// CHECK: | |-CXXRecordDecl {{.*}} struct NestedStruct definition +// CHECK: | | |-FieldDecl {{.*}} A 'int' +// CHECK: | | `-FieldDecl {{.*}} B 'int' +// CHECK: | `-EnumDecl {{.*}} NestedEnum
+// CHECK: | |-EnumConstantDecl {{.*}} EnumValue1 'S::NestedEnum'
+// CHECK: | `-EnumConstantDecl {{.*}} EnumValue2 'S::NestedEnum' // CHECK: |-CXXRecordDecl {{.*}} struct T definition // CHECK: | |-FieldDecl {{.*}} NT 'int' // CHECK: | |-CXXRecordDecl {{.*}} struct NestedStruct definition diff --git a/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp b/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp index 956e56f504d..778c4021962 100644 --- a/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp +++ b/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp @@ -188,7 +188,10 @@ GetNestedTagRecord(const NestedTypeRecord &Record, const CVTagRecord &parent, // inner tag type is not necessarily the same as the outer tag type, re-write // it to match the inner tag type. qname[3] = child.asTag().getUniqueName()[3]; - std::string piece = Record.Name; + std::string piece; + if (qname[3] == 'W') + piece = "4"; + piece += Record.Name; piece.push_back('@'); qname.insert(4, std::move(piece)); if (qname != child.asTag().UniqueName) |