PR c++/14365
authorKeith Seitz <keiths@redhat.com>
Sun, 19 Aug 2012 19:37:51 +0000 (19:37 +0000)
committerKeith Seitz <keiths@redhat.com>
Sun, 19 Aug 2012 19:37:51 +0000 (19:37 +0000)
* 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.

gdb/ChangeLog
gdb/c-typeprint.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.dwarf2/dw2-anon-mptr.S [new file with mode: 0644]
gdb/testsuite/gdb.dwarf2/dw2-anon-mptr.exp [new file with mode: 0644]

index 24b2a25..33845f4 100644 (file)
@@ -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.
index 29b27e9..c2a775a 100644 (file)
@@ -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;
 
index 1cebedf..11e8a0a 100644 (file)
@@ -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 (file)
index 0000000..8c32e16
--- /dev/null
@@ -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 (file)
index 0000000..e387107
--- /dev/null
@@ -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\]*}"