diff options
Diffstat (limited to 'lldb/source')
| -rw-r--r-- | lldb/source/API/SBType.cpp | 6 | ||||
| -rw-r--r-- | lldb/source/DataFormatters/FormatManager.cpp | 24 | ||||
| -rw-r--r-- | lldb/source/Symbol/ClangASTContext.cpp | 5 |
3 files changed, 29 insertions, 6 deletions
diff --git a/lldb/source/API/SBType.cpp b/lldb/source/API/SBType.cpp index 8efc701a79f..33b67ad4c00 100644 --- a/lldb/source/API/SBType.cpp +++ b/lldb/source/API/SBType.cpp @@ -212,8 +212,10 @@ SBType SBType::GetArrayElementType() { if (!IsValid()) return LLDB_RECORD_RESULT(SBType()); - return LLDB_RECORD_RESULT(SBType(TypeImplSP( - new TypeImpl(m_opaque_sp->GetCompilerType(true).GetArrayElementType())))); + CompilerType canonical_type = + m_opaque_sp->GetCompilerType(true).GetCanonicalType(); + return LLDB_RECORD_RESULT( + SBType(TypeImplSP(new TypeImpl(canonical_type.GetArrayElementType())))); } SBType SBType::GetArrayType(uint64_t size) { diff --git a/lldb/source/DataFormatters/FormatManager.cpp b/lldb/source/DataFormatters/FormatManager.cpp index 08fc56a72ea..d5db3ee75bf 100644 --- a/lldb/source/DataFormatters/FormatManager.cpp +++ b/lldb/source/DataFormatters/FormatManager.cpp @@ -230,11 +230,33 @@ void FormatManager::GetPossibleMatches( if (non_ptr_type.IsTypedefType()) { CompilerType deffed_pointed_type = non_ptr_type.GetTypedefedType().GetPointerType(); + const bool stripped_typedef = true; GetPossibleMatches( valobj, deffed_pointed_type, reason | lldb_private::eFormatterChoiceCriterionNavigatedTypedefs, use_dynamic, entries, did_strip_ptr, did_strip_ref, - true); // this is not exactly the usual meaning of stripping typedefs + stripped_typedef); // this is not exactly the usual meaning of + // stripping typedefs + } + } + + // For arrays with typedef-ed elements, we add a candidate with the typedef + // stripped. + uint64_t array_size; + if (compiler_type.IsArrayType(nullptr, &array_size, nullptr)) { + CompilerType element_type = compiler_type.GetArrayElementType(); + if (element_type.IsTypedefType()) { + // Get the stripped element type and compute the stripped array type + // from it. + CompilerType deffed_array_type = + element_type.GetTypedefedType().GetArrayType(array_size); + const bool stripped_typedef = true; + GetPossibleMatches( + valobj, deffed_array_type, + reason | lldb_private::eFormatterChoiceCriterionNavigatedTypedefs, + use_dynamic, entries, did_strip_ptr, did_strip_ref, + stripped_typedef); // this is not exactly the usual meaning of + // stripping typedefs } } diff --git a/lldb/source/Symbol/ClangASTContext.cpp b/lldb/source/Symbol/ClangASTContext.cpp index c846e410acf..0cc83254947 100644 --- a/lldb/source/Symbol/ClangASTContext.cpp +++ b/lldb/source/Symbol/ClangASTContext.cpp @@ -3924,7 +3924,7 @@ CompilerType ClangASTContext::GetArrayElementType(lldb::opaque_compiler_type_t type, uint64_t *stride) { if (type) { - clang::QualType qual_type(GetCanonicalQualType(type)); + clang::QualType qual_type(GetQualType(type)); const clang::Type *array_eletype = qual_type.getTypePtr()->getArrayElementTypeNoTypeQual(); @@ -3932,8 +3932,7 @@ ClangASTContext::GetArrayElementType(lldb::opaque_compiler_type_t type, if (!array_eletype) return CompilerType(); - CompilerType element_type = - GetType(array_eletype->getCanonicalTypeUnqualified()); + CompilerType element_type = GetType(clang::QualType(array_eletype, 0)); // TODO: the real stride will be >= this value.. find the real one! if (stride) |

