Bug 26060

Summary: A ^= B ^= A ^=B doesn't work if compiled with -g
Product: gcc Reporter: Vitaly Kroivets <vitaly>
Component: cAssignee: Not yet assigned to anyone <unassigned>
Status: VERIFIED DUPLICATE    
Severity: major CC: algorithmus, arminu, asokumar, av1474, bala, barnarr, bmead15, buergel, carpman, ceniza666, chuchunxin, devnull, d_picco, eric.mcvicker, gaurav_har, gcc-bugs, gcc, ggs, horsh, jandres, janis, jompo, krs, lid, lindahlb, lxg8906, mayer, mikaldaz, nakkore, pierre.van.de.laar_at_philips.com, qyang, raoulgough, rglan, rjvbertin, robc, s9322036, smartmouse714, suan, super.aorta, svetozarmarkov, tczarnecki, vanveghel, vitaly, zshao
Priority: P3    
Version: 4.0.2   
Target Milestone: ---   
Host: i686-pc-linux-gnu Target: i686-pc-linux-gnu
Build: Known to work:
Known to fail: Last reconfirmed:

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.