From: Tom Tromey Date: Fri, 8 Apr 2022 16:11:58 +0000 (-0600) Subject: Fix bug in Ada number lexing X-Git-Tag: binutils-2_39~1010 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=36baf73637c4bd7fdaa9c6318c4c8071d82ac616;p=thirdparty%2Fbinutils-gdb.git Fix bug in Ada number lexing On irc, Pedro pointed out that Ada couldn't properly handle 0xffffffffffffffff. This used to work, but is a regression due to some patches I wrote in the Ada lexer. This patch fixes the bug. --- diff --git a/gdb/ada-lex.l b/gdb/ada-lex.l index 3980889f5ab..33a08eaa93b 100644 --- a/gdb/ada-lex.l +++ b/gdb/ada-lex.l @@ -462,11 +462,11 @@ processInt (struct parser_state *par_state, const char *base0, return FLOAT; } - gdb_mpz maxval (ULONGEST_MAX / base); + gdb_mpz maxval (ULONGEST_MAX); if (mpz_cmp (result.val, maxval.val) > 0) error (_("Integer literal out of range")); - LONGEST value = result.as_integer (); + ULONGEST value = result.as_integer (); if ((value >> (gdbarch_int_bit (par_state->gdbarch ())-1)) == 0) yylval.typed_val.type = type_int (par_state); else if ((value >> (gdbarch_long_bit (par_state->gdbarch ())-1)) == 0) diff --git a/gdb/testsuite/gdb.ada/literals.exp b/gdb/testsuite/gdb.ada/literals.exp index 92a9a1954fc..a6ac89b540f 100644 --- a/gdb/testsuite/gdb.ada/literals.exp +++ b/gdb/testsuite/gdb.ada/literals.exp @@ -34,3 +34,6 @@ gdb_test "print 2e1000" "Integer literal out of range" gdb_test "print 16#ffff#" " = 65535" gdb_test "print 16#f#e1" " = 240" gdb_test "print 16#1#e10" " = 1099511627776" + +gdb_test "print/x 16#7fffffffffffffff#" " = 0x7fffffffffffffff" +gdb_test "print 16#ffffffffffffffff#" " = -1" diff --git a/gdb/testsuite/gdb.base/parse_number.exp b/gdb/testsuite/gdb.base/parse_number.exp index 8849c99a3f9..dc6d358ca48 100644 --- a/gdb/testsuite/gdb.base/parse_number.exp +++ b/gdb/testsuite/gdb.base/parse_number.exp @@ -28,7 +28,8 @@ proc test_parse_numbers {} { set val "0xffffffffffffffff" if {$lang == "ada"} { - gdb_test "p/x $val" "Integer literal out of range" + gdb_test "p/x $val" " = 0xffffffffffffffff" + gdb_test "ptype $val" " = <8-byte integer>" } elseif {$lang == "fortran"} { gdb_test "p/x $val" " = 0xffffffff" gdb_test "ptype $val" " = unsigned int"