// https://bugzilla.gdcproject.org/show_bug.cgi?id=198
// { dg-do run }
// { dg-skip-if "needs gcc/config.d" { ! d_runtime } }
struct S198a
{
    union
    {
        float[3] v;
        struct
        {
            float x;
            float y;
            float z;
        }
    }
    this(float x_, float y_, float z_)
    {
        x = x_;
        y = y_;
        z = z_;
    }
    ref S198a opOpAssign(string op)(S198a operand)
    if (op == "+")
    {
        x += operand.x;
        y += operand.y;
        z += operand.z;
        return this;
    }
}
struct S198b
{
    @property get()
    {
        union Buf
        {
            void[0] result;
        }
        const Buf buf = { };
        return buf.result;
    }
}
struct S198c
{
    @property get()
    {
        union Buf
        {
            TypeInfo info;
            void[0] result;
        }
        const Buf buf = { };
        return buf.result;
    }
}
void main()
{
    S198a sum = S198a(0, 0, 0);
    foreach(size_t v; 0 .. 3)
        sum += S198a(1, 2, 3);
    assert(sum.v == [3, 6, 9]);
}