Fix issues related to modulus operator

Make sure that "scalar %= vector" is not approved by the compiler, and
that % and %= are only exposed on GLES3.

BUG=angle:854

Change-Id: I3ac7eb607bd86a6caa905d2bef5d397688ad3fd3
Reviewed-on: https://chromium-review.googlesource.com/241410
Tested-by: Olli Etuaho <oetuaho@nvidia.com>
Reviewed-by: Gregoire Payen de La Garanderie <Gregory.Payen@imgtec.com>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
diff --git a/src/compiler/translator/IntermNode.cpp b/src/compiler/translator/IntermNode.cpp
index 782622f..49bf8cf 100644
--- a/src/compiler/translator/IntermNode.cpp
+++ b/src/compiler/translator/IntermNode.cpp
@@ -584,7 +584,8 @@
             if (!mRight->isScalar() &&
                 (mOp == EOpAddAssign ||
                 mOp == EOpSubAssign ||
-                mOp == EOpDivAssign))
+                mOp == EOpDivAssign ||
+                mOp == EOpModAssign))
                 return false;
 
             // Operator cannot be of type pure assignment.
diff --git a/src/compiler/translator/Intermediate.cpp b/src/compiler/translator/Intermediate.cpp
index 243a9ca..914b450 100644
--- a/src/compiler/translator/Intermediate.cpp
+++ b/src/compiler/translator/Intermediate.cpp
@@ -81,6 +81,7 @@
         }
         break;
       case EOpMod:
