File tree 3 files changed +33
-0
lines changed
test/API/lang/cpp/dereferencing_references 3 files changed +33
-0
lines changed Original file line number Diff line number Diff line change @@ -2911,6 +2911,16 @@ ValueObjectSP ValueObject::AddressOf(Status &error) {
2911
2911
2912
2912
AddressType address_type = eAddressTypeInvalid;
2913
2913
const bool scalar_is_load_address = false ;
2914
+
2915
+ // For reference type we need to get the address of the object that
2916
+ // it refers to.
2917
+ ValueObjectSP deref_obj;
2918
+ if (GetCompilerType ().IsReferenceType ()) {
2919
+ deref_obj = Dereference (error);
2920
+ if (error.Fail () || !deref_obj)
2921
+ return ValueObjectSP ();
2922
+ return deref_obj->AddressOf (error);
2923
+ }
2914
2924
addr_t addr = GetAddressOf (scalar_is_load_address, &address_type);
2915
2925
error.Clear ();
2916
2926
if (addr != LLDB_INVALID_ADDRESS && address_type != eAddressTypeHost) {
Original file line number Diff line number Diff line change @@ -25,3 +25,24 @@ def test(self):
25
25
# Typedef to a reference should dereference to the underlying type.
26
26
td_val = self .expect_var_path ("td_to_ref_type" , type = "td_int_ref" )
27
27
self .assertEqual (td_val .Dereference ().GetType ().GetName (), "int" )
28
+
29
+ def test_take_address_of_reference (self ):
30
+ """Tests taking address of lvalue/rvalue references in lldb works correctly."""
31
+ self .build ()
32
+ lldbutil .run_to_source_breakpoint (
33
+ self , "// break here" , lldb .SBFileSpec ("main.cpp" )
34
+ )
35
+
36
+ plref_val_from_code = self .expect_var_path ("pl_ref" , type = "TTT *" )
37
+ plref_val_from_expr_path = self .expect_var_path ("&l_ref" , type = "TTT *" )
38
+ self .assertEqual (
39
+ plref_val_from_code .GetValueAsAddress (),
40
+ plref_val_from_expr_path .GetValueAsAddress (),
41
+ )
42
+
43
+ prref_val_from_code = self .expect_var_path ("pr_ref" , type = "TTT *" )
44
+ prref_val_from_expr_path = self .expect_var_path ("&r_ref" , type = "TTT *" )
45
+ self .assertEqual (
46
+ prref_val_from_code .GetValueAsAddress (),
47
+ prref_val_from_expr_path .GetValueAsAddress (),
48
+ )
Original file line number Diff line number Diff line change @@ -9,5 +9,7 @@ int main() {
9
9
// typedef of a reference
10
10
td_int_ref td_to_ref_type = i;
11
11
12
+ TTT *pl_ref = &l_ref;
13
+ TTT *pr_ref = &r_ref;
12
14
return l_ref; // break here
13
15
}
You can’t perform that action at this time.
0 commit comments