diff options
author | Tom Tromey <tromey@redhat.com> | 2009-06-23 16:26:05 +0000 |
---|---|---|
committer | Tom Tromey <tromey@redhat.com> | 2009-06-23 16:26:05 +0000 |
commit | 85e306ed0eb2fb5032d459a13cfd345edf1bb2aa (patch) | |
tree | 718a1bbdb8b9c3608901375eb80024b749422ffb /gdb/c-valprint.c | |
parent | 3188b0706d4d68b6cd4df669ca4557fc2f87736a (diff) | |
download | gdb-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.c | 31 |
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') { |