diff options
author | Tom Tromey <tromey@redhat.com> | 2013-05-22 20:51:49 +0000 |
---|---|---|
committer | Tom Tromey <tromey@redhat.com> | 2013-05-22 20:51:49 +0000 |
commit | 5f2e6b00f863fc8f334d2506b96b055ef70394ed (patch) | |
tree | de025e8ae9b9dc5499d9c750267e9609d6ab2d43 | |
parent | c77c0862b26d536f91187c34c510cee96bef1f7a (diff) | |
download | gdb-5f2e6b00f863fc8f334d2506b96b055ef70394ed.zip gdb-5f2e6b00f863fc8f334d2506b96b055ef70394ed.tar.gz gdb-5f2e6b00f863fc8f334d2506b96b055ef70394ed.tar.bz2 |
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'.
-rw-r--r-- | gdb/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/c-valprint.c | 24 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/testsuite/gdb.cp/class2.cc | 1 | ||||
-rw-r--r-- | gdb/testsuite/gdb.cp/class2.exp | 4 |
5 files changed, 28 insertions, 12 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index bc787a7..3b2551b 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2013-05-22 Tom Tromey <tromey@redhat.com> + + 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 <eliz@gnu.org> * 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 646aed7..ce2c29d 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 300eb75..7429c35 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-05-22 Tom Tromey <tromey@redhat.com> + + * gdb.cp/class2.cc (main): New local 'aref'. + * gdb.cp/class2.exp: Check printing of 'aref'. + 2013-05-22 Doug Evans <dje@google.com> * 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 0c9d9df..97c44de 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 824f56e..00b6322 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 \\&\\) .*" |