From e5afdbd7a0f79aba7e20b2cfa0564c82a81619d9 Mon Sep 17 00:00:00 2001 From: Keith Seitz Date: Sun, 19 Aug 2012 19:37:51 +0000 Subject: [PATCH] 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. --- gdb/ChangeLog | 6 + gdb/c-typeprint.c | 4 +- gdb/testsuite/ChangeLog | 6 + gdb/testsuite/gdb.dwarf2/dw2-anon-mptr.S | 377 +++++++++++++++++++++ gdb/testsuite/gdb.dwarf2/dw2-anon-mptr.exp | 44 +++ 5 files changed, 435 insertions(+), 2 deletions(-) create mode 100644 gdb/testsuite/gdb.dwarf2/dw2-anon-mptr.S create mode 100644 gdb/testsuite/gdb.dwarf2/dw2-anon-mptr.exp diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 24b2a25499..33845f40ff 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2012-08-19 Keith Seitz + + 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 * 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 29b27e9a88..c2a775ac73 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 1cebedf906..11e8a0afac 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +012-08-19 Keith Seitz + + PR c++/14365 + * gdb.dwarf2/dw2-anon-mptr.exp: New file. + * gdb.dwarf2/dw2-anon-mptr.S: New file. + 2012-08-18 Jan Kratochvil * 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 0000000000..8c32e16481 --- /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 . */ + +/* 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 0000000000..e387107cbf --- /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 . + +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\]*}"