This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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: 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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]