Fix PR rust/20110
authorTom Tromey <tom@tromey.com>
Wed, 18 May 2016 23:22:30 +0000 (17:22 -0600)
committerTom Tromey <tom@tromey.com>
Fri, 10 Jun 2016 15:57:09 +0000 (09:57 -0600)
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.

gdb/ChangeLog
gdb/rust-exp.y
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.rust/expr.exp

index c7c74fb9e63f16eb09086dc2ad6bb5647ecb0fed..1a4a00207f6033f384be6b99466996a6ab307a6b 100644 (file)
@@ -1,3 +1,8 @@
+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.
index c1a863c465f9820da6e1648cc1fc991d326d9c99..aeb605887aa6e844a7f4cad3c99ba41f7da34dfc 100644 (file)
@@ -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
index eda7b99a59eea8425bd54eef1bc95a44e6be4a3a..7d2b1447620df6d1dc9d330d6c10f79aa2b17aa3 100644 (file)
@@ -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.
index 99a697e7e05feb6734756b7e5ea942da24acb942..fff3eef34fb6ab436d86b819dffd90228bc81c12 100644 (file)
@@ -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\\\]"