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