Author: Ilia Kuklin Date: 2025-05-12T22:59:40+05:00 New Revision: c8a0513a1a694078e5ea927faf8249ce77084d80
URL: https://github.com/llvm/llvm-project/commit/c8a0513a1a694078e5ea927faf8249ce77084d80 DIFF: https://github.com/llvm/llvm-project/commit/c8a0513a1a694078e5ea927faf8249ce77084d80.diff LOG: [lldb] Restore ObjC incomplete type dereferencing fix (#139567) Attempt an ObjC incomplete type fix even if `GetDereferencedType` returns an error. Added: Modified: lldb/source/ValueObject/ValueObject.cpp Removed: ################################################################################ diff --git a/lldb/source/ValueObject/ValueObject.cpp b/lldb/source/ValueObject/ValueObject.cpp index 6f0fe9a5b83f9..46426ae499be9 100644 --- a/lldb/source/ValueObject/ValueObject.cpp +++ b/lldb/source/ValueObject/ValueObject.cpp @@ -2810,46 +2810,47 @@ ValueObjectSP ValueObject::Dereference(Status &error) { std::string deref_error; if (deref_compiler_type_or_err) { deref_compiler_type = *deref_compiler_type_or_err; - if (deref_compiler_type && deref_byte_size) { - ConstString deref_name; - if (!deref_name_str.empty()) - deref_name.SetCString(deref_name_str.c_str()); - - m_deref_valobj = - new ValueObjectChild(*this, deref_compiler_type, deref_name, - deref_byte_size, deref_byte_offset, 0, 0, false, - true, eAddressTypeInvalid, language_flags); - } - - // In case of incomplete deref compiler type, use the pointee type and try - // to recreate a new ValueObjectChild using it. - if (!m_deref_valobj) { - // FIXME(#59012): C++ stdlib formatters break with incomplete types (e.g. - // `std::vector<int> &`). Remove ObjC restriction once that's resolved. - if (Language::LanguageIsObjC(GetPreferredDisplayLanguage()) && - HasSyntheticValue()) { - deref_compiler_type = compiler_type.GetPointeeType(); - - if (deref_compiler_type) { - ConstString deref_name; - if (!deref_name_str.empty()) - deref_name.SetCString(deref_name_str.c_str()); - - m_deref_valobj = new ValueObjectChild( - *this, deref_compiler_type, deref_name, deref_byte_size, - deref_byte_offset, 0, 0, false, true, eAddressTypeInvalid, - language_flags); - } - } - } } else { deref_error = llvm::toString(deref_compiler_type_or_err.takeError()); LLDB_LOG(GetLog(LLDBLog::Types), "could not find child: {0}", deref_error); - if (IsSynthetic()) { - m_deref_valobj = GetChildMemberWithName("$$dereference$$").get(); + } + + if (deref_compiler_type && deref_byte_size) { + ConstString deref_name; + if (!deref_name_str.empty()) + deref_name.SetCString(deref_name_str.c_str()); + + m_deref_valobj = + new ValueObjectChild(*this, deref_compiler_type, deref_name, + deref_byte_size, deref_byte_offset, 0, 0, false, + true, eAddressTypeInvalid, language_flags); + } + + // In case of incomplete deref compiler type, use the pointee type and try + // to recreate a new ValueObjectChild using it. + if (!m_deref_valobj) { + // FIXME(#59012): C++ stdlib formatters break with incomplete types (e.g. + // `std::vector<int> &`). Remove ObjC restriction once that's resolved. + if (Language::LanguageIsObjC(GetPreferredDisplayLanguage()) && + HasSyntheticValue()) { + deref_compiler_type = compiler_type.GetPointeeType(); + + if (deref_compiler_type) { + ConstString deref_name; + if (!deref_name_str.empty()) + deref_name.SetCString(deref_name_str.c_str()); + + m_deref_valobj = new ValueObjectChild( + *this, deref_compiler_type, deref_name, deref_byte_size, + deref_byte_offset, 0, 0, false, true, eAddressTypeInvalid, + language_flags); + } } } + if (!m_deref_valobj && IsSynthetic()) + m_deref_valobj = GetChildMemberWithName("$$dereference$$").get(); + if (m_deref_valobj) { error.Clear(); return m_deref_valobj->GetSP(); _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits