This is the mail archive of the
gdb-cvs@sourceware.org
mailing list for the GDB project.
[binutils-gdb] Fix PR rust/20110
- From: Tom Tromey <tromey at sourceware dot org>
- To: gdb-cvs at sourceware dot org
- Date: 10 Jun 2016 16:08:34 -0000
- Subject: [binutils-gdb] Fix PR rust/20110
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=347dc1025db1c0acf616ab6520c3f36448f25e8b
commit 347dc1025db1c0acf616ab6520c3f36448f25e8b
Author: Tom Tromey <tom@tromey.com>
Date: Wed May 18 17:22:30 2016 -0600
Fix PR rust/20110
PR rust/20110 concerns the type of an integer constant that is too
large for "i32", the default integer type. This patch changes the
type of such a constant to i64. This is important because such values
are often addresses, so truncating them by default is unfriendly.
Built and regtested on x86-64 Fedora 23.
2016-06-10 Tom Tromey <tom@tromey.com>
PR rust/20110:
* rust-exp.y (lex_number): Don't truncate large numbers to i32.
2016-06-10 Tom Tromey <tom@tromey.com>
PR rust/20110:
* gdb.rust/expr.exp: Add test for integer constant larger than
i32.
Diff:
---
gdb/ChangeLog | 5 +++++
gdb/rust-exp.y | 15 +++++++++++++--
gdb/testsuite/ChangeLog | 6 ++++++
gdb/testsuite/gdb.rust/expr.exp | 2 ++
4 files changed, 26 insertions(+), 2 deletions(-)
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index c7c74fb..1a4a002 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,10 @@
2016-06-10 Tom Tromey <tom@tromey.com>
+ PR rust/20110:
+ * rust-exp.y (lex_number): Don't truncate large numbers to i32.
+
+2016-06-10 Tom Tromey <tom@tromey.com>
+
* Makefile.in (COMMON_OBS): Remove rust-exp.o.
(YYFILES): Add rust-exp.c.
(YYOBJ): Add rust-exp.o.
diff --git a/gdb/rust-exp.y b/gdb/rust-exp.y
index c1a863c..aeb6058 100644
--- a/gdb/rust-exp.y
+++ b/gdb/rust-exp.y
@@ -1418,6 +1418,7 @@ lex_number (void)
int match;
int is_integer = 0;
int could_be_decimal = 1;
+ int implicit_i32 = 0;
char *type_name = NULL;
struct type *type;
int end_index;
@@ -1436,7 +1437,10 @@ lex_number (void)
is_integer = 1;
end_index = subexps[INT_TEXT].rm_eo;
if (subexps[INT_TYPE].rm_so == -1)
- type_name = "i32";
+ {
+ type_name = "i32";
+ implicit_i32 = 1;
+ }
else
{
type_index = INT_TYPE;
@@ -1478,6 +1482,7 @@ lex_number (void)
end_index = subexps[0].rm_eo;
type_name = "i32";
could_be_decimal = 1;
+ implicit_i32 = 1;
}
}
@@ -1512,6 +1517,7 @@ lex_number (void)
/* Parse the number. */
if (is_integer)
{
+ uint64_t value;
int radix = 10;
if (number[0] == '0')
{
@@ -1527,7 +1533,12 @@ lex_number (void)
could_be_decimal = 0;
}
}
- rustyylval.typed_val_int.val = strtoul (number, NULL, radix);
+
+ value = strtoul (number, NULL, radix);
+ if (implicit_i32 && value >= ((uint64_t) 1) << 31)
+ type = rust_type ("i64");
+
+ rustyylval.typed_val_int.val = value;
rustyylval.typed_val_int.type = type;
}
else
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index eda7b99..7d2b144 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2016-06-10 Tom Tromey <tom@tromey.com>
+
+ PR rust/20110:
+ * gdb.rust/expr.exp: Add test for integer constant larger than
+ i32.
+
2016-06-10 Bernhard Heckel <bernhard.heckel@intel.com>
* gdb.fortran/nested-funcs.exp: New.
diff --git a/gdb/testsuite/gdb.rust/expr.exp b/gdb/testsuite/gdb.rust/expr.exp
index 99a697e..fff3eef 100644
--- a/gdb/testsuite/gdb.rust/expr.exp
+++ b/gdb/testsuite/gdb.rust/expr.exp
@@ -104,6 +104,8 @@ gdb_test "print 1 << 5" " = 32"
gdb_test "print 32usize >> 5" " = 1"
gdb_test "ptype 32i32 as f64" "type = f64"
+gdb_test "ptype 0xf9f9f9f90000" "type = i64"
+
gdb_test "print ()" " = \\(\\)"
gdb_test "print \[1,2,3,4\]" " = \\\[1, 2, 3, 4\\\]"