Bug 26060 - A ^= B ^= A ^=B doesn't work if compiled with -g
A ^= B ^= A ^=B doesn't work if compiled with -g
Status: VERIFIED DUPLICATE of bug 11751
Product: gcc
Classification: Unclassified
Component: c
4.0.2
: P3 major
: ---
Assigned To: Not yet assigned to anyone
:
Depends on:
Blocks:
  Show dependency treegraph
 
Reported: 2006-02-01 09:48 UTC by Vitaly Kroivets
Modified: 2006-02-01 11:08 UTC (History)
44 users (show)

See Also:
Host: i686-pc-linux-gnu
Target: i686-pc-linux-gnu
Build:
Known to work:
Known to fail:
Last reconfirmed:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Vitaly Kroivets 2006-02-01 09:48:48 UTC
Following program works differently - if compiled with flag -g or without:

--------------
#include <iostream>
using namespace std;

int main(){
unsigned char a[10];
a[0] = 'A';
a[2] = 'B';
a[0] ^= a[2] ^= a[0] ^= a[2];
cout <<"a0="<<a[0]<<"   a2="<<a[2]<<endl;
}
==============================

VITALY:/tmp>g++_4.0.2 -O3 a.cc
VITALY:/tmp>./a.out 
a0=B   a2=A
VITALY:/tmp>g++_4.0.2 -g a.cc
VITALY:/tmp>./a.out
a0=   a2=A
===============================

:/tmp>g++_4.0.2 -v
Using built-in specs.
Target: i686-pc-linux-gnu
Configured with: ../gcc-4.0.2/configure --prefix=/jer/sys/contrib/linux/gcc-4.0.2_i686/ --with-static-libgcc --disable-shared -enable-languages=c,c++
Thread model: posix
gcc version 4.0.2
Comment 1 Pawel Sikora 2006-02-01 10:23:49 UTC
It's not a gcc bug. The code relies on the results of intermediate
subexpressions.  According to Stroustrup, The C++ Programming Language, section 6.2.2, "The order of evaluation of subexpressions within
an expression is undefined."

You should use sequence points e.g.:

        a ^= b, b ^= a, a ^= b;
Comment 2 Andreas Schwab 2006-02-01 10:34:43 UTC

*** This bug has been marked as a duplicate of 11751 ***
Comment 3 Vitaly Kroivets 2006-02-01 11:08:44 UTC
Thank you very much.