1cb93a386Sopenharmony_ci/*#pragma settings NoInline*/
2cb93a386Sopenharmony_ci
3cb93a386Sopenharmony_ciuniform half4 colorRed, colorGreen;
4cb93a386Sopenharmony_ci
5cb93a386Sopenharmony_cistruct S { float x; int y; };
6cb93a386Sopenharmony_ci
7cb93a386Sopenharmony_cistruct Nested { S a, b; };
8cb93a386Sopenharmony_ci
9cb93a386Sopenharmony_cistruct Compound { float4 f4; int3 i3; };
10cb93a386Sopenharmony_ci
11cb93a386Sopenharmony_ciS returns_a_struct() {
12cb93a386Sopenharmony_ci    S s;
13cb93a386Sopenharmony_ci    s.x = 1;
14cb93a386Sopenharmony_ci    s.y = 2;
15cb93a386Sopenharmony_ci    return s;
16cb93a386Sopenharmony_ci}
17cb93a386Sopenharmony_ci
18cb93a386Sopenharmony_ciS constructs_a_struct() {
19cb93a386Sopenharmony_ci    return S(2, 3);
20cb93a386Sopenharmony_ci}
21cb93a386Sopenharmony_ci
22cb93a386Sopenharmony_cifloat accepts_a_struct(S s) {
23cb93a386Sopenharmony_ci    return s.x + float(s.y);
24cb93a386Sopenharmony_ci}
25cb93a386Sopenharmony_ci
26cb93a386Sopenharmony_civoid modifies_a_struct(inout S s) {
27cb93a386Sopenharmony_ci    s.x++;
28cb93a386Sopenharmony_ci    s.y++;
29cb93a386Sopenharmony_ci}
30cb93a386Sopenharmony_ci
31cb93a386Sopenharmony_cihalf4 main(float2 coords) {
32cb93a386Sopenharmony_ci    S s = returns_a_struct();
33cb93a386Sopenharmony_ci    float x = accepts_a_struct(s);
34cb93a386Sopenharmony_ci    modifies_a_struct(s);
35cb93a386Sopenharmony_ci
36cb93a386Sopenharmony_ci    S expected = constructs_a_struct();
37cb93a386Sopenharmony_ci
38cb93a386Sopenharmony_ci    Nested n1, n2, n3;
39cb93a386Sopenharmony_ci    n1.a = returns_a_struct();
40cb93a386Sopenharmony_ci    n1.b = n1.a;
41cb93a386Sopenharmony_ci    n2 = n1;
42cb93a386Sopenharmony_ci    n3 = n2;
43cb93a386Sopenharmony_ci    modifies_a_struct(n3.b);
44cb93a386Sopenharmony_ci
45cb93a386Sopenharmony_ci    Compound c1 = Compound(float4(1, 2, 3, 4), int3(5, 6, 7));
46cb93a386Sopenharmony_ci    Compound c2 = Compound(float4(colorGreen.g, 2, 3, 4), int3(5, 6, 7));
47cb93a386Sopenharmony_ci    Compound c3 = Compound(float4(colorGreen.r, 2, 3, 4), int3(5, 6, 7));
48cb93a386Sopenharmony_ci
49cb93a386Sopenharmony_ci    bool valid = (x == 3) && (s.x == 2) && (s.y == 3) &&
50cb93a386Sopenharmony_ci                 (s == expected) && (s == S(2, 3)) && (s != returns_a_struct()) &&
51cb93a386Sopenharmony_ci                 (n1 == n2) && (n1 != n3) && (n3 == Nested(S(1, 2), S(2, 3))) &&
52cb93a386Sopenharmony_ci                 (c1 == c2) && (c2 != c3);
53cb93a386Sopenharmony_ci
54cb93a386Sopenharmony_ci    return valid ? colorGreen : colorRed;
55cb93a386Sopenharmony_ci}
56