aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/sksl/SkSLIRGenerator.cpp14
-rw-r--r--tests/SkSLErrorTest.cpp15
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