1cb93a386Sopenharmony_ciuniform half4 colorRed, colorGreen;
2cb93a386Sopenharmony_ciuniform half  unknownInput;
3cb93a386Sopenharmony_ci
4cb93a386Sopenharmony_cibool test() {
5cb93a386Sopenharmony_ci    bool expr = unknownInput > 0;
6cb93a386Sopenharmony_ci
7cb93a386Sopenharmony_ci    int ok = 0, bad = 0;
8cb93a386Sopenharmony_ci
9cb93a386Sopenharmony_ci    // Test boolean short-circuiting with constants on the left side.
10cb93a386Sopenharmony_ci    if (true  && expr) { ++ok; } else { ++bad; } // -> (expr)
11cb93a386Sopenharmony_ci    if (false && expr) { ++bad; } else { ++ok; } // -> (false) -> block removed
12cb93a386Sopenharmony_ci    if (true  ^^ expr) { ++bad; } else { ++ok; } // -> unchanged
13cb93a386Sopenharmony_ci    if (false ^^ expr) { ++ok; } else { ++bad; } // -> (expr)
14cb93a386Sopenharmony_ci    if (true  || expr) { ++ok; } else { ++bad; } // -> (true)
15cb93a386Sopenharmony_ci    if (false || expr) { ++ok; } else { ++bad; } // -> (expr)
16cb93a386Sopenharmony_ci    if (true  == expr) { ++ok; } else { ++bad; } // -> (expr)
17cb93a386Sopenharmony_ci    if (false == expr) { ++bad; } else { ++ok; } // -> unchanged
18cb93a386Sopenharmony_ci    if (true  != expr) { ++bad; } else { ++ok; } // -> unchanged
19cb93a386Sopenharmony_ci    if (false != expr) { ++ok; } else { ++bad; } // -> (expr)
20cb93a386Sopenharmony_ci
21cb93a386Sopenharmony_ci    // Test boolean short-circuiting with constants on the right side.
22cb93a386Sopenharmony_ci    if (expr && true ) { ++ok; } else { ++bad; } // -> (expr)
23cb93a386Sopenharmony_ci    if (expr && false) { ++bad; } else { ++ok; } // -> (false) -> block removed
24cb93a386Sopenharmony_ci    if (expr ^^ true ) { ++bad; } else { ++ok; } // -> unchanged
25cb93a386Sopenharmony_ci    if (expr ^^ false) { ++ok; } else { ++bad; } // -> (expr)
26cb93a386Sopenharmony_ci    if (expr || true ) { ++ok; } else { ++bad; } // -> (true)
27cb93a386Sopenharmony_ci    if (expr || false) { ++ok; } else { ++bad; } // -> (expr)
28cb93a386Sopenharmony_ci    if (expr == true ) { ++ok; } else { ++bad; } // -> (expr)
29cb93a386Sopenharmony_ci    if (expr == false) { ++bad; } else { ++ok; } // -> unchanged
30cb93a386Sopenharmony_ci    if (expr != true ) { ++bad; } else { ++ok; } // -> unchanged
31cb93a386Sopenharmony_ci    if (expr != false) { ++ok; } else { ++bad; } // -> (expr)
32cb93a386Sopenharmony_ci
33cb93a386Sopenharmony_ci    // Test that side-effects in the left-side expression prevent right-side expr elimination.
34cb93a386Sopenharmony_ci    float a = unknownInput + 2, b = unknownInput * 2;
35cb93a386Sopenharmony_ci
36cb93a386Sopenharmony_ci    true || bool(a = b);                         // -> true
37cb93a386Sopenharmony_ci    if (a == b) { ++bad; } else { ++ok; }
38cb93a386Sopenharmony_ci
39cb93a386Sopenharmony_ci    bool(a = b) || true;                         // -> unchanged
40cb93a386Sopenharmony_ci    if (a == b) { ++ok; } else { ++bad; }
41cb93a386Sopenharmony_ci
42cb93a386Sopenharmony_ci    return ok == 22 && bad == 0;
43cb93a386Sopenharmony_ci}
44cb93a386Sopenharmony_ci
45cb93a386Sopenharmony_cihalf4 main(float2 coords) {
46cb93a386Sopenharmony_ci    return test() ? colorGreen : colorRed;
47cb93a386Sopenharmony_ci}
48