Skip to content

Commit 042a0b0

Browse files
authored
[lldb] Make SBType::GetDirectNestedType (mostly) work with typedefs (llvm#91189)
The implementation is straight-forward, but comes with a big disclaimer. See llvm#91186 for details.
1 parent 97be79c commit 042a0b0

File tree

3 files changed

+23
-0
lines changed

3 files changed

+23
-0
lines changed

lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7106,6 +7106,8 @@ TypeSystemClang::GetDirectNestedTypeWithName(lldb::opaque_compiler_type_t type,
71067106
for (NamedDecl *decl : record_decl->lookup(decl_name)) {
71077107
if (auto *tag_decl = dyn_cast<clang::TagDecl>(decl))
71087108
return GetType(getASTContext().getTagDeclType(tag_decl));
7109+
if (auto *typedef_decl = dyn_cast<clang::TypedefNameDecl>(decl))
7110+
return GetType(getASTContext().getTypedefType(typedef_decl));
71097111
}
71107112
break;
71117113
}

lldb/test/API/python_api/type/TestTypeList.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,22 @@ def test(self):
273273
self.DebugSBType(int_enum_uchar)
274274
self.assertEqual(int_enum_uchar.GetName(), "unsigned char")
275275

276+
def test_nested_typedef(self):
277+
"""Exercise FindDirectNestedType for typedefs."""
278+
self.build()
279+
target = self.dbg.CreateTarget(self.getBuildArtifact())
280+
self.assertTrue(target)
281+
282+
with_nested_typedef = target.FindFirstType("WithNestedTypedef")
283+
self.assertTrue(with_nested_typedef)
284+
285+
# This is necessary to work around #91186
286+
self.assertTrue(target.FindFirstGlobalVariable("typedefed_value").GetType())
287+
288+
the_typedef = with_nested_typedef.FindDirectNestedType("TheTypedef")
289+
self.assertTrue(the_typedef)
290+
self.assertEqual(the_typedef.GetTypedefedType().GetName(), "int")
291+
276292
def test_GetByteAlign(self):
277293
"""Exercise SBType::GetByteAlign"""
278294
self.build()

lldb/test/API/python_api/type/main.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,11 @@ enum class EnumUChar : unsigned char {};
5353
struct alignas(128) OverAlignedStruct {};
5454
OverAlignedStruct over_aligned_struct;
5555

56+
struct WithNestedTypedef {
57+
typedef int TheTypedef;
58+
};
59+
WithNestedTypedef::TheTypedef typedefed_value;
60+
5661
int main (int argc, char const *argv[])
5762
{
5863
Task *task_head = new Task(-1, NULL);

0 commit comments

Comments
 (0)