From: Tom Tromey Date: Wed, 22 May 2013 20:51:49 +0000 (+0000) Subject: PR c++/15401: X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=5f2e6b00f863fc8f334d2506b96b055ef70394ed;p=binutils-gdb.git PR c++/15401: * c-valprint.c (c_value_print): Use value_addr for references. Convert back to reference type with value_ref. gdb/testsuite * gdb.cp/class2.cc (main): New local 'aref'. * gdb.cp/class2.exp: Check printing of 'aref'. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index bc787a734c9..3b2551bc6c6 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2013-05-22 Tom Tromey + + PR c++/15401: + * c-valprint.c (c_value_print): Use value_addr for + references. Convert back to reference type with value_ref. + 2013-05-22 Eli Zaretskii * windows-nat.c (handle_unload_dll): Don't call solib_add for the diff --git a/gdb/c-valprint.c b/gdb/c-valprint.c index 646aed72f75..ce2c29d1e4b 100644 --- a/gdb/c-valprint.c +++ b/gdb/c-valprint.c @@ -497,18 +497,11 @@ c_value_print (struct value *val, struct ui_file *stream, else if (options->objectprint && (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_CLASS)) { + int is_ref = TYPE_CODE (type) == TYPE_CODE_REF; + + if (is_ref) + val = value_addr (val); - if (TYPE_CODE(type) == TYPE_CODE_REF) - { - /* Copy value, change to pointer, so we don't get an - error about a non-pointer type in - value_rtti_target_type. */ - struct value *temparg; - temparg=value_copy(val); - deprecated_set_value_type - (temparg, lookup_pointer_type (TYPE_TARGET_TYPE (type))); - val = temparg; - } /* Pointer to class, check real type of object. */ fprintf_filtered (stream, "("); @@ -522,7 +515,14 @@ c_value_print (struct value *val, struct ui_file *stream, type = real_type; /* Need to adjust pointer value. */ - val = value_from_pointer (type, value_as_address (val) - top); + val = value_from_pointer (real_type, + value_as_address (val) - top); + + if (is_ref) + { + val = value_ref (value_ind (val)); + type = value_type (val); + } /* Note: When we look up RTTI entries, we don't get any information on const or volatile diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 300eb75a1d4..7429c359cef 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-05-22 Tom Tromey + + * gdb.cp/class2.cc (main): New local 'aref'. + * gdb.cp/class2.exp: Check printing of 'aref'. + 2013-05-22 Doug Evans * gdb.threads/wp-replication.c (main): Insert some code at the start diff --git a/gdb/testsuite/gdb.cp/class2.cc b/gdb/testsuite/gdb.cp/class2.cc index 0c9d9df35d4..97c44de53ff 100644 --- a/gdb/testsuite/gdb.cp/class2.cc +++ b/gdb/testsuite/gdb.cp/class2.cc @@ -67,6 +67,7 @@ int main (void) B beta, *bbp; C gamma; empty e; + A &aref (alpha); alpha.a1 = 100; beta.a1 = 200; beta.b1 = 201; beta.b2 = 202; diff --git a/gdb/testsuite/gdb.cp/class2.exp b/gdb/testsuite/gdb.cp/class2.exp index 824f56e8dd9..00b632208e5 100644 --- a/gdb/testsuite/gdb.cp/class2.exp +++ b/gdb/testsuite/gdb.cp/class2.exp @@ -110,3 +110,7 @@ gdb_test_no_output "set print object on" gdb_test "p acp" "= \\(C \\*\\) ${hex}" gdb_test "p acp->c1" "\\(A \\*\\) 0x0" gdb_test "p acp->c2" "\\(A \\*\\) ${hex}f" + +# Regression test for PR c++/15401. +# Check that the type printed is a reference. +gdb_test "p aref" " = \\(A \\&\\) .*"