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

--- Comment #15 from Martin Sebor <msebor at gcc dot gnu.org> ---
I think the following smaller test case independent of libstdc++ captures the
same issue as the bigger test case in comment #4.  Again, declaring f()
noexcept avoids the warning (but it's not a solution in general).  Zero
initializing A::i first and then setting it to the result of f() also avoids
the warning and seems like more viable solution/workaround until GCC gets
smarter about exceptions.

$ cat pr80635.C && gcc -O2 -S -Wall pr80635.C
void* operator new (__SIZE_TYPE__, void *p) { return p; }

int f ();
int x;

struct A {
  int i;
  A (): i (f ()) { }
  ~A () { x = i; }
};

struct B {
  B ();
  ~B ();
};


template <class T>
struct C {
  C (): t (), b () { }
  ~C () { if (b) t.~T (); }

  void f () {
    new (&t) T ();
    b = true;
  }

  union {
    T t;
    char x[sizeof (T)];
  };
  bool b;
};

void g ()
{
  C<A> c1;
  C<B> c2;

  c1.f ();
  c2.f ();
}
pr80635.C: In function ‘void g()’:
pr80635.C:9:13: warning: ‘c1.A::i’ may be used uninitialized in this function
[-Wmaybe-uninitialized]
    9 |   ~A () { x = i; }
      |           ~~^~~
pr80635.C:37:8: note: ‘c1.A::i’ was declared here
   37 |   C<A> c1;
      |        ^~

Reply via email to