https://github.com/jeffreytan81 updated https://github.com/llvm/llvm-project/pull/113596
>From 65b0349f7b136ffef1ab75a1a47bb3a5f763cf28 Mon Sep 17 00:00:00 2001 From: jeffreytan81 <jeffrey...@fb.com> Date: Thu, 24 Oct 2024 10:42:18 -0700 Subject: [PATCH] Fix pointer to reference type --- lldb/source/Core/ValueObject.cpp | 9 ++++++++ .../TestCPPDereferencingReferences.py | 21 +++++++++++++++++++ .../cpp/dereferencing_references/main.cpp | 2 ++ 3 files changed, 32 insertions(+) diff --git a/lldb/source/Core/ValueObject.cpp b/lldb/source/Core/ValueObject.cpp index 5b1c171c01f2db..5e3839b89ce0ec 100644 --- a/lldb/source/Core/ValueObject.cpp +++ b/lldb/source/Core/ValueObject.cpp @@ -2911,6 +2911,15 @@ 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. + if (GetCompilerType().IsReferenceType()) { + ValueObjectSP 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 } _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits