GLSL: Fix #1833: Don't constant fold integer mix to a float.
diff --git a/Test/310.frag b/Test/310.frag
old mode 100644
new mode 100755
index a0525ea..8a11f67
--- a/Test/310.frag
+++ b/Test/310.frag
@@ -58,8 +58,8 @@
     b1 = mix(b2, b3, b);

     uvec3 um3 = mix(uvec3(i), uvec3(i), bvec3(b));

     ivec4 im4 = mix(ivec4(i), ivec4(i), bvec4(b));

+    1 << mix(1u, 1u, false);  // does not require folding
 }

-

 layout(binding=3) uniform sampler2D s1;

 layout(binding=3) uniform sampler2D s2; // ERROR: overlapping bindings?  Don't see that in the 310 spec.

 highp layout(binding=2) uniform writeonly image2D      i2D;

diff --git a/Test/baseResults/310.frag.out b/Test/baseResults/310.frag.out
index 6763c0a..fab3d46 100644
--- a/Test/baseResults/310.frag.out
+++ b/Test/baseResults/310.frag.out
@@ -337,6 +337,16 @@
 0:60              'i' ( uniform mediump int)
 0:60            Construct bvec4 ( temp 4-component vector of bool)
 0:60              'b' ( temp bool)
+0:61      left-shift ( temp int)
+0:61        Constant:
+0:61          1 (const int)
+0:61        mix ( global uint)
+0:61          Constant:
+0:61            1 (const uint)
+0:61          Constant:
+0:61            1 (const uint)
+0:61          Constant:
+0:61            false (const bool)
 0:98  Function Definition: foots( ( global void)
 0:98    Function Parameters: 
 0:100    Sequence
diff --git a/glslang/MachineIndependent/Constant.cpp b/glslang/MachineIndependent/Constant.cpp
old mode 100644
new mode 100755
index b75e3ef..e0f3d55
--- a/glslang/MachineIndependent/Constant.cpp
+++ b/glslang/MachineIndependent/Constant.cpp
@@ -415,8 +415,8 @@
 
     case EOpEmitStreamVertex:
     case EOpEndStreamPrimitive:
-        // These don't actually fold
-        return 0;
+        // These don't fold
+        return nullptr;
 
     case EOpPackSnorm2x16:
     case EOpPackUnorm2x16:
@@ -491,8 +491,6 @@
         break;
     }
 
-    // TODO: 3.0 Functionality: unary constant folding: the rest of the ops have to be fleshed out
-
     case EOpPackSnorm2x16:
     case EOpPackUnorm2x16:
     case EOpPackHalf2x16:
@@ -510,7 +508,7 @@
     case EOpDeterminant:
     case EOpMatrixInverse:
     case EOpTranspose:
-        return 0;
+        return nullptr;
 
     default:
         assert(componentWise);
@@ -538,7 +536,7 @@
             case EbtInt64: newConstArray[i].setI64Const(-unionArray[i].getI64Const()); break;
             case EbtUint64: newConstArray[i].setU64Const(static_cast<unsigned long long>(-static_cast<long long>(unionArray[i].getU64Const())));  break;
             default:
-                return 0;
+                return nullptr;
             }
             break;
         case EOpLogicalNot:
@@ -546,7 +544,7 @@
             switch (getType().getBasicType()) {
             case EbtBool:  newConstArray[i].setBConst(!unionArray[i].getBConst()); break;
             default:
-                return 0;
+                return nullptr;
             }
             break;
         case EOpBitwiseNot:
@@ -970,7 +968,7 @@
         case EOpInt16BitsToFloat16:
         case EOpUint16BitsToFloat16:
         default:
-            return 0;
+            return nullptr;
         }
     }
 
@@ -1201,12 +1199,17 @@
                 newConstArray[comp].setBConst(childConstUnions[0][arg0comp] != childConstUnions[1][arg1comp]);
                 break;
             case EOpMix:
-                if (children[2]->getAsTyped()->getBasicType() == EbtBool)
-                    newConstArray[comp].setDConst(childConstUnions[2][arg2comp].getBConst() ? childConstUnions[1][arg1comp].getDConst() :
-                                                                                              childConstUnions[0][arg0comp].getDConst());
-                else
-                    newConstArray[comp].setDConst(childConstUnions[0][arg0comp].getDConst() * (1.0 - childConstUnions[2][arg2comp].getDConst()) +
-                                                  childConstUnions[1][arg1comp].getDConst() *        childConstUnions[2][arg2comp].getDConst());
+                if (!children[0]->getAsTyped()->isFloatingDomain())
+                    return aggrNode;
+                if (children[2]->getAsTyped()->getBasicType() == EbtBool) {
+                    newConstArray[comp].setDConst(childConstUnions[2][arg2comp].getBConst()
+                        ? childConstUnions[1][arg1comp].getDConst()
+                        : childConstUnions[0][arg0comp].getDConst());
+                } else {
+                    newConstArray[comp].setDConst(
+                        childConstUnions[0][arg0comp].getDConst() * (1.0 - childConstUnions[2][arg2comp].getDConst()) +
+                        childConstUnions[1][arg1comp].getDConst() *        childConstUnions[2][arg2comp].getDConst());
+                }
                 break;
             case EOpStep:
                 newConstArray[comp].setDConst(childConstUnions[1][arg1comp].getDConst() < childConstUnions[0][arg0comp].getDConst() ? 0.0 : 1.0);