aboutsummaryrefslogtreecommitdiff
path: root/gdb/c-valprint.c
diff options
context:
space:
mode:
authorTom Tromey <tromey@redhat.com>2009-06-23 16:26:05 +0000
committerTom Tromey <tromey@redhat.com>2009-06-23 16:26:05 +0000
commit85e306ed0eb2fb5032d459a13cfd345edf1bb2aa (patch)
tree718a1bbdb8b9c3608901375eb80024b749422ffb /gdb/c-valprint.c
parent3188b0706d4d68b6cd4df669ca4557fc2f87736a (diff)
downloadgdb-85e306ed0eb2fb5032d459a13cfd345edf1bb2aa.zip
gdb-85e306ed0eb2fb5032d459a13cfd345edf1bb2aa.tar.gz
gdb-85e306ed0eb2fb5032d459a13cfd345edf1bb2aa.tar.bz2
gdb
PR gdb/10309: * c-lang.c (classify_type): Iterate over typedefs. * c-valprint.c (textual_element_type): Iterate over typedefs. gdb/testsuite * gdb.base/charset.exp (test_combination): Regression test. * gdb.base/charset.c (my_wchar_t): New typedef. (myvar): New global. (main): Set myvar.
Diffstat (limited to 'gdb/c-valprint.c')
-rw-r--r--gdb/c-valprint.c31
1 files changed, 25 insertions, 6 deletions
diff --git a/gdb/c-valprint.c b/gdb/c-valprint.c
index 3433da2..b2020f3 100644
--- a/gdb/c-valprint.c
+++ b/gdb/c-valprint.c
@@ -81,23 +81,42 @@ textual_name (const char *name)
static int
textual_element_type (struct type *type, char format)
{
- struct type *true_type = check_typedef (type);
+ struct type *true_type, *iter_type;
if (format != 0 && format != 's')
return 0;
+ /* We also rely on this for its side effect of setting up all the
+ typedef pointers. */
+ true_type = check_typedef (type);
+
/* TYPE_CODE_CHAR is always textual. */
if (TYPE_CODE (true_type) == TYPE_CODE_CHAR)
return 1;
+
/* Any other character-like types must be integral. */
if (TYPE_CODE (true_type) != TYPE_CODE_INT)
return 0;
- /* Check the names of the type and the typedef. */
- if (TYPE_NAME (type) && textual_name (TYPE_NAME (type)))
- return 1;
- if (TYPE_NAME (true_type) && textual_name (TYPE_NAME (true_type)))
- return 1;
+ /* We peel typedefs one by one, looking for a match. */
+ iter_type = type;
+ while (iter_type)
+ {
+ /* Check the name of the type. */
+ if (TYPE_NAME (iter_type) && textual_name (TYPE_NAME (iter_type)))
+ return 1;
+
+ if (TYPE_CODE (iter_type) != TYPE_CODE_TYPEDEF)
+ break;
+
+ /* Peel a single typedef. If the typedef doesn't have a target
+ type, we use check_typedef and hope the result is ok -- it
+ might be for C++, where wchar_t is a built-in type. */
+ if (TYPE_TARGET_TYPE (iter_type))
+ iter_type = TYPE_TARGET_TYPE (iter_type);
+ else
+ iter_type = check_typedef (iter_type);
+ }
if (format == 's')
{