[Bug c/46045] New: incorrect code generated if redecalring local variable in do-while(0)
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:k; --- >struct A *b = a; >return &b->k; $gcc -O0 test.c && ./a.out ; echo $? 1 $gcc -O2 test.c && ./a.out ; echo $? 1
[Bug c/46045] incorrect code generated if redecalring local variable in do-while(0)
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46045 --- Comment #3 from Michael Builov 2010-10-17 15:51:16 UTC --- Just a warning with -Wextra, but no warnings with -Wall -pedantic. I found a bug with this code: struct A { #definer dump(_a_) \ do { \ Struct A *a = _a_; \ printf("%d, %d\n", a->k, a->m); \ } while (0) Struct *b, a; dump(b); /* fine */ dump(a); /* crash */
[Bug c/46045] incorrect code generated if redecalring local variable in do-while(0)
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46045 --- Comment #4 from Michael Builov 2010-10-17 16:19:37 UTC --- Just a warning with -Wextra, but no warnings with -Wall -pedantic. I found a bug with this code: struct A { int k; int m; }; #define dump(_a_) \ do { \ struct A *a = _a_; \ printk("%d, %d\n", a->k, a->m); \ } while (0) void foo(struct A *b, struct A *a) { dump(b); /* fine */ dump(a); /* crash */ } This code compiles and runs fine with Sun cc, but crashes with gcc. I think it is definitely a bug in gcc, this code compiled only with extra warnings (not enabled by default in linux kernel) should not crash. The best way to fix this issue - generate an error message, like when redeclaring variable in function: void bar(struct A *a) { struct A *a = a; /* error: 'a' redeclared as different kind of symbol */ } strange, but no errors/non-extra warnings with: void bar(struct A *a) { { struct A *a = a; } }