------- Comment #2 from nospam at pamies dot cat 2009-02-06 21:07 -------
Is not the same bug as #15145. I agree with you that there is just one sequence
point, but the operation is not undefined.
void swap(int *a, int *b) {
*a ^= *b ^= *a ^= *b;
}
This code should be compiled to:
*a = *a ^ *b;
*b = *b ^ *a;
*a = *a ^ *b;
And not to something like (I think that is what happens):
int tmp;
tmp = *a ^ *b;
*b = *b ^ tmp;
//On that point *a should contain 5^8 instead of the original value 5.
//This happens because the temp variable generated by the compiler.
*a = *a ^ *b;
I think that the compiler is not translating properly what was written in the
source code. Summarizing, I think that in:
y = 1;
x = (y += 1);
The execution order should be:
volatile_register <--- y + 1
y <--- volatile_register
x <--- volatile_register
instead of:
volatile_register <--- y + 1
x <--- volatile_register
y <--- volatile_register
--
nospam at pamies dot cat changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|RESOLVED |UNCONFIRMED
Resolution|DUPLICATE |
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39121