modernc.org/ccgo/v3@v3.16.14/lib/testdata/gcc-9.1.0/gcc/testsuite/gcc.c-torture/execute/20000917-1.c (about) 1 /* This bug exists in gcc-2.95, egcs-1.1.2, gcc-2.7.2 and probably 2 every other version as well. */ 3 4 typedef struct int3 { int a, b, c; } int3; 5 6 int3 7 one (void) 8 { 9 return (int3) { 1, 1, 1 }; 10 } 11 12 int3 13 zero (void) 14 { 15 return (int3) { 0, 0, 0 }; 16 } 17 18 int 19 main (void) 20 { 21 int3 a; 22 23 /* gcc allocates a temporary for the inner expression statement 24 to store the return value of `one'. 25 26 gcc frees the temporaries for the inner expression statement. 27 28 gcc realloates the same temporary slot to store the return 29 value of `zero'. 30 31 gcc expands the call to zero ahead of the expansion of the 32 statement expressions. The temporary gets the value of `zero'. 33 34 gcc expands statement expressions and the stale temporary is 35 clobbered with the value of `one'. The bad value is copied from 36 the temporary into *&a. */ 37 38 *({ ({ one (); &a; }); }) = zero (); 39 if (a.a && a.b && a.c) 40 abort (); 41 exit (0); 42 }