blob: 19a24c8ed221d3f37817874720177d8e802b1c51 [file] [log] [blame]
// PR c++/70796
// { dg-do run { target c++11 } }
// { dg-options "-fstrong-eval-order" { target c++14_down } }
struct A
{
int x = 0;
A & operator ++ () { ++x; return *this; }
};
struct B
{
A first, second;
B (A x, A y) : first{x}, second{y} {}
};
struct C
{
int first, second;
C (int x, int y) : first{x}, second{y} {}
};
struct D
{
int d;
void foo (int x, D *y)
{
if (y != this + 1)
__builtin_abort ();
d = x;
}
};
D d[2] = { { 1 }, { 2 } };
void
foo ()
{
int i = 0;
C p{++i, ++i};
if (p.first != 1 || p.second != 2)
__builtin_abort ();
}
void
bar ()
{
int i = 0;
C p{++i, ++i};
if (p.first != 1 || p.second != 2)
__builtin_abort ();
int &j = i;
C q{++j, ++j};
if (q.first != 3 || q.second != 4)
__builtin_abort ();
}
void
baz ()
{
int i = 0;
C p{(int &) ++i, (int &) ++i};
if (p.first != 1 || p.second != 2)
__builtin_abort ();
}
void
qux ()
{
A i;
B p{++i, ++i};
if (p.first.x != 1 || p.second.x != 2)
__builtin_abort ();
}
void
corge ()
{
D *p = &d[0];
p->foo (3, ++p);
if (d[0].d != 3 || d[1].d != 2)
__builtin_abort ();
}
int
main ()
{
bar ();
baz ();
foo ();
qux ();
corge ();
}