This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: Query regarding expression evaluation.
- From: Andreas Schwab <schwab at suse dot de>
- To: gdb-patches at sources dot redhat dot com
- Cc: gdb at sources dot redhat dot com, ramana dot radhakrishnan at codito dot com
- Date: Thu, 11 Aug 2005 12:10:51 +0200
- Subject: Re: Query regarding expression evaluation.
- References: <1123684979.29036.21.camel@localhost.localdomain>
Ramana Radhakrishnan <ramana.radhakrishnan@codito.com> writes:
> Look at PR1978 . The discrepancy is because in valarith.c , GDB takes
> the operation to be unsigned depending only on the operand types. In the
> case described in the PR this seems alright with respect to the C
> standard since the result is implementation dependent.
Here is a fix:
2005-08-11 Andreas Schwab <schwab@suse.de>
PR exp/1978
* valarith.c (value_binop): Fix result type for the shift
operators.
--- gdb/valarith.c.~1.41.~ 2005-07-07 11:12:12.000000000 +0200
+++ gdb/valarith.c 2005-08-10 18:22:48.000000000 +0200
@@ -883,7 +883,14 @@ value_binop (struct value *arg1, struct
Use the signedness of the operand with the greater length.
If both operands are of equal length, use unsigned operation
if one of the operands is unsigned. */
- if (promoted_len1 > promoted_len2)
+ if (op == BINOP_RSH || op == BINOP_LSH)
+ {
+ /* In case of the shift operators the type of the result only
+ depends on the type of the left operand. */
+ unsigned_operation = is_unsigned1;
+ result_len = promoted_len1;
+ }
+ else if (promoted_len1 > promoted_len2)
{
unsigned_operation = is_unsigned1;
result_len = promoted_len1;
Andreas.
--
Andreas Schwab, SuSE Labs, schwab@suse.de
SuSE Linux Products GmbH, Maxfeldstraße 5, 90409 Nürnberg, Germany
Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5
"And now for something completely different."