aboutsummaryrefslogtreecommitdiff
path: root/gdb/ada-exp.y
diff options
context:
space:
mode:
authorTom Tromey <tromey@adacore.com>2019-05-03 12:18:26 -0600
committerTom Tromey <tromey@adacore.com>2019-05-03 17:04:56 -0600
commit222a8d255834c717f1690658a9f85501a46f9403 (patch)
tree181737fca35a8953bc59e915c910d0d18eaf489f /gdb/ada-exp.y
parentfcd60b848ed7619461b0b0e316201e7745cdb61d (diff)
downloadgdb-222a8d255834c717f1690658a9f85501a46f9403.zip
gdb-222a8d255834c717f1690658a9f85501a46f9403.tar.gz
gdb-222a8d255834c717f1690658a9f85501a46f9403.tar.bz2
Fix cast of character to enum type in Ada
An internal bug report points out that, when a global character enum type is used, casting fails, like: (gdb) print global_char_enum'('F') $1 = 70 The bug here turns out to be that enumerators are qualified, so for example the mangled name might be "pck__QU48", rather than "QU48". This patch fixes the problem by only examining the suffix of the enumerator. This is ok because the type is already known, and because the mangling scheme ensures that there won't be clashes. Tested on x86-64 Fedora 29. gdb/ChangeLog 2019-05-03 Tom Tromey <tromey@adacore.com> * ada-exp.y (convert_char_literal): Check suffix of each enumerator. gdb/testsuite/ChangeLog 2019-05-03 Tom Tromey <tromey@adacore.com> * gdb.ada/char_enum/pck.ads (Global_Enum_Type): New type. * gdb.ada/char_enum/foo.adb: Use Global_Enum_Type. * gdb.ada/char_enum.exp: Add test.
Diffstat (limited to 'gdb/ada-exp.y')
-rw-r--r--gdb/ada-exp.y10
1 files changed, 9 insertions, 1 deletions
diff --git a/gdb/ada-exp.y b/gdb/ada-exp.y
index eb71f12..92461db 100644
--- a/gdb/ada-exp.y
+++ b/gdb/ada-exp.y
@@ -1407,9 +1407,17 @@ convert_char_literal (struct type *type, LONGEST val)
return val;
xsnprintf (name, sizeof (name), "QU%02x", (int) val);
+ size_t len = strlen (name);
for (f = 0; f < TYPE_NFIELDS (type); f += 1)
{
- if (strcmp (name, TYPE_FIELD_NAME (type, f)) == 0)
+ /* Check the suffix because an enum constant in a package will
+ have a name like "pkg__QUxx". This is safe enough because we
+ already have the correct type, and because mangling means
+ there can't be clashes. */
+ const char *ename = TYPE_FIELD_NAME (type, f);
+ size_t elen = strlen (ename);
+
+ if (elen >= len && strcmp (name, ename + elen - len) == 0)
return TYPE_FIELD_ENUMVAL (type, f);
}
return val;