blob: 8478791862ae0c6497b4cc22392729cdd5631a8c [file] [log] [blame]
// PR tree-optimization/80635
// { dg-do compile { target c++11 } }
// { dg-options "-O2 -Wmaybe-uninitialized" }
using size_t = decltype (sizeof (1));
inline void *operator new (size_t, void *p) { return p; }
template<typename T>
struct optional
{
optional () : m_dummy (), live (false) {}
void emplace () { new (&m_item) T (); live = true; }
~optional () { if (live) m_item.~T (); }
union
{
struct {} m_dummy;
T m_item;
};
bool live;
};
extern int get ();
extern void set (int);
struct A
{
A () : m (get ()) {}
~A () { set (m); } // { dg-bogus "may be used uninitialized in this function" }
int m;
};
struct B
{
B ();
~B ();
};
void func ()
{
optional<A> maybe_a;
optional<B> maybe_b;
maybe_a.emplace ();
maybe_b.emplace ();
}