[Bug c/46045] New: incorrect code generated if redecalring local variable in do-while(0)

2010-10-16 Thread mbuilov at gmail dot com
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)

2010-10-17 Thread mbuilov at gmail dot com
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)

2010-10-17 Thread mbuilov at gmail dot com
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;
}
}