aboutsummaryrefslogtreecommitdiff
path: root/gdb/rust-exp.y
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2016-05-18 17:22:30 -0600
committerTom Tromey <tom@tromey.com>2016-06-10 09:57:09 -0600
commit347dc1025db1c0acf616ab6520c3f36448f25e8b (patch)
treeab361773f82b20a3171e5fb7fc05266f11b1c90a /gdb/rust-exp.y
parentedef7b8cf3d811ce8630591dbed1257ba16164ff (diff)
downloadgdb-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.
Diffstat (limited to 'gdb/rust-exp.y')
-rw-r--r--gdb/rust-exp.y15
1 files changed, 13 insertions, 2 deletions
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