diff --git a/lldb/source/Core/ValueObject.cpp b/lldb/source/Core/ValueObject.cpp index 5b1c171c01f2d..5e3839b89ce0e 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 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 }