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

Reply via email to