/*#pragma settings NoInline*/

uniform half4 colorRed, colorGreen;

struct S { float x; int y; };

struct Nested { S a, b; };

S returns_a_struct() {
    S s;
    s.x = 1;
    s.y = 2;
    return s;
}

S constructs_a_struct() {
    return S(2, 3);
}

float accepts_a_struct(S s) {
    return s.x + float(s.y);
}

void modifies_a_struct(inout S s) {
    s.x++;
    s.y++;
}

half4 main() {
    S s = returns_a_struct();
    float x = accepts_a_struct(s);
    modifies_a_struct(s);

    S expected = constructs_a_struct();

    Nested n1, n2, n3;
    n1.a = n1.b = returns_a_struct();
    n3 = n2 = n1;
    modifies_a_struct(n3.b);

    bool valid = (x == 3) && (s.x == 2) && (s.y == 3) &&
                 (s == expected) && (s == S(2, 3)) && (s != returns_a_struct()) &&
                 (n1 == n2) && (n1 != n3) && (n3 == Nested(S(1, 2), S(2, 3)));
    return valid ? colorGreen : colorRed;
}
