aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorTom Tromey <tromey@adacore.com>2019-04-09 13:19:28 -0600
committerTom Tromey <tromey@adacore.com>2019-04-09 13:21:13 -0600
commit8dc433a0fb04f8fa37530d0788053dd9bea5c37d (patch)
tree3fbedde5a04dcdbc10f3a273b4bd792c72fb3f4c /gdb
parentb0319eaaf9d1f4e730c532058f2fff0b4e5ce682 (diff)
downloadgdb-8dc433a0fb04f8fa37530d0788053dd9bea5c37d.zip
gdb-8dc433a0fb04f8fa37530d0788053dd9bea5c37d.tar.gz
gdb-8dc433a0fb04f8fa37530d0788053dd9bea5c37d.tar.bz2
Fix Rust lexer buglet
PR rust/24414 points out that the Rust lexer uses strtoul when lexing an integer, and that this can give the wrong results in some situations. This patch changes it to use strtoulst, like most of the rest of gdb. It also adds a self test. Tested on x86-64 Fedora 29 using an i686 build. gdb/ChangeLog 2019-04-09 Ivan Begert <ivanbegert@gmail.com> Tom Tromey <tromey@adacore.com> PR rust/24414: * rust-exp.y (rust_parser::lex_number): Use strtoulst. (rust_lex_int_test): Change "value" to be LONGEST. (rust_lex_tests): Add test for long integer literal.
Diffstat (limited to 'gdb')
-rw-r--r--gdb/ChangeLog8
-rw-r--r--gdb/rust-exp.y6
2 files changed, 12 insertions, 2 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 6ee8d05..f9b9e88 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,11 @@
+2019-04-09 Ivan Begert <ivanbegert@gmail.com>
+ Tom Tromey <tromey@adacore.com>
+
+ PR rust/24414:
+ * rust-exp.y (rust_parser::lex_number): Use strtoulst.
+ (rust_lex_int_test): Change "value" to be LONGEST.
+ (rust_lex_tests): Add test for long integer literal.
+
2019-04-09 Tom Tromey <tromey@adacore.com>
* remote.c (remote_target::remote_add_inferior): Change fake_pid_p
diff --git a/gdb/rust-exp.y b/gdb/rust-exp.y
index 2be2532..1593263 100644
--- a/gdb/rust-exp.y
+++ b/gdb/rust-exp.y
@@ -1610,7 +1610,7 @@ rust_parser::lex_number (YYSTYPE *lvalp)
}
}
- value = strtoul (number.c_str () + offset, NULL, radix);
+ value = strtoulst (number.c_str () + offset, NULL, radix);
if (implicit_i32 && value >= ((uint64_t) 1) << 31)
type = get_type ("i64");
@@ -2603,7 +2603,8 @@ rust_lex_test_one (rust_parser *parser, const char *input, int expected)
/* Test that INPUT lexes as the integer VALUE. */
static void
-rust_lex_int_test (rust_parser *parser, const char *input, int value, int kind)
+rust_lex_int_test (rust_parser *parser, const char *input,
+ LONGEST value, int kind)
{
RUSTSTYPE result = rust_lex_test_one (parser, input, kind);
SELF_CHECK (result.typed_val_int.val == value);
@@ -2781,6 +2782,7 @@ rust_lex_tests (void)
rust_lex_int_test (&parser, "0x1_f", 0x1f, INTEGER);
rust_lex_int_test (&parser, "0b1_101011__", 0x6b, INTEGER);
rust_lex_int_test (&parser, "0o001177i64", 639, INTEGER);
+ rust_lex_int_test (&parser, "0x123456789u64", 0x123456789ull, INTEGER);
rust_lex_test_trailing_dot (&parser);