Fix changelog
[external/binutils.git] / gdb / rust-exp.y
index f0c4e6c..aeb6058 100644 (file)
@@ -26,7 +26,6 @@
 #include "block.h"
 #include "charset.h"
 #include "cp-support.h"
-#include "f-lang.h"
 #include "gdb_obstack.h"
 #include "gdb_regex.h"
 #include "rust-lang.h"
@@ -1419,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;
@@ -1437,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;
@@ -1479,6 +1482,7 @@ lex_number (void)
          end_index = subexps[0].rm_eo;
          type_name = "i32";
          could_be_decimal = 1;
+         implicit_i32 = 1;
        }
     }
 
@@ -1513,6 +1517,7 @@ lex_number (void)
   /* Parse the number.  */
   if (is_integer)
     {
+      uint64_t value;
       int radix = 10;
       if (number[0] == '0')
        {
@@ -1528,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
@@ -1787,7 +1797,7 @@ ast_range (const struct rust_op *lhs, const struct rust_op *rhs)
 {
   struct rust_op *result = OBSTACK_ZALLOC (&work_obstack, struct rust_op);
 
-  result->opcode = OP_F90_RANGE;
+  result->opcode = OP_RANGE;
   result->left.op = lhs;
   result->right.op = rhs;
 
@@ -2417,9 +2427,9 @@ convert_ast_to_expression (struct parser_state *state,
       }
       break;
 
-    case OP_F90_RANGE:
+    case OP_RANGE:
       {
-       enum f90_range_type kind = BOTH_BOUND_DEFAULT;
+       enum range_type kind = BOTH_BOUND_DEFAULT;
 
        if (operation->left.op != NULL)
          {
@@ -2437,9 +2447,9 @@ convert_ast_to_expression (struct parser_state *state,
                kind = NONE_BOUND_DEFAULT;
              }
          }
-       write_exp_elt_opcode (state, OP_F90_RANGE);
+       write_exp_elt_opcode (state, OP_RANGE);
        write_exp_elt_longcst (state, kind);
-       write_exp_elt_opcode (state, OP_F90_RANGE);
+       write_exp_elt_opcode (state, OP_RANGE);
       }
       break;