* valops.c (value_cast): Handle casts to and from TYPE_CODE_CHAR.
authorPer Bothner <per@bothner.com>
Mon, 11 Dec 1995 09:02:26 +0000 (09:02 +0000)
committerPer Bothner <per@bothner.com>
Mon, 11 Dec 1995 09:02:26 +0000 (09:02 +0000)
* ch-exp.c (match_integer_literal):  Fix long long support.
* gdbtypes.c (get_discrete_bounds):  Make TYPE_LENGTH (type) ==
sizeof (LONGEST) case work OK.

gdb/ChangeLog
gdb/ch-exp.c
gdb/gdbtypes.c

index 0833cf28cbd37d41f90035d1e3f5bd023116a626..c9f54079340abcef576d2857f0189d51f7e0e061 100644 (file)
@@ -1,3 +1,10 @@
+Mon Dec 11 00:36:01 1995  Per Bothner  <bothner@kalessin.cygnus.com>
+
+       * valops.c (value_cast):  Handle casts to and from TYPE_CODE_CHAR.
+       * ch-exp.c (match_integer_literal):  Fix long long support.
+       * gdbtypes.c (get_discrete_bounds):  Make TYPE_LENGTH (type) ==
+       sizeof (LONGEST) case work OK.
+
 Fri Dec  8 21:02:24 1995  Fred Fish  <fnf@cygnus.com>
 
        * coffread.c, dbxread.c, dstread.c, objfiles.c, os9kread.c,
index 6c2471f72986a63b19b0f1d62d38b21c37947b58..31c92b5e2478f766e18464edff8d900b06e6a9dc 100644 (file)
@@ -597,7 +597,7 @@ parse_primval ()
     case CHARACTER_LITERAL:
       write_exp_elt_opcode (OP_LONG);
       write_exp_elt_type (PEEK_LVAL ().typed_val.type);
-      write_exp_elt_longcst ((LONGEST) (PEEK_LVAL ().typed_val.val));
+      write_exp_elt_longcst (PEEK_LVAL ().typed_val.val);
       write_exp_elt_opcode (OP_LONG);
       FORWARD_TOKEN ();
       break;
@@ -1544,8 +1544,8 @@ match_integer_literal ()
   else 
     {
       yylval.typed_val.val = ival;
-#ifdef CC_HAS_LONG_LONG
-      if (ival > 2147483647 || ival < -2147483648)
+#if defined(CC_HAS_LONG_LONG) && defined(__STDC__)
+      if (ival > (LONGEST)2147483647U || ival < -(LONGEST)2147483648U)
        yylval.typed_val.type = builtin_type_long_long;
       else
 #endif
index 3cde087c861dda0f4c82480f333930e1026743f9..99c7c57b08256825bc0b9f653f4e0827b87dc00b 100644 (file)
@@ -369,7 +369,7 @@ get_discrete_bounds (type, lowp, highp)
       *highp = 1;
       return 0;
     case TYPE_CODE_INT:
-      if (TYPE_LENGTH (type) >= sizeof (LONGEST))  /* Too big */
+      if (TYPE_LENGTH (type) > sizeof (LONGEST))  /* Too big */
        return -1;
       if (!TYPE_UNSIGNED (type))
        {
@@ -380,7 +380,11 @@ get_discrete_bounds (type, lowp, highp)
       /* ... fall through for unsigned ints ... */
     case TYPE_CODE_CHAR:
       *lowp = 0;
-      *highp = (1 << (TYPE_LENGTH (type) * TARGET_CHAR_BIT)) - 1;
+      /* This round-about calculation is to avoid shifting by
+        TYPE_LENGTH (type) * TARGET_CHAR_BIT, which will not work
+        if TYPE_LENGTH (type) == sizeof (LONGEST). */
+      *highp = 1 << (TYPE_LENGTH (type) * TARGET_CHAR_BIT - 1);
+      *highp = (*highp - 1) | *highp;
       return 0;
     default:
       return -1;