summaryrefslogtreecommitdiff
path: root/gdb/c-typeprint.c
diff options
context:
space:
mode:
authorJan Kratochvil <jan.kratochvil@redhat.com>2011-02-13 09:15:50 +0000
committerJan Kratochvil <jan.kratochvil@redhat.com>2011-02-13 09:15:50 +0000
commitfd0a6e5cd0e8adf7f6039f4709772d61bba7806c (patch)
tree0607a66b8d04d2ff30b641ca634d8c6095b14809 /gdb/c-typeprint.c
parent905080c1ebe4d889977112e418c8dd3c66f93254 (diff)
downloadgdb-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.c31
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;
}