summaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorKeith Seitz <keiths@redhat.com>2012-08-19 19:37:49 +0000
committerKeith Seitz <keiths@redhat.com>2012-08-19 19:37:49 +0000
commit66ac5d0d1d3d21be2443a6b161af69e76971b926 (patch)
tree9c179485e7c16300764ca7326464685035b6e006 /gdb
parent79853a679f4784db99d3528fbf98886da4073b86 (diff)
downloadgdb-66ac5d0d1d3d21be2443a6b161af69e76971b926.tar.gz
PR c++/14365
* c-typeprint.c (c_type_print_varspec_prefix): Pass -1 for SHOW to c_type_print_base for METHODPTR and MEMBERPTR. * gdb.dwarf2/dw2-anon-mptr.exp: New file. * gdb.dwarf2/dw2-anon-mptr.S: New file.
Diffstat (limited to 'gdb')
-rw-r--r--gdb/ChangeLog6
-rw-r--r--gdb/c-typeprint.c4
-rw-r--r--gdb/testsuite/ChangeLog6
-rw-r--r--gdb/testsuite/gdb.dwarf2/dw2-anon-mptr.S377
-rw-r--r--gdb/testsuite/gdb.dwarf2/dw2-anon-mptr.exp44
5 files changed, 435 insertions, 2 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 24b2a25499c..33845f40ff1 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,9 @@
+2012-08-19 Keith Seitz <keiths@redhat.com>
+
+ PR c++/14365
+ * c-typeprint.c (c_type_print_varspec_prefix): Pass
+ -1 for SHOW to c_type_print_base for METHODPTR and MEMBERPTR.
+
2012-08-18 Eli Zaretskii <eliz@gnu.org>
* Makefile.in (HFILES_NO_SRCDIR): Fix a typo: golang.h -> go-lang.h.
diff --git a/gdb/c-typeprint.c b/gdb/c-typeprint.c
index 29b27e9a880..c2a775ac73f 100644
--- a/gdb/c-typeprint.c
+++ b/gdb/c-typeprint.c
@@ -265,7 +265,7 @@ c_type_print_varspec_prefix (struct type *type,
fputs_filtered (name, stream);
else
c_type_print_base (TYPE_DOMAIN_TYPE (type),
- stream, 0, passed_a_ptr);
+ stream, -1, passed_a_ptr);
fprintf_filtered (stream, "::*");
break;
@@ -278,7 +278,7 @@ c_type_print_varspec_prefix (struct type *type,
fputs_filtered (name, stream);
else
c_type_print_base (TYPE_DOMAIN_TYPE (type),
- stream, 0, passed_a_ptr);
+ stream, -1, passed_a_ptr);
fprintf_filtered (stream, "::*");
break;
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 1cebedf9067..11e8a0aface 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+012-08-19 Keith Seitz <keiths@redhat.com>
+
+ PR c++/14365
+ * gdb.dwarf2/dw2-anon-mptr.exp: New file.
+ * gdb.dwarf2/dw2-anon-mptr.S: New file.
+
2012-08-18 Jan Kratochvil <jan.kratochvil@redhat.com>
* gdb.base/solib-corrupted.exp (make solibs looping): Replace
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-anon-mptr.S b/gdb/testsuite/gdb.dwarf2/dw2-anon-mptr.S
new file mode 100644
index 00000000000..8c32e164810
--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/dw2-anon-mptr.S
@@ -0,0 +1,377 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright 2012 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* This test triggers a crash when a physname for a subprogram has
+ a method pointer to an anonymous struct as a parameter. This
+ situation is possible with templates and lambda expressions,
+ reproduced here by the following source code:
+
+ class a
+ {
+ public:
+ int doit (void) { return 0; }
+ };
+
+ class crash
+ {
+ public:
+ crash (int (a::*mp) (void)) {}
+ };
+
+ In order to avoid lambdas, the resulting output has been edited to
+ remove the DW_AT_name attribute from the DIEs describing "class a." */
+
+#define OFFSET(LBL) .Ldie_ ## LBL - .Lcu1_begin
+
+ .section .debug_info
+.Lcu1_begin:
+ .4byte .Lcu1_end - .Lcu1_start /* Length of Compilation Unit Info */
+.Lcu1_start:
+ .2byte 0x3 /* DWARF version number */
+ .4byte .Labbrev1_begin /* Offset Into Abbrev. Section */
+ .byte 0x4 /* Pointer Size (in bytes) */
+
+.Ldie_b:
+ .uleb128 0x1 /* (DIE (0xb) DW_TAG_compile_unit) */
+ .ascii "GNU C++ 4.6.3\0" /* DW_AT_producer */
+ .byte 0x4 /* DW_AT_language */
+ .ascii "anon-member-ptr.cc\0" /* DW_AT_name */
+ .4byte .Ldebug_line0 /* DW_AT_stmt_list */
+
+.Ldie_31:
+ .uleb128 0x2 /* (DIE (0x31) DW_TAG_class_type */
+#if 0
+ /* This is the "fudging" part... */
+ .ascii "a\0" /* DW_AT_name */
+#endif
+ .byte 0x1 /* DW_AT_byte_size */
+
+.Ldie_59:
+ .uleb128 0x4 /* (DIE (0x59) DW_TAG_base_type */
+ .byte 0x4 /* DW_AT_byte_size */
+ .byte 0x5 /* DW_AT_encoding */
+ .ascii "int\0" /* DW_AT_name */
+
+.Ldie_60:
+ .uleb128 0x5 /* (DIE (0x60) DW_TAG_pointer_type) */
+ .byte 0x4 /* DW_AT_byte_size */
+ .4byte OFFSET (31) /* DW_AT_type */
+
+.Ldie_66:
+ .uleb128 0x6 /* (DIE (0x66) DW_TAG_class_type) */
+ .ascii "crash\0" /* DW_AT_name */
+ .byte 0x1 /* DW_AT_byte_size */
+ .4byte OFFSET (8d) /* DW_AT_sibling */
+
+.Ldie_72:
+ .uleb128 0x7 /* (DIE (0x72) DW_TAG_subprogram) */
+ .byte 0x1 /* DW_AT_external */
+ .ascii "crash\0" /* DW_AT_name */
+ .byte 0x1 /* DW_AT_accessibility */
+ .byte 0x1 /* DW_AT_declaration */
+ .4byte OFFSET (80) /* DW_AT_object_pointer */
+
+.Ldie_80:
+ .uleb128 0x3 /* (DIE (0x80) DW_TAG_formal_parameter */
+ .4byte OFFSET (8d) /* DW_AT_type */
+ .byte 0x1 /* DW_AT_artificial */
+
+.Ldie_86:
+ .uleb128 0x3 /* (DIE (0x86) DW_TAG_formal_parameter */
+ .4byte OFFSET (93) /* DW_AT_type */
+ .byte 0x0 /* DW_AT_artificial */
+ .byte 0 /* end of children of DIE 0x72 */
+ .byte 0 /* end of children of DIE 0x66 */
+
+.Ldie_8d:
+ .uleb128 0x5 /* (DIE (0x8d) DW_TAG_pointer_type */
+ .byte 0x4 /* DW_AT_size */
+ .4byte OFFSET (66) /* DW_AT_type */
+
+.Ldie_93:
+ .uleb128 0x8 /* (DIE (0x93) DW_TAG_structure_type */
+ .byte 0x10 /* DW_AT_byte_size */
+ .4byte OFFSET (b4) /* DW_AT_sibling */
+
+.Ldie_9b:
+ .uleb128 0x9 /* (DIE (0x9b) DW_TAG_member */
+ .ascii "__pfn\0" /* DW_AT_name */
+ .4byte OFFSET (c8) /* DW_AT_type */
+ .byte 0 /* DW_AT_data_member_location */
+
+.Ldie_a7:
+ .uleb128 0x9 /* (DIE (0xa7) DW_TAG_member */
+ .ascii "__delta\0" /* DW_AT_name */
+ .4byte OFFSET (ce) /* DW_AT_type */
+ .byte 0x8 /* DW_AT_data_member_location */
+ .byte 0 /* end of children of DIE 0x93 */
+
+.Ldie_b4:
+ .uleb128 0xa /* (DIE (0xb4) DW_TAG_subroutine_type) */
+ .4byte OFFSET (59) /* DW_AT_type */
+ .4byte OFFSET (c1) /* DW_AT_object_pointer */
+ .4byte OFFSET (c8) /* DW_AT_sibling */
+
+.Ldie_c1:
+ .uleb128 0x3 /* (DIE (0xc1) DW_TAG_formal_parameter) */
+ .4byte OFFSET (60) /* DW_AT_type */
+ .byte 0x1 /* DW_AT_artificial */
+ .byte 0 /* end of children of DIE 0xb4 */
+
+.Ldie_c8:
+ .uleb128 0x5 /* (DIE (0xc8) DW_TAG_pointer_type) */
+ .byte 0x4 /* DW_AT_byte_size */
+ .4byte OFFSET (b4) /* DW_AT_type */
+
+.Ldie_ce:
+ .uleb128 0x4 /* (DIE (0xce) DW_TAG_base_type) */
+ .byte 0x8 /* DW_AT_byte_size */
+ .byte 0x5 /* DW_AT_encoding */
+ .ascii "long int\0" /* DW_AT_name */
+
+.Ldie_107:
+ .uleb128 0xc /* (DIE (0x107) DW_TAG_subprogram) */
+ .4byte OFFSET (72) /* DW_AT_specification */
+ .byte 0x2 /* DW_AT_inline */
+ .4byte OFFSET (115) /* DW_AT_object_pointer */
+ .4byte OFFSET (12a) /* DW_AT_sibling */
+
+.Ldie_115:
+ .uleb128 0xd /* (DIE (0x115) DW_TAG_formal_parameter) */
+ .ascii "this\0" /* DW_AT_name */
+ .4byte OFFSET (12a) /* DW_AT_type */
+ .byte 0x1 /* DW_AT_artificial */
+
+.Ldie_11f:
+ .uleb128 0xd /* (DIE (0x11f) DW_TAG_formal_parameter) */
+ .ascii "mp\0" /* DW_AT_name */
+ .4byte OFFSET (93) /* DW_AT_type */
+ .byte 0x0 /* DW_AT_artificial */
+ .byte 0 /* end of children of DIE 0x107 */
+
+.Ldie_12a:
+ .uleb128 0xb /* (DIE (0x12a) DW_TAG_const_type) */
+ .4byte OFFSET (8d) /* DW_AT_type */
+
+.Ldie_12f:
+ .uleb128 0xe /* (DIE (0x12f) DW_TAG_subprogram) */
+ .4byte OFFSET (107) /* DW_AT_abstract_origin */
+ .4byte 0x20 /* DW_AT_low_pc */
+ .4byte 0x2c /* DW_AT_high_pc */
+ .4byte OFFSET (14e) /* DW_AT_object_pointer */
+
+.Ldie_14e:
+ .uleb128 0xf /* (DIE (0x14e) DW_TAG_formal_parameter) */
+ .4byte OFFSET (115) /* DW_AT_abstract_origin */
+ .byte 0x2 /* DW_AT_location */
+ .byte 0x91
+ .sleb128 -24
+
+.Ldie_156:
+ .uleb128 0xf /* (DIE (0x156) DW_TAG_formal_parameter) */
+ .4byte OFFSET (11f) /* DW_at_abstract_origin */
+ .byte 0x2 /* DW_AT_location */
+ .byte 0x91
+ .sleb128 -40
+ .byte 0 /* end of children of DIE 0x12f */
+ .byte 0 /* end of children of DIE 0x5b */
+.Lcu1_end:
+
+/* Abbrev table */
+ .section .debug_abbrev
+ .uleb128 0x1 /* (abbrev code) */
+ .uleb128 0x11 /* (TAG: DW_TAG_compile_unit) */
+ .byte 0x1 /* DW_children_yes */
+ .uleb128 0x25 /* (DW_AT_producer) */
+ .uleb128 0x8 /* (DW_FORM_string) */
+ .uleb128 0x13 /* (DW_AT_language) */
+ .uleb128 0xb /* (DW_FORM_data1) */
+ .uleb128 0x3 /* (DW_AT_name) */
+ .uleb128 0x8 /* (DW_FORM_string) */
+ .uleb128 0x10 /* (DW_AT_stmt_list) */
+ .uleb128 0x6 /* (DW_FORM_data4) */
+ .byte 0
+ .byte 0
+
+ .uleb128 0x2 /* (abbrev code) */
+ .uleb128 0x2 /* (TAG: DW_TAG_class_type) */
+ .byte 0x0 /* DW_children_no */
+#if 0
+ /* This is the "fudging" part... */
+ .uleb128 0x3 /* (DW_AT_name) */
+ .uleb128 0x8 /* (DW_FORM_string) */
+#endif
+ .uleb128 0xb /* (DW_AT_byte_size) */
+ .uleb128 0xb /* (DW_FORM_data1) */
+ .byte 0
+ .byte 0
+
+ .uleb128 0x3 /* (abbrev code) */
+ .uleb128 0x5 /* (TAG: DW_TAG_formal_parameter) */
+ .byte 0 /* DW_children_no */
+ .uleb128 0x49 /* (DW_AT_type) */
+ .uleb128 0x13 /* (DW_FORM_ref4) */
+ .uleb128 0x34 /* (DW_AT_artificial) */
+ .uleb128 0xc /* (DW_FORM_flag) */
+ .byte 0
+ .byte 0
+
+ .uleb128 0x4 /* (abbrev code) */
+ .uleb128 0x24 /* (TAG: DW_TAG_base_type) */
+ .byte 0 /* DW_children_no */
+ .uleb128 0xb /* (DW_AT_byte_size) */
+ .uleb128 0xb /* (DW_FORM_data1) */
+ .uleb128 0x3e /* (DW_AT_encoding) */
+ .uleb128 0xb /* (DW_FORM_data1) */
+ .uleb128 0x3 /* (DW_AT_name) */
+ .uleb128 0x8 /* (DW_FORM_string) */
+ .byte 0
+ .byte 0
+
+ .uleb128 0x5 /* (abbrev code) */
+ .uleb128 0xf /* (TAG: DW_TAG_pointer_type) */
+ .byte 0 /* DW_children_no */
+ .uleb128 0xb /* (DW_AT_byte_size) */
+ .uleb128 0xb /* (DW_FORM_data1) */
+ .uleb128 0x49 /* (DW_AT_type) */
+ .uleb128 0x13 /* (DW_FORM_ref4) */
+ .byte 0
+ .byte 0
+
+ .uleb128 0x6 /* (abbrev code) */
+ .uleb128 0x2 /* (TAG: DW_TAG_class_type) */
+ .byte 0x1 /* DW_children_yes */
+ .uleb128 0x3 /* (DW_AT_name) */
+ .uleb128 0x8 /* (DW_FORM_string) */
+ .uleb128 0xb /* (DW_AT_byte_size) */
+ .uleb128 0xb /* (DW_FORM_data1) */
+ .uleb128 0x1 /* (DW_AT_sibling) */
+ .uleb128 0x13
+ .byte 0
+ .byte 0
+
+ .uleb128 0x7 /* (abbrev code) */
+ .uleb128 0x2e /* (TAG: DW_TAG_subprogram) */
+ .byte 0x1 /* DW_children_yes */
+ .uleb128 0x3f /* (DW_AT_external) */
+ .uleb128 0xc /* (DW_FORM_flag) */
+ .uleb128 0x3 /* (DW_AT_name) */
+ .uleb128 0x8 /* (DW_FORM_string) */
+ .uleb128 0x32 /* (DW_AT_accessibility) */
+ .uleb128 0xb /* (DW_FORM_data1) */
+ .uleb128 0x3c /* (DW_AT_declaration) */
+ .uleb128 0xc /* (DW_FORM_flag) */
+ .uleb128 0x64 /* (DW_AT_object_pointer) */
+ .uleb128 0x13 /* (DW_FORM_ref4) */
+ .byte 0
+ .byte 0
+
+ .uleb128 0x8 /* (abbrev code) */
+ .uleb128 0x13 /* (TAG: DW_TAG_structure_type) */
+ .byte 0x1 /* DW_children_yes */
+ .uleb128 0xb /* (DW_AT_byte_size) */
+ .uleb128 0xb /* (DW_FORM_data1) */
+ .uleb128 0x1 /* (DW_AT_sibling) */
+ .uleb128 0x13 /* (DW_FORM_ref4) */
+ .byte 0
+ .byte 0
+
+ .uleb128 0x9 /* (abbrev code) */
+ .uleb128 0xd /* (TAG: DW_TAG_member) */
+ .byte 0 /* DW_children_no */
+ .uleb128 0x3 /* (DW_AT_name) */
+ .uleb128 0x8 /* (DW_FORM_string) */
+ .uleb128 0x49 /* (DW_AT_type) */
+ .uleb128 0x13 /* (DW_FORM_ref4) */
+ .uleb128 0x38 /* (DW_AT_data_member_location) */
+ .uleb128 0xb /* (DW_FORM_data1) */
+ .byte 0
+ .byte 0
+
+ .uleb128 0xa /* (abbrev code) */
+ .uleb128 0x15 /* (TAG: DW_TAG_subroutine_type) */
+ .byte 0x1 /* DW_children_yes */
+ .uleb128 0x49 /* (DW_AT_type) */
+ .uleb128 0x13 /* (DW_FORM_ref4) */
+ .uleb128 0x64 /* (DW_AT_object_pointer) */
+ .uleb128 0x13 /* (DW_FORM_ref4) */
+ .uleb128 0x1 /* (DW_AT_sibling) */
+ .uleb128 0x13 /* (DW_FORM_ref4) */
+ .byte 0
+ .byte 0
+
+ .uleb128 0xb /* (abbrev code) */
+ .uleb128 0x26 /* (TAG: DW_TAG_const_type) */
+ .byte 0 /* DW_children_no */
+ .uleb128 0x49 /* (DW_AT_type) */
+ .uleb128 0x13 /* (DW_FORM_ref4) */
+ .byte 0
+ .byte 0
+
+ .uleb128 0xc /* (abbrev code) */
+ .uleb128 0x2e /* (TAG: DW_TAG_subprogram) */
+ .byte 0x1 /* DW_children_yes */
+ .uleb128 0x47 /* (DW_AT_specification) */
+ .uleb128 0x13 /* (DW_FORM_ref4) */
+ .uleb128 0x20 /* (DW_AT_inline) */
+ .uleb128 0xb /* (DW_FORM_data1) */
+ .uleb128 0x64 /* (DW_AT_object_pointer) */
+ .uleb128 0x13 /* (DW_FORM_ref4) */
+ .uleb128 0x1 /* (DW_AT_sibling) */
+ .uleb128 0x13 /* (DW_FORM_ref4) */
+ .byte 0
+ .byte 0
+
+ .uleb128 0xd /* (abbrev code) */
+ .uleb128 0x5 /* (TAG: DW_TAG_formal_parameter) */
+ .byte 0 /* DW_children_no */
+ .uleb128 0x3 /* (DW_AT_name) */
+ .uleb128 0x8 /* (DW_FORM_string) */
+ .uleb128 0x49 /* (DW_AT_type) */
+ .uleb128 0x13 /* (DW_FORM_ref4) */
+ .uleb128 0x34 /* (DW_AT_artificial) */
+ .uleb128 0xc /* (DW_FORM_flag) */
+ .byte 0
+ .byte 0
+
+ .uleb128 0xe /* (abbrev code) */
+ .uleb128 0x2e /* (TAG: DW_TAG_subprogram) */
+ .byte 0x1 /* DW_children_yes */
+ .uleb128 0x31 /* (DW_AT_abstract_origin) */
+ .uleb128 0x13 /* (DW_FORM_ref4) */
+ .uleb128 0x11 /* (DW_AT_low_pc) */
+ .uleb128 0x13 /* (DW_FORM_ref4) */
+ .uleb128 0x12 /* (DW_AT_high_pc) */
+ .uleb128 0x13 /* (DW_FORM_ref4) */
+ .uleb128 0x64 /* (DW_AT_object_pointer) */
+ .uleb128 0x13 /* (DW_FORM_ref4) */
+ .byte 0
+ .byte 0
+
+ .uleb128 0xf /* (abbrev code) */
+ .uleb128 0x5 /* (TAG: DW_TAG_formal_parameter) */
+ .byte 0 /* DW_children_no */
+ .uleb128 0x31 /* (DW_AT_abstract_origin) */
+ .uleb128 0x13 /* (DW_FORM_ref4) */
+ .uleb128 0x2 /* (DW_AT_location) */
+ .uleb128 0xa /* (DW_FORM_block) */
+ .byte 0
+ .byte 0
+ .byte 0
+
+ .section .debug_line
+.Ldebug_line0:
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-anon-mptr.exp b/gdb/testsuite/gdb.dwarf2/dw2-anon-mptr.exp
new file mode 100644
index 00000000000..e387107cbf8
--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/dw2-anon-mptr.exp
@@ -0,0 +1,44 @@
+# Copyright 2012 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+load_lib dwarf.exp
+
+# This test can only be run on targets which support DWARF-2 and use gas.
+if {![dwarf2_support]} {
+ return 0
+}
+
+if {[skip_cplus_tests]} { continue }
+
+standard_testfile .S
+
+if {[gdb_compile [file join $srcdir $subdir $srcfile] $binfile \
+ object {debug}] != "" } {
+ untested ${testfile}.exp
+ return -1
+}
+
+gdb_exit
+gdb_start
+gdb_reinitialize_dir [file join $srcdir $subdir]
+
+# Be sure to set cp-abi before $binfile gets loaded
+gdb_test "set cp-abi gnu-v3"
+gdb_test "show cp-abi" {The currently selected C\+\+ ABI is "gnu-v3".*}
+
+gdb_load $binfile
+
+gdb_test "ptype crash" \
+ "type = class crash {\[\r\n \t\]*public:\[\r\n \t\]*crash\\(int \\(class {\\.\\.\\.}::\\*\\)\\(class {\\.\\.\\.} \\* const\\)\\);\[\r\n \t\]*}"