diff options
author | Jan Kratochvil <jan.kratochvil@redhat.com> | 2011-02-13 09:15:50 +0000 |
---|---|---|
committer | Jan Kratochvil <jan.kratochvil@redhat.com> | 2011-02-13 09:15:50 +0000 |
commit | fd0a6e5cd0e8adf7f6039f4709772d61bba7806c (patch) | |
tree | 0607a66b8d04d2ff30b641ca634d8c6095b14809 /gdb/c-typeprint.c | |
parent | 905080c1ebe4d889977112e418c8dd3c66f93254 (diff) | |
download | gdb-fd0a6e5cd0e8adf7f6039f4709772d61bba7806c.tar.gz |
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.
Diffstat (limited to 'gdb/c-typeprint.c')
-rw-r--r-- | gdb/c-typeprint.c | 31 |
1 files changed, 24 insertions, 7 deletions
diff --git a/gdb/c-typeprint.c b/gdb/c-typeprint.c index 9909e130a0d..c70fa4beb3d 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; } |