Skip to content

Commit

Permalink
Fix pointer to reference type
Browse files Browse the repository at this point in the history
  • Loading branch information
jeffreytan81 committed Oct 24, 2024
1 parent 61a4678 commit 5e84fcf
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 0 deletions.
10 changes: 10 additions & 0 deletions lldb/source/Core/ValueObject.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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(),
)
2 changes: 2 additions & 0 deletions lldb/test/API/lang/cpp/dereferencing_references/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

0 comments on commit 5e84fcf

Please sign in to comment.