[lldb] Fix FindDirectNestedType not working with class templates (#81666)
This patch attempts to fix lookup in class template specialization. The first fixed problem is that during type lookup `DeclContextGetName` have been dropping template arguments. So when such a name was compared against a name in `DW_AT_name`, which contains template arguments, false mismatches have been occurring. The second fixed problem is that LLDB's printing policy hasn't been matching Clang's printing policy when it comes to integral non-type template arguments. This again caused some false mismatches during type lookup, because Clang puts e.g. `3U` in debug info for class specializations, but LLDB has been expecting just `3`. This patch brings printing policy in line with what Clang does.
This commit is contained in:
committed by
GitHub
parent
dfae162773
commit
7b7d411de9
@@ -150,6 +150,23 @@ class TypeAndTypeListTestCase(TestBase):
|
||||
invalid_type = task_type.FindDirectNestedType(None)
|
||||
self.assertFalse(invalid_type)
|
||||
|
||||
# Check that FindDirectNestedType works with types from AST
|
||||
pointer = frame0.FindVariable("pointer")
|
||||
pointer_type = pointer.GetType()
|
||||
self.assertTrue(pointer_type)
|
||||
self.DebugSBType(pointer_type)
|
||||
pointer_info_type = pointer_type.template_args[1]
|
||||
self.assertTrue(pointer_info_type)
|
||||
self.DebugSBType(pointer_info_type)
|
||||
|
||||
pointer_masks1_type = pointer_info_type.FindDirectNestedType("Masks1")
|
||||
self.assertTrue(pointer_masks1_type)
|
||||
self.DebugSBType(pointer_masks1_type)
|
||||
|
||||
pointer_masks2_type = pointer_info_type.FindDirectNestedType("Masks2")
|
||||
self.assertTrue(pointer_masks2_type)
|
||||
self.DebugSBType(pointer_masks2_type)
|
||||
|
||||
# We'll now get the child member 'id' from 'task_head'.
|
||||
id = task_head.GetChildMemberWithName("id")
|
||||
self.DebugSBValue(id)
|
||||
|
||||
@@ -34,6 +34,14 @@ public:
|
||||
{}
|
||||
};
|
||||
|
||||
template <unsigned Value> struct PointerInfo {
|
||||
enum Masks1 { pointer_mask };
|
||||
enum class Masks2 { pointer_mask };
|
||||
};
|
||||
|
||||
template <unsigned Value, typename InfoType = PointerInfo<Value>>
|
||||
struct Pointer {};
|
||||
|
||||
enum EnumType {};
|
||||
enum class ScopedEnumType {};
|
||||
enum class EnumUChar : unsigned char {};
|
||||
@@ -71,5 +79,9 @@ int main (int argc, char const *argv[])
|
||||
ScopedEnumType scoped_enum_type;
|
||||
EnumUChar scoped_enum_type_uchar;
|
||||
|
||||
Pointer<3> pointer;
|
||||
PointerInfo<3>::Masks1 mask1 = PointerInfo<3>::Masks1::pointer_mask;
|
||||
PointerInfo<3>::Masks2 mask2 = PointerInfo<3>::Masks2::pointer_mask;
|
||||
|
||||
return 0; // Break at this line
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user