This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c/46045] New: incorrect code generated if redecalring local variable in do-while(0)
- From: "mbuilov at gmail dot com" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Sat, 16 Oct 2010 13:26:34 +0000
- Subject: [Bug c/46045] New: incorrect code generated if redecalring local variable in do-while(0)
- Auto-submitted: auto-generated
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: unassigned@gcc.gnu.org
ReportedBy: mbuilov@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