+        // Note that this is only for the % operator, not for mod()
         if (left->getBasicType() == EbtStruct || left->getBasicType() == EbtBool || left->getBasicType() == EbtFloat)
         {
             return NULL;
diff --git a/src/compiler/translator/glslang.y b/src/compiler/translator/glslang.y
index 913cc4d..c4b8f5f 100644
--- a/src/compiler/translator/glslang.y
+++ b/src/compiler/translator/glslang.y
@@ -556,6 +556,7 @@
         }
     }
     | multiplicative_expression PERCENT unary_expression {
+        ES3_ONLY("%", @2, "integer modulus operator");
         $$ = context->intermediate.addBinaryMath(EOpMod, $1, $3, @2);
         if ($$ == 0) {
             context->binaryOpError(@2, "%", $1->getCompleteString(), $3->getCompleteString());
@@ -747,7 +748,10 @@
     : EQUAL        { $$.op = EOpAssign; }
     | MUL_ASSIGN   { $$.op = EOpMulAssign; }
     | DIV_ASSIGN   { $$.op = EOpDivAssign; }
-    | MOD_ASSIGN   { $$.op = EOpModAssign; }
+    | MOD_ASSIGN   {
+        ES3_ONLY("%=", @$, "integer modulus operator");
+        $$.op = EOpModAssign;
+    }
     | ADD_ASSIGN   { $$.op = EOpAddAssign; }
     | SUB_ASSIGN   { $$.op = EOpSubAssign; }
     ;
diff --git a/src/compiler/translator/glslang_tab.cpp b/src/compiler/translator/glslang_tab.cpp
index a2de25d..891bbed 100644
--- a/src/compiler/translator/glslang_tab.cpp
+++ b/src/compiler/translator/glslang_tab.cpp
@@ -691,28 +691,28 @@
      256,   262,   265,   268,   271,   274,   284,   297,   305,   422,
      425,   433,   436,   442,   446,   453,   459,   468,   476,   479,
      489,   492,   502,   512,   534,   535,   536,   541,   542,   550,
-     558,   569,   570,   578,   589,   593,   594,   604,   614,   624,
-     637,   638,   648,   661,   665,   669,   673,   674,   687,   688,
-     701,   702,   715,   716,   733,   734,   747,   748,   749,   750,
-     751,   752,   756,   759,   770,   778,   786,   813,   819,   830,
-     834,   838,   842,   849,   905,   908,   915,   923,   944,   965,
-     975,  1003,  1008,  1018,  1023,  1033,  1036,  1039,  1042,  1048,
-    1055,  1058,  1062,  1066,  1070,  1077,  1081,  1085,  1092,  1096,
-    1100,  1107,  1116,  1122,  1125,  1131,  1137,  1144,  1153,  1162,
-    1170,  1173,  1180,  1184,  1191,  1194,  1198,  1202,  1211,  1220,
-    1228,  1238,  1250,  1253,  1256,  1262,  1269,  1272,  1278,  1281,
-    1284,  1290,  1293,  1308,  1312,  1316,  1320,  1324,  1328,  1333,
-    1338,  1343,  1348,  1353,  1358,  1363,  1368,  1373,  1378,  1383,
-    1388,  1393,  1398,  1403,  1408,  1413,  1418,  1423,  1428,  1433,
-    1437,  1441,  1445,  1449,  1453,  1457,  1461,  1465,  1469,  1473,
-    1477,  1481,  1485,  1489,  1493,  1501,  1509,  1513,  1526,  1526,
-    1529,  1529,  1535,  1538,  1554,  1557,  1566,  1570,  1576,  1583,
-    1598,  1602,  1606,  1607,  1613,  1614,  1615,  1616,  1617,  1621,
-    1622,  1622,  1622,  1632,  1633,  1637,  1637,  1638,  1638,  1643,
-    1646,  1656,  1659,  1665,  1666,  1670,  1678,  1682,  1692,  1697,
-    1714,  1714,  1719,  1719,  1726,  1726,  1734,  1737,  1743,  1746,
-    1752,  1756,  1763,  1770,  1777,  1784,  1795,  1804,  1808,  1815,
-    1818,  1824,  1824
+     558,   570,   571,   579,   590,   594,   595,   605,   615,   625,
+     638,   639,   649,   662,   666,   670,   674,   675,   688,   689,
+     702,   703,   716,   717,   734,   735,   748,   749,   750,   751,
+     755,   756,   760,   763,   774,   782,   790,   817,   823,   834,
+     838,   842,   846,   853,   909,   912,   919,   927,   948,   969,
+     979,  1007,  1012,  1022,  1027,  1037,  1040,  1043,  1046,  1052,
+    1059,  1062,  1066,  1070,  1074,  1081,  1085,  1089,  1096,  1100,
+    1104,  1111,  1120,  1126,  1129,  1135,  1141,  1148,  1157,  1166,
+    1174,  1177,  1184,  1188,  1195,  1198,  1202,  1206,  1215,  1224,
+    1232,  1242,  1254,  1257,  1260,  1266,  1273,  1276,  1282,  1285,
+    1288,  1294,  1297,  1312,  1316,  1320,  1324,  1328,  1332,  1337,
+    1342,  1347,  1352,  1357,  1362,  1367,  1372,  1377,  1382,  1387,
+    1392,  1397,  1402,  1407,  1412,  1417,  1422,  1427,  1432,  1437,
+    1441,  1445,  1449,  1453,  1457,  1461,  1465,  1469,  1473,  1477,
+    1481,  1485,  1489,  1493,  1497,  1505,  1513,  1517,  1530,  1530,
+    1533,  1533,  1539,  1542,  1558,  1561,  1570,  1574,  1580,  1587,
+    1602,  1606,  1610,  1611,  1617,  1618,  1619,  1620,  1621,  1625,
+    1626,  1626,  1626,  1636,  1637,  1641,  1641,  1642,  1642,  1647,
+    1650,  1660,  1663,  1669,  1670,  1674,  1682,  1686,  1696,  1701,
+    1718,  1718,  1723,  1723,  1730,  1730,  1738,  1741,  1747,  1750,
+    1756,  1760,  1767,  1774,  1781,  1788,  1799,  1808,  1812,  1819,
+    1822,  1828,  1828
 };
 #endif
 
@@ -2787,6 +2787,7 @@
   case 40:
 
     {
+        ES3_ONLY("%", (yylsp[-1]), "integer modulus operator");
         (yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpMod, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
         if ((yyval.interm.intermTypedNode) == 0) {
             context->binaryOpError((yylsp[-1]), "%", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(), (yyvsp[0].interm.intermTypedNode)->getCompleteString());
@@ -3084,7 +3085,10 @@
 
   case 69:
 
-    { (yyval.interm).op = EOpModAssign; }
+    {
+        ES3_ONLY("%=", (yyloc), "integer modulus operator");
+        (yyval.interm).op = EOpModAssign;
+    }
 
     break;