From bc9a5551cacf43d273e80c80d9facb718d6af4d4 Mon Sep 17 00:00:00 2001 From: Jan Kratochvil Date: Sun, 13 Feb 2011 09:15:54 +0000 Subject: [PATCH] gdb/ Fix const/volatile qualifiers of C++ types, PR c++/12328. * c-typeprint.c (c_type_print_args): Update the function comment. New variable param_type, initialize it. Remove const/volatile qualifiers for language_cplus and !show_artificial. Use param_type. gdb/testsuite/ Fix const/volatile qualifiers of C++ types, PR c++/12328. * gdb.cp/overload-const.exp: New file. * gdb.cp/overload-const.cc: New file. --- gdb/ChangeLog | 7 +++++++ gdb/c-typeprint.c | 31 ++++++++++++++++++++++++------- gdb/testsuite/ChangeLog | 6 ++++++ gdb/testsuite/gdb.cp/overload-const.cc | 28 ++++++++++++++++++++++++++++ gdb/testsuite/gdb.cp/overload-const.exp | 29 +++++++++++++++++++++++++++++ 5 files changed, 94 insertions(+), 7 deletions(-) create mode 100644 gdb/testsuite/gdb.cp/overload-const.cc create mode 100644 gdb/testsuite/gdb.cp/overload-const.exp diff --git a/gdb/ChangeLog b/gdb/ChangeLog index cd63152..37423ce 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,12 @@ 2011-02-13 Jan Kratochvil + Fix const/volatile qualifiers of C++ types, PR c++/12328. + * c-typeprint.c (c_type_print_args): Update the function comment. New + variable param_type, initialize it. Remove const/volatile qualifiers + for language_cplus and !show_artificial. Use param_type. + +2011-02-13 Jan Kratochvil + * symtab.c (find_pc_sect_line): New variable objfile, initialize it from S. Iterate S using ALL_OBJFILE_SYMTABS. Verify BV for each S. * symtab.h (struct symtab) : Comment extension. diff --git a/gdb/c-typeprint.c b/gdb/c-typeprint.c index 9909e13..c70fa4b 100644 --- a/gdb/c-typeprint.c +++ b/gdb/c-typeprint.c @@ -388,9 +388,12 @@ c_type_print_modifier (struct type *type, struct ui_file *stream, /* Print out the arguments of TYPE, which should have TYPE_CODE_METHOD or TYPE_CODE_FUNC, to STREAM. Artificial arguments, such as "this" in non-static methods, are displayed if SHOW_ARTIFICIAL is - non-zero. LANGUAGE is the language in which TYPE was defined. - This is a necessary evil since this code is used by the C, C++, and - Java backends. */ + non-zero. If SHOW_ARTIFICIAL is zero and LANGUAGE is language_cplus + the topmost parameter types get removed their possible const and volatile + qualifiers to match demangled linkage name parameters part of such function + type. LANGUAGE is the language in which TYPE was defined. This is + a necessary evil since this code is used by the C, C++, and Java backends. + */ void c_type_print_args (struct type *type, struct ui_file *stream, @@ -406,6 +409,8 @@ c_type_print_args (struct type *type, struct ui_file *stream, for (i = 0; i < TYPE_NFIELDS (type); i++) { + struct type *param_type; + if (TYPE_FIELD_ARTIFICIAL (type, i) && !show_artificial) continue; @@ -415,12 +420,24 @@ c_type_print_args (struct type *type, struct ui_file *stream, wrap_here (" "); } + param_type = TYPE_FIELD_TYPE (type, i); + + if (language == language_cplus && !show_artificial) + { + /* C++ standard, 13.1 Overloadable declarations, point 3, item: + - Parameter declarations that differ only in the presence or + absence of const and/or volatile are equivalent. + + And the const/volatile qualifiers are not present in the mangled + names as produced by GCC. */ + + param_type = make_cv_type (0, 0, param_type, NULL); + } + if (language == language_java) - java_print_type (TYPE_FIELD_TYPE (type, i), - "", stream, -1, 0); + java_print_type (param_type, "", stream, -1, 0); else - c_print_type (TYPE_FIELD_TYPE (type, i), - "", stream, -1, 0); + c_print_type (param_type, "", stream, -1, 0); printed_any = 1; } diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 19aec4c..9d94c4c 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2011-02-13 Jan Kratochvil + + Fix const/volatile qualifiers of C++ types, PR c++/12328. + * gdb.cp/overload-const.exp: New file. + * gdb.cp/overload-const.cc: New file. + 2011-02-08 Ulrich Weigand * gdb.opencl/callfuncs.cl: New file. diff --git a/gdb/testsuite/gdb.cp/overload-const.cc b/gdb/testsuite/gdb.cp/overload-const.cc new file mode 100644 index 0000000..298cfbe --- /dev/null +++ b/gdb/testsuite/gdb.cp/overload-const.cc @@ -0,0 +1,28 @@ +/* This test case is part of GDB, the GNU debugger. + + Copyright 2011 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 . */ + +class myclass +{ +public: + static void func(const int aa) {} +}; + +int +main () +{ + myclass::func (42); +} diff --git a/gdb/testsuite/gdb.cp/overload-const.exp b/gdb/testsuite/gdb.cp/overload-const.exp new file mode 100644 index 0000000..df7a78f --- /dev/null +++ b/gdb/testsuite/gdb.cp/overload-const.exp @@ -0,0 +1,29 @@ +# Copyright 2011 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 file is part of the gdb testsuite. + +if {[skip_cplus_tests]} { continue } + +set testfile "overload-const" +if [prepare_for_testing $testfile $testfile $testfile.cc {c++ debug}] { + return -1 +} + +gdb_test_no_output "set language c++" + +if [gdb_breakpoint "myclass::func"] { + pass "setting breakpoint at myclass::func" +} -- 2.7.4