http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46045
Summary: incorrect code generated if redecalring local variable in do-while(0) Product: gcc Version: 4.5.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c AssignedTo: unassig...@gcc.gnu.org ReportedBy: mbui...@gmail.com following program gives incorrect results if compiled with -O0 and crashes if compiled with -O2 $cat test.c struct A { int k; }; static int *foo(struct A *a) { do { struct A *a = a; return &a->k; } while (0); } int main(int argc, char *argv[]) { struct A a = {1}; return *foo(&a); } $gcc -O0 test.c && ./a.out ; echo $? 72 $gcc -O2 test.c && ./a.out ; echo $? Segmentation fault 139 Renaming local variable in do-while fixes the problem: < struct A *a = a; < return &a->k; --- > struct A *b = a; > return &b->k; $gcc -O0 test.c && ./a.out ; echo $? 1 $gcc -O2 test.c && ./a.out ; echo $? 1