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