/*#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(float2 coords) {
    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 = returns_a_struct();
    n1.b = n1.a;
    n2 = n1;
    n3 = n2;
    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;
}
