[Lldb-commits] [lldb] 8324020 - [lldb] Make SBType::FindDirectNestedType work with dynamic types (#207743)
via lldb-commits
lldb-commits at lists.llvm.org
Thu Jul 9 00:50:23 PDT 2026
Author: Pavel Labath
Date: 2026-07-09T09:50:18+02:00
New Revision: 832402097e77794095c3b59be9ea60bbaa4ce0f3
URL: https://github.com/llvm/llvm-project/commit/832402097e77794095c3b59be9ea60bbaa4ce0f3
DIFF: https://github.com/llvm/llvm-project/commit/832402097e77794095c3b59be9ea60bbaa4ce0f3.diff
LOG: [lldb] Make SBType::FindDirectNestedType work with dynamic types (#207743)
This makes it possible to find the nested type just by knowing the
dynamic type of the value. To get the previous behavior, get the type
from a static view of the value (SBValue::GetStaticValue).
Added:
Modified:
lldb/source/Symbol/Type.cpp
lldb/test/API/python_api/type/TestTypeList.py
lldb/test/API/python_api/type/main.cpp
Removed:
################################################################################
diff --git a/lldb/source/Symbol/Type.cpp b/lldb/source/Symbol/Type.cpp
index 7681d7065a522..9b62018bbd3d8 100644
--- a/lldb/source/Symbol/Type.cpp
+++ b/lldb/source/Symbol/Type.cpp
@@ -1215,7 +1215,7 @@ bool TypeImpl::GetDescription(lldb_private::Stream &strm,
CompilerType TypeImpl::FindDirectNestedType(llvm::StringRef name) {
if (name.empty())
return CompilerType();
- return GetCompilerType(/*prefer_dynamic=*/false)
+ return GetCompilerType(/*prefer_dynamic=*/true)
.GetDirectNestedTypeWithName(name);
}
diff --git a/lldb/test/API/python_api/type/TestTypeList.py b/lldb/test/API/python_api/type/TestTypeList.py
index e4dc810169089..ff9690794d1b3 100644
--- a/lldb/test/API/python_api/type/TestTypeList.py
+++ b/lldb/test/API/python_api/type/TestTypeList.py
@@ -300,6 +300,34 @@ def test_nested_typedef(self):
self.assertTrue(the_typedef)
self.assertEqual(the_typedef.GetTypedefedType().GetName(), "int")
+ @expectedFailureWindows # Dynamic type resolution not implemented
+ def test_dynamic_values(self):
+ """Test FindDirectNestedType on dynamic values"""
+
+ self.build()
+ lldbutil.run_to_line_breakpoint(self, lldb.SBFileSpec(self.source), self.line)
+ polymorphic = (
+ self.frame()
+ .FindVariable("polymorphic")
+ .GetDynamicValue(lldb.eDynamicDontRunTarget)
+ )
+ self.DebugSBValue(polymorphic)
+ polymorphic_type = polymorphic.GetType().GetPointeeType()
+ self.DebugSBType(polymorphic_type)
+ nested = polymorphic_type.FindDirectNestedType("Nested")
+ self.DebugSBType(nested)
+ self.assertEqual(nested.GetName(), "PolymorphicDerived::Nested")
+ self.assertEqual(nested.GetTypedefedType().GetName(), "float")
+
+ static = polymorphic.GetStaticValue()
+ self.DebugSBValue(static)
+ static_type = static.GetType().GetPointeeType()
+ self.DebugSBType(static_type)
+ nested = static_type.FindDirectNestedType("Nested")
+ self.DebugSBType(nested)
+ self.assertEqual(nested.GetName(), "PolymorphicBase::Nested")
+ self.assertEqual(nested.GetTypedefedType().GetName(), "int")
+
def test_GetByteAlign(self):
"""Exercise SBType::GetByteAlign"""
self.build()
diff --git a/lldb/test/API/python_api/type/main.cpp b/lldb/test/API/python_api/type/main.cpp
index 449f77db0d75e..9de1988ec7efc 100644
--- a/lldb/test/API/python_api/type/main.cpp
+++ b/lldb/test/API/python_api/type/main.cpp
@@ -63,6 +63,17 @@ struct WithNestedTypedef {
};
WithNestedTypedef::TheTypedef typedefed_value;
+struct PolymorphicBase {
+ using Nested = int;
+ Nested get() { return {}; }
+ virtual void foo() {}
+};
+
+struct PolymorphicDerived : PolymorphicBase {
+ using Nested = float;
+ Nested get() { return {}; }
+};
+
int main (int argc, char const *argv[])
{
Task *task_head = new Task(-1, NULL);
@@ -100,5 +111,7 @@ int main (int argc, char const *argv[])
PointerInfo<3>::Masks1 mask1 = PointerInfo<3>::Masks1::pointer_mask;
PointerInfo<3>::Masks2 mask2 = PointerInfo<3>::Masks2::pointer_mask;
+ PolymorphicBase *polymorphic = new PolymorphicDerived();
+
return 0; // Break at this line
}
More information about the lldb-commits
mailing list