diff --git a/gdb/testsuite/gdb.base/bitshift.exp b/gdb/testsuite/gdb.base/bitshift.exp index d6e252102d9..cab82e1971e 100644 --- a/gdb/testsuite/gdb.base/bitshift.exp +++ b/gdb/testsuite/gdb.base/bitshift.exp @@ -363,6 +363,18 @@ proc test_shifts {} { test_rshift_tl $lang \ "print -1 >> [make_uint64 $lang 0xffffffffffffffff]" " = -1" } + + # Check if shift value isn't silently truncated to 32bit. + with_test_prefix "lower-32bit-zero" { + test_lshift_tl $lang \ + "print 1 << [make_uint64 $lang 0x100000000]" " = 0" + test_rshift_tl $lang \ + "print 1 >> [make_uint64 $lang 0x100000000]" " = 0" + test_lshift_tl $lang \ + "print -1 << [make_uint64 $lang 0x100000000]" " = 0" + test_rshift_tl $lang \ + "print -1 >> [make_uint64 $lang 0x100000000]" " = -1" + } } } diff --git a/gdb/valarith.c b/gdb/valarith.c index 6160b0e4438..a95d1088133 100644 --- a/gdb/valarith.c +++ b/gdb/valarith.c @@ -1086,7 +1086,7 @@ type_length_bits (type *type) static bool check_valid_shift_count (enum exp_opcode op, type *result_type, type *shift_count_type, const gdb_mpz &shift_count, - unsigned long &nbits) + ULONGEST &nbits) { if (!shift_count_type->is_unsigned ()) { @@ -1112,7 +1112,7 @@ check_valid_shift_count (enum exp_opcode op, type *result_type, } } - nbits = shift_count.as_integer (); + nbits = shift_count.as_integer (); if (nbits >= type_length_bits (result_type)) { /* In Go, shifting by large amounts is defined. Be silent and @@ -1291,7 +1291,7 @@ scalar_binop (struct value *arg1, struct value *arg2, enum exp_opcode op) case BINOP_LSH: { - unsigned long nbits; + ULONGEST nbits; if (!check_valid_shift_count (op, result_type, type2, v2, nbits)) v = 0; else @@ -1301,7 +1301,7 @@ scalar_binop (struct value *arg1, struct value *arg2, enum exp_opcode op) case BINOP_RSH: { - unsigned long nbits; + ULONGEST nbits; if (!check_valid_shift_count (op, result_type, type2, v2, nbits)) { /* Pretend the too-large shift was decomposed in a