From 5e84fcf4d1e6efcba5072d4aafd1151652e85339 Mon Sep 17 00:00:00 2001 From: jeffreytan81 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 5b1c171c01f2d..df0393213343f 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 938fb1a6edf32..1374d4e1ec67a 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 b64978a9029f8..4ddffd167ddee 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 }