diff options
-rw-r--r-- | src/sksl/SkSLIRGenerator.cpp | 14 | ||||
-rw-r--r-- | tests/SkSLErrorTest.cpp | 15 |
2 files changed, 27 insertions, 2 deletions
diff --git a/src/sksl/SkSLIRGenerator.cpp b/src/sksl/SkSLIRGenerator.cpp index 06988173aa..0f035af32e 100644 --- a/src/sksl/SkSLIRGenerator.cpp +++ b/src/sksl/SkSLIRGenerator.cpp @@ -876,7 +876,12 @@ std::unique_ptr<Expression> IRGenerator::constantFold(const Expression& left, case Token::PLUS: return RESULT(Int, +); case Token::MINUS: return RESULT(Int, -); case Token::STAR: return RESULT(Int, *); - case Token::SLASH: return RESULT(Int, /); + case Token::SLASH: + if (rightVal) { + return RESULT(Int, /); + } + fErrors.error(right.fPosition, "division by zero"); + return nullptr; case Token::PERCENT: return RESULT(Int, %); case Token::BITWISEAND: return RESULT(Int, &); case Token::BITWISEOR: return RESULT(Int, |); @@ -900,7 +905,12 @@ std::unique_ptr<Expression> IRGenerator::constantFold(const Expression& left, case Token::PLUS: return RESULT(Float, +); case Token::MINUS: return RESULT(Float, -); case Token::STAR: return RESULT(Float, *); - case Token::SLASH: return RESULT(Float, /); + case Token::SLASH: + if (rightVal) { + return RESULT(Float, /); + } + fErrors.error(right.fPosition, "division by zero"); + return nullptr; case Token::EQEQ: return RESULT(Bool, ==); case Token::NEQ: return RESULT(Bool, !=); case Token::GT: return RESULT(Bool, >); diff --git a/tests/SkSLErrorTest.cpp b/tests/SkSLErrorTest.cpp index e872977eeb..4dd92f3e77 100644 --- a/tests/SkSLErrorTest.cpp +++ b/tests/SkSLErrorTest.cpp @@ -400,4 +400,19 @@ DEF_TEST(SkSLBadOffset, r) { "error: 1: offset of field 'y' must be at least 4\n1 error\n"); } +DEF_TEST(SkSLDivByZero, r) { + test_failure(r, + "int x = 1 / 0;", + "error: 1: division by zero\n1 error\n"); + test_failure(r, + "float x = 1 / 0;", + "error: 1: division by zero\n1 error\n"); + test_failure(r, + "float x = 1.0 / 0.0;", + "error: 1: division by zero\n1 error\n"); + test_failure(r, + "float x = -67.0 / (3.0 - 3);", + "error: 1: division by zero\n1 error\n"); +} + #endif |