[Lldb-commits] [lldb] Fix pointer to reference type (PR #113596)
via lldb-commits
lldb-commits at lists.llvm.org
Thu Oct 24 10:47:06 PDT 2024
https://github.com/jeffreytan81 created https://github.com/llvm/llvm-project/pull/113596
We have got customer reporting "v &obj" and "p &obj" reporting different results.
Turns out it only happens for obj that is itself a reference type which "v &obj" reports the address of the reference itself instead of the target object the reference points to. This diverged from C++ semantics.
This PR fixes this issue by returning the address of the dereferenced object if it is reference type.
A new test is added which fails before.
>From 5e84fcf4d1e6efcba5072d4aafd1151652e85339 Mon Sep 17 00:00:00 2001
From: jeffreytan81 <jeffreytan at fb.com>
Date: Thu, 24 Oct 2024 10:42:18 -0700
Subject: [PATCH] Fix pointer to reference type
---
lldb/source/Core/ValueObject.cpp | 10 +++++++++
.../TestCPPDereferencingReferences.py | 21 +++++++++++++++++++
.../cpp/dereferencing_references/main.cpp | 2 ++
3 files changed, 33 insertions(+)
diff --git a/lldb/source/Core/ValueObject.cpp b/lldb/source/Core/ValueObject.cpp
index 5b1c171c01f2db..df0393213343fa 100644
--- a/lldb/source/Core/ValueObject.cpp
+++ b/lldb/source/Core/ValueObject.cpp
@@ -2911,6 +2911,16 @@ ValueObjectSP ValueObject::AddressOf(Status &error) {
AddressType address_type = eAddressTypeInvalid;
const bool scalar_is_load_address = false;
+
+ // For reference type we need to get the address of the object that
+ // it refers to.
+ ValueObjectSP deref_obj;
+ if (GetCompilerType().IsReferenceType()) {
+ deref_obj = Dereference(error);
+ if (error.Fail() || !deref_obj)
+ return ValueObjectSP();
+ return deref_obj->AddressOf(error);
+ }
addr_t addr = GetAddressOf(scalar_is_load_address, &address_type);
error.Clear();
if (addr != LLDB_INVALID_ADDRESS && address_type != eAddressTypeHost) {
diff --git a/lldb/test/API/lang/cpp/dereferencing_references/TestCPPDereferencingReferences.py b/lldb/test/API/lang/cpp/dereferencing_references/TestCPPDereferencingReferences.py
index 938fb1a6edf32c..1374d4e1ec67ab 100644
--- a/lldb/test/API/lang/cpp/dereferencing_references/TestCPPDereferencingReferences.py
+++ b/lldb/test/API/lang/cpp/dereferencing_references/TestCPPDereferencingReferences.py
@@ -25,3 +25,24 @@ def test(self):
# Typedef to a reference should dereference to the underlying type.
td_val = self.expect_var_path("td_to_ref_type", type="td_int_ref")
self.assertEqual(td_val.Dereference().GetType().GetName(), "int")
+
+ def test_take_address_of_reference(self):
+ """Tests taking address of lvalue/rvalue references in lldb works correctly."""
+ self.build()
+ lldbutil.run_to_source_breakpoint(
+ self, "// break here", lldb.SBFileSpec("main.cpp")
+ )
+
+ plref_val_from_code = self.expect_var_path("pl_ref", type="TTT *")
+ plref_val_from_expr_path = self.expect_var_path("&l_ref", type="TTT *")
+ self.assertEqual(
+ plref_val_from_code.GetValueAsAddress(),
+ plref_val_from_expr_path.GetValueAsAddress(),
+ )
+
+ prref_val_from_code = self.expect_var_path("pr_ref", type="TTT *")
+ prref_val_from_expr_path = self.expect_var_path("&r_ref", type="TTT *")
+ self.assertEqual(
+ prref_val_from_code.GetValueAsAddress(),
+ prref_val_from_expr_path.GetValueAsAddress(),
+ )
diff --git a/lldb/test/API/lang/cpp/dereferencing_references/main.cpp b/lldb/test/API/lang/cpp/dereferencing_references/main.cpp
index b64978a9029f81..4ddffd167ddeed 100644
--- a/lldb/test/API/lang/cpp/dereferencing_references/main.cpp
+++ b/lldb/test/API/lang/cpp/dereferencing_references/main.cpp
@@ -9,5 +9,7 @@ int main() {
// typedef of a reference
td_int_ref td_to_ref_type = i;
+ TTT *pl_ref = &l_ref;
+ TTT *pr_ref = &r_ref;
return l_ref; // break here
}
More information about the lldb-commits
mailing list