#include <string>

template <class _Tp> class AutoPtr {
  _Tp* _M_ptr;

public:
  explicit AutoPtr(_Tp* __p = 0)  : _M_ptr(__p) {}

  ~AutoPtr() { delete _M_ptr; }

  _Tp* operator->() const  {
    return _M_ptr;
  }
};

struct A {
    virtual ~A();
    virtual A * unserialise(const std::string &s) const = 0;
};

A * wtx;

void
func(const std::string & s)
{
    AutoPtr<A> wt(wtx->unserialise(s.c_str()));
}


g++ -O -Wuninitialized -c remoteserver.cc
remoteserver.cc: In function 'void func(const std::string&)':
remoteserver.cc:9: warning: 'wt.AutoPtr<A>::_M_ptr' is used uninitialized in
this function
remoteserver.cc:26: note: 'wt.AutoPtr<A>::_M_ptr' was declared here


because in the late uninitalized variable pass we discover

<L1>:;
  save_filt.37_16 = <<<filter object>>>;
  save_eptr.36_17 = <<<exception object>>>;
  if (wt$_M_ptr_40(D) != 0B)
    goto <bb 12>;
  else
    goto <bb 13>;

<bb 12>:
  D.13202_23 = wt$_M_ptr_40(D)->_vptr.A;
  D.13203_24 = D.13202_23 + 8;
  D.13204_25 = *D.13203_24;
  OBJ_TYPE_REF(D.13204_25;wt$_M_ptr_40(D)->1) (wt$_M_ptr_40(D));

which hasn't been deleted here.  4.2 was either able to delete these BBs
or didn't create this exception region.


-- 
           Summary: [4.3 Regression] uninitialized variable warning in dead
                    exception region
           Product: gcc
           Version: 4.3.0
            Status: UNCONFIRMED
          Keywords: diagnostic
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: rguenth at gcc dot gnu dot org


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34196

Reply via email to