Catch modulo by 0 errors

--
MOS_MIGRATED_REVID=91181886
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/BinaryOperatorExpression.java b/src/main/java/com/google/devtools/build/lib/syntax/BinaryOperatorExpression.java
index aa97af9..ac47b63 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/BinaryOperatorExpression.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/BinaryOperatorExpression.java
@@ -187,6 +187,9 @@
       case PERCENT: {
         // int % int
         if (lval instanceof Integer && rval instanceof Integer) {
+          if (rval.equals(0)) {
+            throw new EvalException(getLocation(), "integer modulo by zero");
+          }
           return ((Integer) lval).intValue() % ((Integer) rval).intValue();
         }
 
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java b/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java
index dc43088..a558805 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java
@@ -248,6 +248,14 @@
   }
 
   @Test
+  public void testModulo() throws Exception {
+    assertThat(eval("6 % 2")).isEqualTo(0);
+    assertThat(eval("6 % 4")).isEqualTo(2);
+    assertThat(eval("3 % 6")).isEqualTo(3);
+    checkEvalError("integer modulo by zero", "5 % 0");
+  }
+
+  @Test
   public void testMult() throws Exception {
     assertEquals(42, eval("6 * 7"));