diff options
author | Tom Tromey <tom@tromey.com> | 2016-05-18 17:22:30 -0600 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2016-06-10 09:57:09 -0600 |
commit | 347dc1025db1c0acf616ab6520c3f36448f25e8b (patch) | |
tree | ab361773f82b20a3171e5fb7fc05266f11b1c90a | |
parent | edef7b8cf3d811ce8630591dbed1257ba16164ff (diff) | |
download | gdb-347dc1025db1c0acf616ab6520c3f36448f25e8b.zip gdb-347dc1025db1c0acf616ab6520c3f36448f25e8b.tar.gz gdb-347dc1025db1c0acf616ab6520c3f36448f25e8b.tar.bz2 |
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.
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/rust-exp.y | 15 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | 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\\\]" |