diff --git a/src/GLES2/compiler/parseConst.cpp b/src/GLES2/compiler/parseConst.cpp
index f8fb6be..c864836 100644
--- a/src/GLES2/compiler/parseConst.cpp
+++ b/src/GLES2/compiler/parseConst.cpp
@@ -61,24 +61,23 @@
 {
     infoSink.info.message(EPrefixInternalError, "Symbol Node found in constant constructor", node->getLine());
     return;
-
 }
 
 bool TConstTraverser::visitBinary(Visit visit, TIntermBinary* node)
 {
     TQualifier qualifier = node->getType().getQualifier();
-    
+
     if (qualifier != EvqConst) {
         TString buf;
         buf.append("'constructor' : assigning non-constant to ");
         buf.append(type.getCompleteString());
         infoSink.info.message(EPrefixError, buf.c_str(), node->getLine());
         error = true;
-        return false;  
+        return false;
     }
 
-   infoSink.info.message(EPrefixInternalError, "Binary Node found in constant constructor", node->getLine());
-    
+    infoSink.info.message(EPrefixInternalError, "Binary Node found in constant constructor", node->getLine());
+
     return false;
 }
 
@@ -89,7 +88,7 @@
     buf.append(type.getCompleteString());
     infoSink.info.message(EPrefixError, buf.c_str(), node->getLine());
     error = true;
-    return false;  
+    return false;
 }
 
 bool TConstTraverser::visitAggregate(Visit visit, TIntermAggregate* node)
@@ -100,7 +99,7 @@
         buf.append(type.getCompleteString());
         infoSink.info.message(EPrefixError, buf.c_str(), node->getLine());
         error = true;
-        return false;  
+        return false;
     }
 
     if (node->getSequence().size() == 0) {
@@ -109,9 +108,9 @@
     }
 
     bool flag = node->getSequence().size() == 1 && node->getSequence()[0]->getAsTyped()->getAsConstantUnion();
-    if (flag) 
+    if (flag)
     {
-        singleConstantParam = true; 
+        singleConstantParam = true;
         constructorType = node->getOp();
         size = node->getType().getObjectSize();
 
@@ -119,19 +118,19 @@
             isMatrix = true;
             matrixSize = node->getType().getNominalSize();
         }
-    }       
+    }
 
-    for (TIntermSequence::iterator p = node->getSequence().begin(); 
+    for (TIntermSequence::iterator p = node->getSequence().begin();
                                    p != node->getSequence().end(); p++) {
 
         if (node->getOp() == EOpComma)
-            index = 0;           
+            index = 0;
 
         (*p)->traverse(this);
-    }   
-    if (flag) 
+    }
+    if (flag)
     {
-        singleConstantParam = false;   
+        singleConstantParam = false;
         constructorType = EOpNull;
         size = 0;
         isMatrix = false;
@@ -151,18 +150,19 @@
 {
     ConstantUnion* leftUnionArray = unionArray;
     int instanceSize = type.getObjectSize();
+    TBasicType basicType = type.getBasicType();
 
     if (index >= instanceSize)
         return;
 
     if (!singleConstantParam) {
         int size = node->getType().getObjectSize();
-    
+
         ConstantUnion *rightUnionArray = node->getUnionArrayPointer();
         for (int i=0; i < size; i++) {
             if (index >= instanceSize)
                 return;
-            leftUnionArray[index] = rightUnionArray[i];
+            leftUnionArray[index].cast(basicType, rightUnionArray[i]);
 
             (index)++;
         }
@@ -175,10 +175,10 @@
                 if (i >= instanceSize)
                     return;
 
-                leftUnionArray[i] = rightUnionArray[count];
+                leftUnionArray[i].cast(basicType, rightUnionArray[count]);
 
                 (index)++;
-                
+
                 if (node->getType().getObjectSize() > 1)
                     count++;
             }
@@ -189,14 +189,14 @@
                 if (i >= instanceSize)
                     return;
                 if (element - i == 0 || (i - element) % (matrixSize + 1) == 0 )
-                    leftUnionArray[i] = rightUnionArray[count];
-                else 
+                    leftUnionArray[i].cast(basicType, rightUnionArray[0]);
+                else
                     leftUnionArray[i].setFConst(0.0f);
 
                 (index)++;
 
                 if (node->getType().getObjectSize() > 1)
-                    count++;                
+                    count++;
             }
         }
     }
