From: Tom Tromey Date: Thu, 1 Aug 2019 17:41:32 +0000 (-0600) Subject: Fix bug with character enumeration literal X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=272560b577894c388a3d0d3fda8294683714f582;p=binutils-gdb.git Fix bug with character enumeration literal gnat encodes character enumeration literals using a few different schemes. The gnat compiler documented the "QU" and "QW" encodings, but failed to document that a simpler encoding was used for certain characters. This patch updates gdb to handle this simple Q encoding. Note that wide character literals are still not handled. gdb/ChangeLog 2019-08-15 Tom Tromey * ada-exp.y (convert_char_literal): Handle "Q%c" encoding. * ada-lang.c (ada_enum_name): Likewise. gdb/testsuite/ChangeLog 2019-08-15 Tom Tromey * gdb.ada/char_enum.exp: Add regression tests. * gdb.ada/char_enum/foo.adb (Char_Enum_Type): Use '_' and '0'. (Char, Gchar): Update. * gdb.ada/char_enum/pck.ads (Global_Enum_Type): Use '+'. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 517972aba99..d11753f6005 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2019-08-15 Tom Tromey + + * ada-exp.y (convert_char_literal): Handle "Q%c" encoding. + * ada-lang.c (ada_enum_name): Likewise. + 2019-08-15 Christian Biesinger * python/lib/gdb/__init__.py (GdbOutputFile): Rename to have a diff --git a/gdb/ada-exp.y b/gdb/ada-exp.y index f36aabaf150..c8a7b9c9c75 100644 --- a/gdb/ada-exp.y +++ b/gdb/ada-exp.y @@ -1390,7 +1390,10 @@ convert_char_literal (struct type *type, LONGEST val) if (TYPE_CODE (type) != TYPE_CODE_ENUM) return val; - xsnprintf (name, sizeof (name), "QU%02x", (int) val); + if ((val >= 'a' && val <= 'z') || (val >= '0' && val <= '9')) + xsnprintf (name, sizeof (name), "Q%c", (int) val); + else + xsnprintf (name, sizeof (name), "QU%02x", (int) val); size_t len = strlen (name); for (f = 0; f < TYPE_NFIELDS (type); f += 1) { diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index 21a8e92462f..609f2d43919 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -9439,6 +9439,14 @@ ada_enum_name (const char *name) if (sscanf (name + 2, "%x", &v) != 1) return name; } + else if (((name[1] >= '0' && name[1] <= '9') + || (name[1] >= 'a' && name[1] <= 'z')) + && name[2] == '\0') + { + GROW_VECT (result, result_len, 4); + xsnprintf (result, result_len, "'%c'", name[1]); + return result; + } else return name; diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 640d392692b..def8a3174b4 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2019-08-15 Tom Tromey + + * gdb.ada/char_enum.exp: Add regression tests. + * gdb.ada/char_enum/foo.adb (Char_Enum_Type): Use '_' + and '0'. + (Char, Gchar): Update. + * gdb.ada/char_enum/pck.ads (Global_Enum_Type): Use '+'. + 2019-08-15 Christian Biesinger * gdb.python/python.exp: Expect a leading underscore on diff --git a/gdb/testsuite/gdb.ada/char_enum.exp b/gdb/testsuite/gdb.ada/char_enum.exp index c37d696f66d..1c814aa97f4 100644 --- a/gdb/testsuite/gdb.ada/char_enum.exp +++ b/gdb/testsuite/gdb.ada/char_enum.exp @@ -26,5 +26,11 @@ clean_restart ${testfile} set bp_location [gdb_get_line_number "STOP" ${testdir}/foo.adb] runto "foo.adb:$bp_location" +gdb_test "ptype Char_Enum_Type" "type = \\('A', 'B', 'C', '_', '0'\\)" gdb_test "print Char_Enum_Type'('B')" "= 1 'B'" +gdb_test "print Char_Enum_Type'('_')" "= 3 '_'" +gdb_test "print Char_Enum_Type'('0')" "= 4 '0'" +gdb_test "ptype pck.Global_Enum_Type" "type = \\('x', 'Y', '\\+'\\)" +gdb_test "print pck.Global_Enum_Type'('x')" "= 0 'x'" gdb_test "print pck.Global_Enum_Type'('Y')" "= 1 'Y'" +gdb_test "print pck.Global_Enum_Type'('+')" "= 2 '\\+'" diff --git a/gdb/testsuite/gdb.ada/char_enum/foo.adb b/gdb/testsuite/gdb.ada/char_enum/foo.adb index cf7fb7d3399..6ae1ef61ae8 100644 --- a/gdb/testsuite/gdb.ada/char_enum/foo.adb +++ b/gdb/testsuite/gdb.ada/char_enum/foo.adb @@ -16,9 +16,9 @@ with Pck; use Pck; procedure Foo is - type Char_Enum_Type is ('A', 'B', 'C', 'D', 'E'); - Char : Char_Enum_Type := 'D'; - Gchar : Global_Enum_Type := 'Z'; + type Char_Enum_Type is ('A', 'B', 'C', '_', '0'); + Char : Char_Enum_Type := '_'; + Gchar : Global_Enum_Type := '+'; begin Do_Nothing (Char'Address); -- STOP end Foo; diff --git a/gdb/testsuite/gdb.ada/char_enum/pck.ads b/gdb/testsuite/gdb.ada/char_enum/pck.ads index f952e1c31c1..d3e7423646b 100644 --- a/gdb/testsuite/gdb.ada/char_enum/pck.ads +++ b/gdb/testsuite/gdb.ada/char_enum/pck.ads @@ -16,7 +16,7 @@ with System; package Pck is - type Global_Enum_Type is ('X', 'Y', 'Z'); + type Global_Enum_Type is ('x', 'Y', '+'); procedure Do_Nothing (A : System.Address); end Pck;