Both of these are undefined. Look up about sequence point rules.

Sent from my iPhone

On Jun 7, 2009, at 12:15 AM, "ashutosh dot sharma dot 0204 at gmail dot com" <gcc-bugzi...@gcc.gnu.org> wrote:

Compiler Version:
gcc (GCC) 4.2.4 (Ubuntu 4.2.4-1ubuntu3)
Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


Sample code:

#include <stdio.h>

int main() {
       int a[2];
       a[0]=10;
       a[1]=20;
       printf("a[0] = %d a[1] = %d\n", a[0], a[1]);
       a[0]^=a[1]^=a[0]^=a[1];
       printf("a[0] = %d a[1] = %d\n", a[0], a[1]);
       return 0;
}

gcc test.c -o test -O2

a[0] = 10 a[1] = 20
a[0] = 20 a[1] = 10

gcc test.c -o test -O0

a[0] = 10 a[1] = 20
a[0] = 0 a[1] = 10

Bug: When compiled with -O0 swap fails.
Swap only fails in case of array. Following code works fine with -O0:

#include <stdio.h>

int main() {
       int a, b;
       a=10;
       b=20;
       printf("a = %d b = %d\n", a, b);
       a^=b^=a^=b;
       printf("a = %d b = %d\n", a, b);
       return 0;
}


--
          Summary: Array + XOR swap fails
          Product: gcc
          Version: unknown
           Status: UNCONFIRMED
         Severity: major
         Priority: P3
        Component: c
       AssignedTo: unassigned at gcc dot gnu dot org
       ReportedBy: ashutosh dot sharma dot 0204 at gmail dot com


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40366

Reply via email to