Index: lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp =================================================================== --- lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp +++ lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp @@ -5172,12 +5172,15 @@ } break; + case clang::Type::LValueReference: + case clang::Type::RValueReference: case clang::Type::ObjCObjectPointer: { - const clang::ObjCObjectPointerType *pointer_type = - llvm::cast(qual_type.getTypePtr()); - clang::QualType pointee_type = pointer_type->getPointeeType(); - uint32_t num_pointee_children = - GetType(pointee_type).GetNumChildren(omit_empty_base_classes, exe_ctx); + CompilerType pointee_clang_type(GetPointeeType(type)); + + uint32_t num_pointee_children = 0; + if (pointee_clang_type.IsAggregateType()) + num_pointee_children = + pointee_clang_type.GetNumChildren(omit_empty_base_classes, exe_ctx); // If this type points to a simple type, then it has 1 child if (num_pointee_children == 0) num_children = 1; @@ -5209,8 +5212,11 @@ const clang::PointerType *pointer_type = llvm::cast(qual_type.getTypePtr()); clang::QualType pointee_type(pointer_type->getPointeeType()); - uint32_t num_pointee_children = - GetType(pointee_type).GetNumChildren(omit_empty_base_classes, exe_ctx); + CompilerType pointee_clang_type(GetType(pointee_type)); + uint32_t num_pointee_children = 0; + if (pointee_clang_type.IsAggregateType()) + num_pointee_children = + pointee_clang_type.GetNumChildren(omit_empty_base_classes, exe_ctx); if (num_pointee_children == 0) { // We have a pointer to a pointee type that claims it has no children. We // will want to look at @@ -5219,20 +5225,6 @@ num_children = num_pointee_children; } break; - case clang::Type::LValueReference: - case clang::Type::RValueReference: { - const clang::ReferenceType *reference_type = - llvm::cast(qual_type.getTypePtr()); - clang::QualType pointee_type = reference_type->getPointeeType(); - uint32_t num_pointee_children = - GetType(pointee_type).GetNumChildren(omit_empty_base_classes, exe_ctx); - // If this type points to a simple type, then it has 1 child - if (num_pointee_children == 0) - num_children = 1; - else - num_children = num_pointee_children; - } break; - default: break; } Index: lldb/test/API/functionalities/pointer_num_children/Makefile =================================================================== --- /dev/null +++ lldb/test/API/functionalities/pointer_num_children/Makefile @@ -0,0 +1,3 @@ +CXX_SOURCES := main.cpp + +include Makefile.rules Index: lldb/test/API/functionalities/pointer_num_children/TestPointerNumChildren.py =================================================================== --- /dev/null +++ lldb/test/API/functionalities/pointer_num_children/TestPointerNumChildren.py @@ -0,0 +1,28 @@ +""" +Test children counts of pointer values. +""" + +import lldb +from lldbsuite.test.decorators import * +from lldbsuite.test.lldbtest import * +from lldbsuite.test import lldbutil + + +class TestPointerNumChilden(TestBase): + mydir = TestBase.compute_mydir(__file__) + + def test_pointer_num_children(self): + self.build() + lldbutil.run_to_source_breakpoint(self, "// break here", lldb.SBFileSpec("main.cpp")) + + result = self.frame().FindVariable("Ref") + self.assertEqual(1, result.GetNumChildren()) + self.assertEqual(2, result.GetChildAtIndex(0).GetNumChildren()) + self.assertEqual("42", result.GetChildAtIndex(0).GetChildAtIndex(0).GetValue()) + self.assertEqual("56", result.GetChildAtIndex(0).GetChildAtIndex(1).GetValue()) + + result = self.frame().FindVariable("Ptr") + self.assertEqual(1, result.GetNumChildren()) + self.assertEqual(2, result.GetChildAtIndex(0).GetNumChildren()) + self.assertEqual("42", result.GetChildAtIndex(0).GetChildAtIndex(0).GetValue()) + self.assertEqual("56", result.GetChildAtIndex(0).GetChildAtIndex(1).GetValue()) Index: lldb/test/API/functionalities/pointer_num_children/main.cpp =================================================================== --- /dev/null +++ lldb/test/API/functionalities/pointer_num_children/main.cpp @@ -0,0 +1,16 @@ +struct Inner { + int a; + int b; +}; + +struct Outer { + Inner *inner; +}; + +int main() { + Inner inner{42, 56}; + Outer outer{&inner}; + Inner **Ptr = &(outer.inner); + Inner *&Ref = outer.inner; + return 0; // break here +}