blob: ca9637b37eb4b6d857ff0a72545a17c4d91c84e0 [file] [log] [blame]
// PR c++/100252
// { dg-do run { target c++14 } }
#define SA(X) static_assert ((X),#X)
struct A {
int x;
int y = x;
const A* p = this;
};
struct B {
int x = 42;
A a = A{x};
};
constexpr B b;
SA(b.a.p == &b.a);
SA(b.x == 42);
B b2 = { };
B b3 = { 42 };
struct C {
int x = 42;
B b = B{x};
};
constexpr C c;
C c2;
C c3;
struct D {
int x = 42;
A a = (true, A{x});
};
constexpr D d;
SA(d.a.p == &d.a);
SA(d.x == 42);
D d2 = { };
D d3 = { 42 };
struct E {
int x = 42;
A a = (A{x});
};
constexpr E e;
SA(e.a.p == &e.a);
SA(e.x == 42);
E e2 = { };
E e3 = { 42 };
struct F {
int x = 42;
A a = true ? A{x} : A{x};
};
constexpr F f;
SA (f.a.p == &f.a);
SA (e.x == 42);
F f2 = { };
F f3 = { 42 };
static void
test_b (B b4 = B{}, B b5 = B{ 42 })
{
if (b2.x != 42 || b2.a.x != 42 || b2.a.y != b2.a.x)
__builtin_abort ();
if (b3.x != 42 || b3.a.x != 42 || b3.a.y != b3.a.x)
__builtin_abort ();
if (b4.x != 42 || b4.a.x != 42 || b4.a.y != b4.a.x)
__builtin_abort ();
if (b5.x != 42 || b5.a.x != 42 || b5.a.y != b5.a.x)
__builtin_abort ();
}
static void
test_c (C c4 = C{}, C c5 = C{ 42 })
{
if (c2.b.x != 42 || c2.b.a.x != 42 || c2.b.a.y != c2.b.a.x)
__builtin_abort ();
if (c3.b.x != 42 || c3.b.a.x != 42 || c3.b.a.y != c3.b.a.x)
__builtin_abort ();
if (c4.b.x != 42 || c4.b.a.x != 42 || c4.b.a.y != c4.b.a.x)
__builtin_abort ();
if (c5.b.x != 42 || c5.b.a.x != 42 || c5.b.a.y != c5.b.a.x)
__builtin_abort ();
}
static void
test_d (D d4 = D{}, D d5 = D{ 42 })
{
if (d2.x != 42 || d2.a.x != 42 || d2.a.y != d2.a.x)
__builtin_abort ();
if (d3.x != 42 || d3.a.x != 42 || d3.a.y != d3.a.x)
__builtin_abort ();
if (d4.x != 42 || d4.a.x != 42 || d4.a.y != d4.a.x)
__builtin_abort ();
if (d5.x != 42 || d5.a.x != 42 || d5.a.y != d5.a.x)
__builtin_abort ();
}
static void
test_e (E e4 = E{}, E e5 = E{ 42 })
{
if (e2.x != 42 || e2.a.x != 42 || e2.a.y != e2.a.x)
__builtin_abort ();
if (e3.x != 42 || e3.a.x != 42 || e3.a.y != e3.a.x)
__builtin_abort ();
if (e4.x != 42 || e4.a.x != 42 || e4.a.y != e4.a.x)
__builtin_abort ();
if (e5.x != 42 || e5.a.x != 42 || e5.a.y != e5.a.x)
__builtin_abort ();
}
static void
test_f (F f4 = F{}, F f5 = F{ 42 })
{
if (f2.x != 42 || f2.a.x != 42 || f2.a.y != f2.a.x)
__builtin_abort ();
if (f3.x != 42 || f3.a.x != 42 || f3.a.y != f3.a.x)
__builtin_abort ();
if (f4.x != 42 || f4.a.x != 42 || f4.a.y != f4.a.x)
__builtin_abort ();
if (f5.x != 42 || f5.a.x != 42 || f5.a.y != f5.a.x)
__builtin_abort ();
}
int
main ()
{
test_b ();
test_c ();
test_d ();
test_e ();
test_f ();
}