https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61456

            Bug ID: 61456
           Summary: Unnecesary "may be used uninitialized" warning
           Product: gcc
           Version: 4.10.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: tmsriram at google dot com

This test case:

problem.cc
==========


int rand ();

class Funcs
{
public:
    int *f1 ();
    int *f2 ();
};
typedef decltype (&Funcs::f1) pfunc;

static int Set (Funcs * f, const pfunc & fp)
{
    (f->*fp) ();
}

void
Foo ()
{
    pfunc fp = &Funcs::f1;
    if (rand ())
        fp = &Funcs::f2;
    Set (0, fp);
}

compiled with trunk compiler:
g++ ./problem.cc -O2 -std=c++0x -c -Werror=uninitialized
./problem.cc: In function ‘void Foo()’:
./problem.cc:13:15: error: ‘fp.int* (Funcs::* const)()::__delta’ is used
uninitialized in this function [-Werror=uninitialized]
     (f->*fp) ();
               ^
./problem.cc:19:11: note: ‘fp.int* (Funcs::* const)()::__delta’ was declared
here
     pfunc fp = &Funcs::f1


With -fdump-tree-all, the dce1 pass is deleting the statement:
fp.__delta = 0;

even though this is later used with the following gimple sequence:
  _22 = fp.__delta;
  _24 = (struct Funcs *) _22;
  iftmp.2_25 (_24);

Reply via email to