| uniform half4 colorRed, colorGreen; |
| uniform half unknownInput; |
| |
| bool test() { |
| bool expr = unknownInput > 0; |
| |
| int ok = 0, bad = 0; |
| |
| // Test boolean short-circuiting with constants on the left side. |
| if (true && expr) { ++ok; } else { ++bad; } // -> (expr) |
| if (false && expr) { ++bad; } else { ++ok; } // -> (false) -> block removed |
| if (true ^^ expr) { ++bad; } else { ++ok; } // -> unchanged |
| if (false ^^ expr) { ++ok; } else { ++bad; } // -> (expr) |
| if (true || expr) { ++ok; } else { ++bad; } // -> (true) |
| if (false || expr) { ++ok; } else { ++bad; } // -> (expr) |
| if (true == expr) { ++ok; } else { ++bad; } // -> (expr) |
| if (false == expr) { ++bad; } else { ++ok; } // -> unchanged |
| if (true != expr) { ++bad; } else { ++ok; } // -> unchanged |
| if (false != expr) { ++ok; } else { ++bad; } // -> (expr) |
| |
| // Test boolean short-circuiting with constants on the right side. |
| if (expr && true ) { ++ok; } else { ++bad; } // -> (expr) |
| if (expr && false) { ++bad; } else { ++ok; } // -> (false) -> block removed |
| if (expr ^^ true ) { ++bad; } else { ++ok; } // -> unchanged |
| if (expr ^^ false) { ++ok; } else { ++bad; } // -> (expr) |
| if (expr || true ) { ++ok; } else { ++bad; } // -> (true) |
| if (expr || false) { ++ok; } else { ++bad; } // -> (expr) |
| if (expr == true ) { ++ok; } else { ++bad; } // -> (expr) |
| if (expr == false) { ++bad; } else { ++ok; } // -> unchanged |
| if (expr != true ) { ++bad; } else { ++ok; } // -> unchanged |
| if (expr != false) { ++ok; } else { ++bad; } // -> (expr) |
| |
| // Test that side-effects in the left-side expression prevent right-side expr elimination. |
| float a = unknownInput + 2, b = unknownInput * 2; |
| |
| true || bool(a = b); // -> true |
| if (a == b) { ++bad; } else { ++ok; } |
| |
| bool(a = b) || true; // -> unchanged |
| if (a == b) { ++ok; } else { ++bad; } |
| |
| return ok == 22 && bad == 0; |
| } |
| |
| half4 main(float2 coords) { |
| return test() ? colorGreen : colorRed; |
| } |