Skip to content

Commit c8a0513

Browse files
authored
[lldb] Restore ObjC incomplete type dereferencing fix (#139567)
Attempt an ObjC incomplete type fix even if `GetDereferencedType` returns an error.
1 parent d6c3712 commit c8a0513

File tree

1 file changed

+35
-34
lines changed

1 file changed

+35
-34
lines changed

lldb/source/ValueObject/ValueObject.cpp

Lines changed: 35 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2810,46 +2810,47 @@ ValueObjectSP ValueObject::Dereference(Status &error) {
28102810
std::string deref_error;
28112811
if (deref_compiler_type_or_err) {
28122812
deref_compiler_type = *deref_compiler_type_or_err;
2813-
if (deref_compiler_type && deref_byte_size) {
2814-
ConstString deref_name;
2815-
if (!deref_name_str.empty())
2816-
deref_name.SetCString(deref_name_str.c_str());
2817-
2818-
m_deref_valobj =
2819-
new ValueObjectChild(*this, deref_compiler_type, deref_name,
2820-
deref_byte_size, deref_byte_offset, 0, 0, false,
2821-
true, eAddressTypeInvalid, language_flags);
2822-
}
2823-
2824-
// In case of incomplete deref compiler type, use the pointee type and try
2825-
// to recreate a new ValueObjectChild using it.
2826-
if (!m_deref_valobj) {
2827-
// FIXME(#59012): C++ stdlib formatters break with incomplete types (e.g.
2828-
// `std::vector<int> &`). Remove ObjC restriction once that's resolved.
2829-
if (Language::LanguageIsObjC(GetPreferredDisplayLanguage()) &&
2830-
HasSyntheticValue()) {
2831-
deref_compiler_type = compiler_type.GetPointeeType();
2832-
2833-
if (deref_compiler_type) {
2834-
ConstString deref_name;
2835-
if (!deref_name_str.empty())
2836-
deref_name.SetCString(deref_name_str.c_str());
2837-
2838-
m_deref_valobj = new ValueObjectChild(
2839-
*this, deref_compiler_type, deref_name, deref_byte_size,
2840-
deref_byte_offset, 0, 0, false, true, eAddressTypeInvalid,
2841-
language_flags);
2842-
}
2843-
}
2844-
}
28452813
} else {
28462814
deref_error = llvm::toString(deref_compiler_type_or_err.takeError());
28472815
LLDB_LOG(GetLog(LLDBLog::Types), "could not find child: {0}", deref_error);
2848-
if (IsSynthetic()) {
2849-
m_deref_valobj = GetChildMemberWithName("$$dereference$$").get();
2816+
}
2817+
2818+
if (deref_compiler_type && deref_byte_size) {
2819+
ConstString deref_name;
2820+
if (!deref_name_str.empty())
2821+
deref_name.SetCString(deref_name_str.c_str());
2822+
2823+
m_deref_valobj =
2824+
new ValueObjectChild(*this, deref_compiler_type, deref_name,
2825+
deref_byte_size, deref_byte_offset, 0, 0, false,
2826+
true, eAddressTypeInvalid, language_flags);
2827+
}
2828+
2829+
// In case of incomplete deref compiler type, use the pointee type and try
2830+
// to recreate a new ValueObjectChild using it.
2831+
if (!m_deref_valobj) {
2832+
// FIXME(#59012): C++ stdlib formatters break with incomplete types (e.g.
2833+
// `std::vector<int> &`). Remove ObjC restriction once that's resolved.
2834+
if (Language::LanguageIsObjC(GetPreferredDisplayLanguage()) &&
2835+
HasSyntheticValue()) {
2836+
deref_compiler_type = compiler_type.GetPointeeType();
2837+
2838+
if (deref_compiler_type) {
2839+
ConstString deref_name;
2840+
if (!deref_name_str.empty())
2841+
deref_name.SetCString(deref_name_str.c_str());
2842+
2843+
m_deref_valobj = new ValueObjectChild(
2844+
*this, deref_compiler_type, deref_name, deref_byte_size,
2845+
deref_byte_offset, 0, 0, false, true, eAddressTypeInvalid,
2846+
language_flags);
2847+
}
28502848
}
28512849
}
28522850

2851+
if (!m_deref_valobj && IsSynthetic())
2852+
m_deref_valobj = GetChildMemberWithName("$$dereference$$").get();
2853+
28532854
if (m_deref_valobj) {
28542855
error.Clear();
28552856
return m_deref_valobj->GetSP();

0 commit comments

Comments
 (0)