diff options
-rw-r--r-- | gdb/ChangeLog | 7 | ||||
-rw-r--r-- | gdb/ch-exp.c | 6 | ||||
-rw-r--r-- | gdb/gdbtypes.c | 8 |
3 files changed, 16 insertions, 5 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 0833cf2..c9f5407 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -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, diff --git a/gdb/ch-exp.c b/gdb/ch-exp.c index 6c2471f..31c92b5 100644 --- a/gdb/ch-exp.c +++ b/gdb/ch-exp.c @@ -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 diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c index 3cde087..99c7c57 100644 --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c @@ -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; |