[Lldb-commits] [lldb] [lldb] Restore ObjC incomplete type dereferencing fix (PR #139567)
via lldb-commits
lldb-commits at lists.llvm.org
Mon May 12 08:51:47 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-lldb
Author: Ilia Kuklin (kuilpd)
<details>
<summary>Changes</summary>
Attempt an ObjC incomplete type fix even if `GetDereferencedType` returns an error.
---
Full diff: https://github.com/llvm/llvm-project/pull/139567.diff
1 Files Affected:
- (modified) lldb/source/ValueObject/ValueObject.cpp (+35-34)
``````````diff
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();
``````````
</details>
https://github.com/llvm/llvm-project/pull/139567
More information about the lldb-commits
mailing list