diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp
index 7603c38021bf158ee727195afc93863988de1ec8..c283529e032673bca50ee88e27a02e0876ae1852 100644
--- a/SPIRV/GlslangToSpv.cpp
+++ b/SPIRV/GlslangToSpv.cpp
@@ -126,6 +126,9 @@ public:
     void dumpSpv(std::vector<unsigned int>& out);
 
 protected:
+    TGlslangToSpvTraverser(TGlslangToSpvTraverser&);
+    TGlslangToSpvTraverser& operator=(TGlslangToSpvTraverser&);
+
     spv::Decoration TranslateInterpolationDecoration(const glslang::TQualifier& qualifier);
     spv::Decoration TranslateAuxiliaryStorageDecoration(const glslang::TQualifier& qualifier);
     spv::BuiltIn TranslateBuiltInDecoration(glslang::TBuiltInVariable, bool memberDeclaration);
@@ -153,7 +156,8 @@ protected:
     glslang::TLayoutPacking getExplicitLayout(const glslang::TType& type) const;
     int getArrayStride(const glslang::TType& arrayType, glslang::TLayoutPacking, glslang::TLayoutMatrix);
     int getMatrixStride(const glslang::TType& matrixType, glslang::TLayoutPacking, glslang::TLayoutMatrix);
-    void updateMemberOffset(const glslang::TType& structType, const glslang::TType& memberType, int& currentOffset, int& nextOffset, glslang::TLayoutPacking, glslang::TLayoutMatrix);
+    void updateMemberOffset(const glslang::TType& structType, const glslang::TType& memberType, int& currentOffset,
+                            int& nextOffset, glslang::TLayoutPacking, glslang::TLayoutMatrix);
     void declareUseOfStructMember(const glslang::TTypeList& members, int glslangMember);
 
     bool isShaderEntryPoint(const glslang::TIntermAggregate* node);
@@ -182,10 +186,6 @@ protected:
     spv::Id createMiscOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId, std::vector<spv::Id>& operands, glslang::TBasicType typeProxy);
     spv::Id createNoArgOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId);
     spv::Id getSymbolId(const glslang::TIntermSymbol* node);
-    void addDecoration(spv::Id id, spv::Decoration dec);
-    void addDecoration(spv::Id id, spv::Decoration dec, unsigned value);
-    void addMemberDecoration(spv::Id id, int member, spv::Decoration dec);
-    void addMemberDecoration(spv::Id id, int member, spv::Decoration dec, unsigned value);
     spv::Id createSpvConstant(const glslang::TIntermTyped&);
     spv::Id createSpvConstantFromConstUnionArray(const glslang::TType& type, const glslang::TConstUnionArray&, int& nextConst, bool specConstant);
     bool isTrivialLeaf(const glslang::TIntermTyped* node);
@@ -222,8 +222,10 @@ protected:
     std::unordered_set<int> rValueParameters;  // set of formal function parameters passed as rValues, rather than a pointer
     std::unordered_map<std::string, spv::Function*> functionMap;
     std::unordered_map<const glslang::TTypeList*, spv::Id> structMap[glslang::ElpCount][glslang::ElmCount];
-    std::unordered_map<const glslang::TTypeList*, std::vector<int> > memberRemapper;  // for mapping glslang block indices to spv indices (e.g., due to hidden members)
+    // for mapping glslang block indices to spv indices (e.g., due to hidden members):
+    std::unordered_map<const glslang::TTypeList*, std::vector<int> > memberRemapper;
     std::stack<bool> breakForLoop;  // false means break for switch
+    std::unordered_map<std::string, const glslang::TIntermSymbol*> counterOriginator;
 };
 
 //
@@ -1195,6 +1197,36 @@ void TGlslangToSpvTraverser::visitSymbol(glslang::TIntermSymbol* symbol)
         else
             builder.setAccessChainLValue(id);
     }
+
+    // Process linkage-only nodes for any special additional interface work.
+    if (linkageOnly) {
+        if (glslangIntermediate->getHlslFunctionality1()) {
+            // Map implicit counter buffers to their originating buffers, which should have been
+            // seen by now, given earlier pruning of unused counters, and preservation of order
+            // of declaration.
+            if (symbol->getType().getQualifier().isUniformOrBuffer()) {
+                if (!glslangIntermediate->hasCounterBufferName(symbol->getName())) {
+                    // Save possible originating buffers for counter buffers, keyed by
+                    // making the potential counter-buffer name.
+                    std::string keyName = symbol->getName().c_str();
+                    keyName = glslangIntermediate->addCounterBufferName(keyName);
+                    counterOriginator[keyName] = symbol;
+                } else {
+                    // Handle a counter buffer, by finding the saved originating buffer.
+                    std::string keyName = symbol->getName().c_str();
+                    auto it = counterOriginator.find(keyName);
+                    if (it != counterOriginator.end()) {
+                        id = getSymbolId(it->second);
+                        if (id != spv::NoResult) {
+                            spv::Id counterId = getSymbolId(symbol);
+                            if (counterId != spv::NoResult)
+                                builder.addDecorationId(id, spv::DecorationHlslCounterBufferGOOGLE, counterId);
+                        }
+                    }
+                }
+            }
+        }
+    }
 }
 
 bool TGlslangToSpvTraverser::visitBinary(glslang::TVisit /* visit */, glslang::TIntermBinary* node)
@@ -2709,89 +2741,102 @@ void TGlslangToSpvTraverser::decorateStructType(const glslang::TType& type,
         InheritQualifiers(memberQualifier, qualifier);
 
         // using -1 above to indicate a hidden member
-        if (member >= 0) {
-            builder.addMemberName(spvType, member, glslangMember.getFieldName().c_str());
-            addMemberDecoration(spvType, member, TranslateLayoutDecoration(glslangMember, memberQualifier.layoutMatrix));
-            addMemberDecoration(spvType, member, TranslatePrecisionDecoration(glslangMember));
-            // Add interpolation and auxiliary storage decorations only to top-level members of Input and Output storage classes
-            if (type.getQualifier().storage == glslang::EvqVaryingIn ||
-                type.getQualifier().storage == glslang::EvqVaryingOut) {
-                if (type.getBasicType() == glslang::EbtBlock ||
-                    glslangIntermediate->getSource() == glslang::EShSourceHlsl) {
-                    addMemberDecoration(spvType, member, TranslateInterpolationDecoration(memberQualifier));
-                    addMemberDecoration(spvType, member, TranslateAuxiliaryStorageDecoration(memberQualifier));
-                }
-            }
-            addMemberDecoration(spvType, member, TranslateInvariantDecoration(memberQualifier));
-
-            if (type.getBasicType() == glslang::EbtBlock &&
-                qualifier.storage == glslang::EvqBuffer) {
-                // Add memory decorations only to top-level members of shader storage block
-                std::vector<spv::Decoration> memory;
-                TranslateMemoryDecoration(memberQualifier, memory);
-                for (unsigned int i = 0; i < memory.size(); ++i)
-                    addMemberDecoration(spvType, member, memory[i]);
-            }
+        if (member < 0)
+            continue;
 
-            // Location assignment was already completed correctly by the front end,
-            // just track whether a member needs to be decorated.
-            // Ignore member locations if the container is an array, as that's
-            // ill-specified and decisions have been made to not allow this.
-            if (! type.isArray() && memberQualifier.hasLocation())
-                builder.addMemberDecoration(spvType, member, spv::DecorationLocation, memberQualifier.layoutLocation);
-
-            if (qualifier.hasLocation())      // track for upcoming inheritance
-                locationOffset += glslangIntermediate->computeTypeLocationSize(
-                                                glslangMember, glslangIntermediate->getStage());
-
-            // component, XFB, others
-            if (glslangMember.getQualifier().hasComponent())
-                builder.addMemberDecoration(spvType, member, spv::DecorationComponent, glslangMember.getQualifier().layoutComponent);
-            if (glslangMember.getQualifier().hasXfbOffset())
-                builder.addMemberDecoration(spvType, member, spv::DecorationOffset, glslangMember.getQualifier().layoutXfbOffset);
-            else if (explicitLayout != glslang::ElpNone) {
-                // figure out what to do with offset, which is accumulating
-                int nextOffset;
-                updateMemberOffset(type, glslangMember, offset, nextOffset, explicitLayout, memberQualifier.layoutMatrix);
-                if (offset >= 0)
-                    builder.addMemberDecoration(spvType, member, spv::DecorationOffset, offset);
-                offset = nextOffset;
+        builder.addMemberName(spvType, member, glslangMember.getFieldName().c_str());
+        builder.addMemberDecoration(spvType, member,
+                                    TranslateLayoutDecoration(glslangMember, memberQualifier.layoutMatrix));
+        builder.addMemberDecoration(spvType, member, TranslatePrecisionDecoration(glslangMember));
+        // Add interpolation and auxiliary storage decorations only to
+        // top-level members of Input and Output storage classes
+        if (type.getQualifier().storage == glslang::EvqVaryingIn ||
+            type.getQualifier().storage == glslang::EvqVaryingOut) {
+            if (type.getBasicType() == glslang::EbtBlock ||
+                glslangIntermediate->getSource() == glslang::EShSourceHlsl) {
+                builder.addMemberDecoration(spvType, member, TranslateInterpolationDecoration(memberQualifier));
+                builder.addMemberDecoration(spvType, member, TranslateAuxiliaryStorageDecoration(memberQualifier));
             }
+        }
+        builder.addMemberDecoration(spvType, member, TranslateInvariantDecoration(memberQualifier));
+
+        if (type.getBasicType() == glslang::EbtBlock &&
+            qualifier.storage == glslang::EvqBuffer) {
+            // Add memory decorations only to top-level members of shader storage block
+            std::vector<spv::Decoration> memory;
+            TranslateMemoryDecoration(memberQualifier, memory);
+            for (unsigned int i = 0; i < memory.size(); ++i)
+                builder.addMemberDecoration(spvType, member, memory[i]);
+        }
+
+        // Location assignment was already completed correctly by the front end,
+        // just track whether a member needs to be decorated.
+        // Ignore member locations if the container is an array, as that's
+        // ill-specified and decisions have been made to not allow this.
+        if (! type.isArray() && memberQualifier.hasLocation())
+            builder.addMemberDecoration(spvType, member, spv::DecorationLocation, memberQualifier.layoutLocation);
+
+        if (qualifier.hasLocation())      // track for upcoming inheritance
+            locationOffset += glslangIntermediate->computeTypeLocationSize(
+                                            glslangMember, glslangIntermediate->getStage());
+
+        // component, XFB, others
+        if (glslangMember.getQualifier().hasComponent())
+            builder.addMemberDecoration(spvType, member, spv::DecorationComponent,
+                                        glslangMember.getQualifier().layoutComponent);
+        if (glslangMember.getQualifier().hasXfbOffset())
+            builder.addMemberDecoration(spvType, member, spv::DecorationOffset,
+                                        glslangMember.getQualifier().layoutXfbOffset);
+        else if (explicitLayout != glslang::ElpNone) {
+            // figure out what to do with offset, which is accumulating
+            int nextOffset;
+            updateMemberOffset(type, glslangMember, offset, nextOffset, explicitLayout, memberQualifier.layoutMatrix);
+            if (offset >= 0)
+                builder.addMemberDecoration(spvType, member, spv::DecorationOffset, offset);
+            offset = nextOffset;
+        }
 
-            if (glslangMember.isMatrix() && explicitLayout != glslang::ElpNone)
-                builder.addMemberDecoration(spvType, member, spv::DecorationMatrixStride, getMatrixStride(glslangMember, explicitLayout, memberQualifier.layoutMatrix));
+        if (glslangMember.isMatrix() && explicitLayout != glslang::ElpNone)
+            builder.addMemberDecoration(spvType, member, spv::DecorationMatrixStride,
+                                        getMatrixStride(glslangMember, explicitLayout, memberQualifier.layoutMatrix));
 
-            // built-in variable decorations
-            spv::BuiltIn builtIn = TranslateBuiltInDecoration(glslangMember.getQualifier().builtIn, true);
-            if (builtIn != spv::BuiltInMax)
-                addMemberDecoration(spvType, member, spv::DecorationBuiltIn, (int)builtIn);
+        // built-in variable decorations
+        spv::BuiltIn builtIn = TranslateBuiltInDecoration(glslangMember.getQualifier().builtIn, true);
+        if (builtIn != spv::BuiltInMax)
+            builder.addMemberDecoration(spvType, member, spv::DecorationBuiltIn, (int)builtIn);
 
 #ifdef NV_EXTENSIONS
-            if (builtIn == spv::BuiltInLayer) {
-                // SPV_NV_viewport_array2 extension
-                if (glslangMember.getQualifier().layoutViewportRelative){
-                    addMemberDecoration(spvType, member, (spv::Decoration)spv::DecorationViewportRelativeNV);
-                    builder.addCapability(spv::CapabilityShaderViewportMaskNV);
-                    builder.addExtension(spv::E_SPV_NV_viewport_array2);
-                }
-                if (glslangMember.getQualifier().layoutSecondaryViewportRelativeOffset != -2048){
-                    addMemberDecoration(spvType, member, (spv::Decoration)spv::DecorationSecondaryViewportRelativeNV, glslangMember.getQualifier().layoutSecondaryViewportRelativeOffset);
-                    builder.addCapability(spv::CapabilityShaderStereoViewNV);
-                    builder.addExtension(spv::E_SPV_NV_stereo_view_rendering);
-                }
+        if (builtIn == spv::BuiltInLayer) {
+            // SPV_NV_viewport_array2 extension
+            if (glslangMember.getQualifier().layoutViewportRelative){
+                builder.addMemberDecoration(spvType, member, (spv::Decoration)spv::DecorationViewportRelativeNV);
+                builder.addCapability(spv::CapabilityShaderViewportMaskNV);
+                builder.addExtension(spv::E_SPV_NV_viewport_array2);
             }
-            if (glslangMember.getQualifier().layoutPassthrough) {
-                addMemberDecoration(spvType, member, (spv::Decoration)spv::DecorationPassthroughNV);
-                builder.addCapability(spv::CapabilityGeometryShaderPassthroughNV);
-                builder.addExtension(spv::E_SPV_NV_geometry_shader_passthrough);
+            if (glslangMember.getQualifier().layoutSecondaryViewportRelativeOffset != -2048){
+                builder.addMemberDecoration(spvType, member,
+                                            (spv::Decoration)spv::DecorationSecondaryViewportRelativeNV,
+                                            glslangMember.getQualifier().layoutSecondaryViewportRelativeOffset);
+                builder.addCapability(spv::CapabilityShaderStereoViewNV);
+                builder.addExtension(spv::E_SPV_NV_stereo_view_rendering);
             }
+        }
+        if (glslangMember.getQualifier().layoutPassthrough) {
+            builder.addMemberDecoration(spvType, member, (spv::Decoration)spv::DecorationPassthroughNV);
+            builder.addCapability(spv::CapabilityGeometryShaderPassthroughNV);
+            builder.addExtension(spv::E_SPV_NV_geometry_shader_passthrough);
+        }
 #endif
+        if (glslangIntermediate->getHlslFunctionality1() && memberQualifier.semanticName != nullptr) {
+            builder.addExtension("SPV_GOOGLE_hlsl_functionality1");
+            builder.addMemberDecoration(spvType, member, (spv::Decoration)spv::DecorationHlslSemanticGOOGLE,
+                                        memberQualifier.semanticName);
         }
     }
 
     // Decorate the structure
-    addDecoration(spvType, TranslateLayoutDecoration(type, qualifier.layoutMatrix));
-    addDecoration(spvType, TranslateBlockDecoration(type, glslangIntermediate->usingStorageBuffer()));
+    builder.addDecoration(spvType, TranslateLayoutDecoration(type, qualifier.layoutMatrix));
+    builder.addDecoration(spvType, TranslateBlockDecoration(type, glslangIntermediate->usingStorageBuffer()));
     if (type.getQualifier().hasStream() && glslangIntermediate->isMultiStream()) {
         builder.addCapability(spv::CapabilityGeometryStreams);
         builder.addDecoration(spvType, spv::DecorationStream, type.getQualifier().layoutStream);
@@ -4037,7 +4082,7 @@ spv::Id TGlslangToSpvTraverser::createBinaryOperation(glslang::TOperator op, spv
             builder.promoteScalar(precision, left, right);
 
         spv::Id result = builder.createBinOp(binOp, typeId, left, right);
-        addDecoration(result, noContraction);
+        builder.addDecoration(result, noContraction);
         return builder.setPrecision(result, precision);
     }
 
@@ -4107,7 +4152,7 @@ spv::Id TGlslangToSpvTraverser::createBinaryOperation(glslang::TOperator op, spv
 
     if (binOp != spv::OpNop) {
         spv::Id result = builder.createBinOp(binOp, typeId, left, right);
-        addDecoration(result, noContraction);
+        builder.addDecoration(result, noContraction);
         return builder.setPrecision(result, precision);
     }
 
@@ -4137,7 +4182,8 @@ spv::Id TGlslangToSpvTraverser::createBinaryMatrixOperation(spv::Op op, spv::Dec
     case spv::OpFDiv:
         if (builder.isMatrix(left) && builder.isScalar(right)) {
             // turn matrix / scalar into a multiply...
-            right = builder.createBinOp(spv::OpFDiv, builder.getTypeId(right), builder.makeFloatConstant(1.0F), right);
+            spv::Id resultType = builder.getTypeId(right);
+            right = builder.createBinOp(spv::OpFDiv, resultType, builder.makeFpConstant(resultType, 1.0), right);
             op = spv::OpMatrixTimesScalar;
         } else
             firstClass = false;
@@ -4166,7 +4212,7 @@ spv::Id TGlslangToSpvTraverser::createBinaryMatrixOperation(spv::Op op, spv::Dec
 
     if (firstClass) {
         spv::Id result = builder.createBinOp(op, typeId, left, right);
-        addDecoration(result, noContraction);
+        builder.addDecoration(result, noContraction);
         return builder.setPrecision(result, precision);
     }
 
@@ -4205,7 +4251,7 @@ spv::Id TGlslangToSpvTraverser::createBinaryMatrixOperation(spv::Op op, spv::Dec
             spv::Id  leftVec =  leftMat ? builder.createCompositeExtract( left, vecType, indexes) : smearVec;
             spv::Id rightVec = rightMat ? builder.createCompositeExtract(right, vecType, indexes) : smearVec;
             spv::Id result = builder.createBinOp(op, vecType, leftVec, rightVec);
-            addDecoration(result, noContraction);
+            builder.addDecoration(result, noContraction);
             results.push_back(builder.setPrecision(result, precision));
         }
 
@@ -4610,7 +4656,7 @@ spv::Id TGlslangToSpvTraverser::createUnaryOperation(glslang::TOperator op, spv:
         id = builder.createUnaryOp(unaryOp, typeId, operand);
     }
 
-    addDecoration(id, noContraction);
+    builder.addDecoration(id, noContraction);
     return builder.setPrecision(id, precision);
 }
 
@@ -4637,7 +4683,7 @@ spv::Id TGlslangToSpvTraverser::createUnaryMatrixOperation(spv::Op op, spv::Deco
         indexes.push_back(c);
         spv::Id srcVec  = builder.createCompositeExtract(operand, srcVecType, indexes);
         spv::Id destVec = builder.createUnaryOp(op, destVecType, srcVec);
-        addDecoration(destVec, noContraction);
+        builder.addDecoration(destVec, noContraction);
         results.push_back(builder.setPrecision(destVec, precision));
     }
 
@@ -6146,11 +6192,11 @@ spv::Id TGlslangToSpvTraverser::getSymbolId(const glslang::TIntermSymbol* symbol
     symbolValues[symbol->getId()] = id;
 
     if (symbol->getBasicType() != glslang::EbtBlock) {
-        addDecoration(id, TranslatePrecisionDecoration(symbol->getType()));
-        addDecoration(id, TranslateInterpolationDecoration(symbol->getType().getQualifier()));
-        addDecoration(id, TranslateAuxiliaryStorageDecoration(symbol->getType().getQualifier()));
+        builder.addDecoration(id, TranslatePrecisionDecoration(symbol->getType()));
+        builder.addDecoration(id, TranslateInterpolationDecoration(symbol->getType().getQualifier()));
+        builder.addDecoration(id, TranslateAuxiliaryStorageDecoration(symbol->getType().getQualifier()));
         if (symbol->getType().getQualifier().hasSpecConstantId())
-            addDecoration(id, spv::DecorationSpecId, symbol->getType().getQualifier().layoutSpecConstantId);
+            builder.addDecoration(id, spv::DecorationSpecId, symbol->getType().getQualifier().layoutSpecConstantId);
         if (symbol->getQualifier().hasIndex())
             builder.addDecoration(id, spv::DecorationIndex, symbol->getQualifier().layoutIndex);
         if (symbol->getQualifier().hasComponent())
@@ -6162,7 +6208,7 @@ spv::Id TGlslangToSpvTraverser::getSymbolId(const glslang::TIntermSymbol* symbol
 
     if (symbol->getQualifier().hasLocation())
         builder.addDecoration(id, spv::DecorationLocation, symbol->getQualifier().layoutLocation);
-    addDecoration(id, TranslateInvariantDecoration(symbol->getType().getQualifier()));
+    builder.addDecoration(id, TranslateInvariantDecoration(symbol->getType().getQualifier()));
     if (symbol->getQualifier().hasStream() && glslangIntermediate->isMultiStream()) {
         builder.addCapability(spv::CapabilityGeometryStreams);
         builder.addDecoration(id, spv::DecorationStream, symbol->getQualifier().layoutStream);
@@ -6195,13 +6241,13 @@ spv::Id TGlslangToSpvTraverser::getSymbolId(const glslang::TIntermSymbol* symbol
         std::vector<spv::Decoration> memory;
         TranslateMemoryDecoration(symbol->getType().getQualifier(), memory);
         for (unsigned int i = 0; i < memory.size(); ++i)
-            addDecoration(id, memory[i]);
+            builder.addDecoration(id, memory[i]);
     }
 
     // built-in variable decorations
     spv::BuiltIn builtIn = TranslateBuiltInDecoration(symbol->getQualifier().builtIn, false);
     if (builtIn != spv::BuiltInMax)
-        addDecoration(id, spv::DecorationBuiltIn, (int)builtIn);
+        builder.addDecoration(id, spv::DecorationBuiltIn, (int)builtIn);
 
 #ifdef NV_EXTENSIONS
     if (builtIn == spv::BuiltInSampleMask) {
@@ -6211,7 +6257,7 @@ spv::Id TGlslangToSpvTraverser::getSymbolId(const glslang::TIntermSymbol* symbol
               decoration = (spv::Decoration)spv::DecorationOverrideCoverageNV;
           else
               decoration = (spv::Decoration)spv::DecorationMax;
-        addDecoration(id, decoration);
+        builder.addDecoration(id, decoration);
         if (decoration != spv::DecorationMax) {
             builder.addExtension(spv::E_SPV_NV_sample_mask_override_coverage);
         }
@@ -6219,53 +6265,32 @@ spv::Id TGlslangToSpvTraverser::getSymbolId(const glslang::TIntermSymbol* symbol
     else if (builtIn == spv::BuiltInLayer) {
         // SPV_NV_viewport_array2 extension
         if (symbol->getQualifier().layoutViewportRelative) {
-            addDecoration(id, (spv::Decoration)spv::DecorationViewportRelativeNV);
+            builder.addDecoration(id, (spv::Decoration)spv::DecorationViewportRelativeNV);
             builder.addCapability(spv::CapabilityShaderViewportMaskNV);
             builder.addExtension(spv::E_SPV_NV_viewport_array2);
         }
         if (symbol->getQualifier().layoutSecondaryViewportRelativeOffset != -2048) {
-            addDecoration(id, (spv::Decoration)spv::DecorationSecondaryViewportRelativeNV, symbol->getQualifier().layoutSecondaryViewportRelativeOffset);
+            builder.addDecoration(id, (spv::Decoration)spv::DecorationSecondaryViewportRelativeNV,
+                                  symbol->getQualifier().layoutSecondaryViewportRelativeOffset);
             builder.addCapability(spv::CapabilityShaderStereoViewNV);
             builder.addExtension(spv::E_SPV_NV_stereo_view_rendering);
         }
     }
 
     if (symbol->getQualifier().layoutPassthrough) {
-        addDecoration(id, spv::DecorationPassthroughNV);
+        builder.addDecoration(id, spv::DecorationPassthroughNV);
         builder.addCapability(spv::CapabilityGeometryShaderPassthroughNV);
         builder.addExtension(spv::E_SPV_NV_geometry_shader_passthrough);
     }
 #endif
 
-    return id;
-}
-
-// If 'dec' is valid, add no-operand decoration to an object
-void TGlslangToSpvTraverser::addDecoration(spv::Id id, spv::Decoration dec)
-{
-    if (dec != spv::DecorationMax)
-        builder.addDecoration(id, dec);
-}
-
-// If 'dec' is valid, add a one-operand decoration to an object
-void TGlslangToSpvTraverser::addDecoration(spv::Id id, spv::Decoration dec, unsigned value)
-{
-    if (dec != spv::DecorationMax)
-        builder.addDecoration(id, dec, value);
-}
-
-// If 'dec' is valid, add a no-operand decoration to a struct member
-void TGlslangToSpvTraverser::addMemberDecoration(spv::Id id, int member, spv::Decoration dec)
-{
-    if (dec != spv::DecorationMax)
-        builder.addMemberDecoration(id, (unsigned)member, dec);
-}
+    if (glslangIntermediate->getHlslFunctionality1() && symbol->getType().getQualifier().semanticName != nullptr) {
+        builder.addExtension("SPV_GOOGLE_hlsl_functionality1");
+        builder.addDecoration(id, (spv::Decoration)spv::DecorationHlslSemanticGOOGLE,
+                              symbol->getType().getQualifier().semanticName);
+    }
 
-// If 'dec' is valid, add a one-operand decoration to a struct member
-void TGlslangToSpvTraverser::addMemberDecoration(spv::Id id, int member, spv::Decoration dec, unsigned value)
-{
-    if (dec != spv::DecorationMax)
-        builder.addMemberDecoration(id, (unsigned)member, dec, value);
+    return id;
 }
 
 // Make a full tree of instructions to build a SPIR-V specialization constant,
@@ -6300,8 +6325,10 @@ spv::Id TGlslangToSpvTraverser::createSpvConstant(const glslang::TIntermTyped& n
         for (int dim = 0; dim < 3; ++dim) {
             bool specConst = (glslangIntermediate->getLocalSizeSpecId(dim) != glslang::TQualifier::layoutNotSet);
             dimConstId.push_back(builder.makeUintConstant(glslangIntermediate->getLocalSize(dim), specConst));
-            if (specConst)
-                addDecoration(dimConstId.back(), spv::DecorationSpecId, glslangIntermediate->getLocalSizeSpecId(dim));
+            if (specConst) {
+                builder.addDecoration(dimConstId.back(), spv::DecorationSpecId,
+                                      glslangIntermediate->getLocalSizeSpecId(dim));
+            }
         }
         return builder.makeCompositeConstant(builder.makeVectorType(builder.makeUintType(32), 3), dimConstId, true);
     }
diff --git a/SPIRV/SpvBuilder.cpp b/SPIRV/SpvBuilder.cpp
index 10d0d501f0bab6025934c0756bafbee830387a20..dfeae871558fb33988af9748dc693fab23c03ac3 100644
--- a/SPIRV/SpvBuilder.cpp
+++ b/SPIRV/SpvBuilder.cpp
@@ -848,6 +848,25 @@ Id Builder::makeFloat16Constant(float f16, bool specConstant)
     return c->getResultId();
 }
 
+Id Builder::makeFpConstant(Id type, double d, bool specConstant)
+{
+        assert(isFloatType(type));
+
+        switch (getScalarTypeWidth(type)) {
+        case 16:
+                return makeFloat16Constant(d, specConstant);
+        case 32:
+                return makeFloatConstant(d, specConstant);
+        case 64:
+                return makeDoubleConstant(d, specConstant);
+        default:
+                break;
+        }
+
+        assert(false);
+        return NoResult;
+}
+
 Id Builder::findCompositeConstant(Op typeClass, const std::vector<Id>& comps)
 {
     Instruction* constant = 0;
@@ -993,6 +1012,7 @@ void Builder::addDecoration(Id id, Decoration decoration, int num)
 {
     if (decoration == spv::DecorationMax)
         return;
+
     Instruction* dec = new Instruction(OpDecorate);
     dec->addIdOperand(id);
     dec->addImmediateOperand(decoration);
@@ -1002,8 +1022,37 @@ void Builder::addDecoration(Id id, Decoration decoration, int num)
     decorations.push_back(std::unique_ptr<Instruction>(dec));
 }
 
+void Builder::addDecoration(Id id, Decoration decoration, const char* s)
+{
+    if (decoration == spv::DecorationMax)
+        return;
+
+    Instruction* dec = new Instruction(OpDecorateStringGOOGLE);
+    dec->addIdOperand(id);
+    dec->addImmediateOperand(decoration);
+    dec->addStringOperand(s);
+
+    decorations.push_back(std::unique_ptr<Instruction>(dec));
+}
+
+void Builder::addDecorationId(Id id, Decoration decoration, Id idDecoration)
+{
+    if (decoration == spv::DecorationMax)
+        return;
+
+    Instruction* dec = new Instruction(OpDecorateId);
+    dec->addIdOperand(id);
+    dec->addImmediateOperand(decoration);
+    dec->addIdOperand(idDecoration);
+
+    decorations.push_back(std::unique_ptr<Instruction>(dec));
+}
+
 void Builder::addMemberDecoration(Id id, unsigned int member, Decoration decoration, int num)
 {
+    if (decoration == spv::DecorationMax)
+        return;
+
     Instruction* dec = new Instruction(OpMemberDecorate);
     dec->addIdOperand(id);
     dec->addImmediateOperand(member);
@@ -1014,6 +1063,20 @@ void Builder::addMemberDecoration(Id id, unsigned int member, Decoration decorat
     decorations.push_back(std::unique_ptr<Instruction>(dec));
 }
 
+void Builder::addMemberDecoration(Id id, unsigned int member, Decoration decoration, const char *s)
+{
+    if (decoration == spv::DecorationMax)
+        return;
+
+    Instruction* dec = new Instruction(OpMemberDecorateStringGOOGLE);
+    dec->addIdOperand(id);
+    dec->addImmediateOperand(member);
+    dec->addImmediateOperand(decoration);
+    dec->addStringOperand(s);
+
+    decorations.push_back(std::unique_ptr<Instruction>(dec));
+}
+
 // Comments in header
 Function* Builder::makeEntryPoint(const char* entryPoint)
 {
@@ -2530,7 +2593,7 @@ void Builder::remapDynamicSwizzle()
     if (accessChain.component != NoResult && accessChain.swizzle.size() > 1) {
         // build a vector of the swizzle for the component to map into
         std::vector<Id> components;
-        for (int c = 0; c < accessChain.swizzle.size(); ++c)
+        for (int c = 0; c < (int)accessChain.swizzle.size(); ++c)
             components.push_back(makeUintConstant(accessChain.swizzle[c]));
         Id mapType = makeVectorType(makeUintType(32), (int)accessChain.swizzle.size());
         Id map = makeCompositeConstant(mapType, components);
diff --git a/SPIRV/SpvBuilder.h b/SPIRV/SpvBuilder.h
index d4d2719fc8c2f34cee042fd175f738c185f695e6..dc76daec9c8b5c126278aa5e2144e49c68572305 100755
--- a/SPIRV/SpvBuilder.h
+++ b/SPIRV/SpvBuilder.h
@@ -226,6 +226,7 @@ public:
     Id makeFloatConstant(float f, bool specConstant = false);
     Id makeDoubleConstant(double d, bool specConstant = false);
     Id makeFloat16Constant(float f16, bool specConstant = false);
+    Id makeFpConstant(Id type, double d, bool specConstant = false);
 
     // Turn the array of constants into a proper spv constant of the requested type.
     Id makeCompositeConstant(Id type, const std::vector<Id>& comps, bool specConst = false);
@@ -236,7 +237,10 @@ public:
     void addName(Id, const char* name);
     void addMemberName(Id, int member, const char* name);
     void addDecoration(Id, Decoration, int num = -1);
+    void addDecoration(Id, Decoration, const char*);
+    void addDecorationId(Id id, Decoration, Id idDecoration);
     void addMemberDecoration(Id, unsigned int member, Decoration, int num = -1);
+    void addMemberDecoration(Id, unsigned int member, Decoration, const char*);
 
     // At the end of what block do the next create*() instructions go?
     void setBuildPoint(Block* bp) { buildPoint = bp; }
diff --git a/SPIRV/doc.cpp b/SPIRV/doc.cpp
index 61718734b5413b293e24c7769ba34278e0d7c582..bfe9f7a7a076f808516cf52a0a47c1fd11e8d082 100644
--- a/SPIRV/doc.cpp
+++ b/SPIRV/doc.cpp
@@ -269,6 +269,9 @@ const char* DecorationString(int decoration)
     case 5252: return "ViewportRelativeNV";
     case 5256: return "SecondaryViewportRelativeNV";
 #endif
+
+    case DecorationHlslCounterBufferGOOGLE: return "DecorationHlslCounterBufferGOOGLE";
+    case DecorationHlslSemanticGOOGLE:      return "DecorationHlslSemanticGOOGLE";
     }
 }
 
@@ -1208,6 +1211,7 @@ const char* OpcodeString(int op)
     case 320: return "OpImageSparseRead";
 
     case OpModuleProcessed: return "OpModuleProcessed";
+    case OpDecorateId:      return "OpDecorateId";
 
     case 333: return "OpGroupNonUniformElect";
     case 334: return "OpGroupNonUniformAll";
@@ -1265,6 +1269,9 @@ const char* OpcodeString(int op)
     case 5012: return "OpFragmentFetchAMD";
 #endif
 
+    case OpDecorateStringGOOGLE:       return "OpDecorateStringGOOGLE";
+    case OpMemberDecorateStringGOOGLE: return "OpMemberDecorateStringGOOGLE";
+
     case OpcodeCeiling:
     default:
         return "Bad";
@@ -1356,7 +1363,10 @@ void Parameterize()
     InstructionDesc[OpImageWrite].setResultAndType(false, false);
     InstructionDesc[OpDecorationGroup].setResultAndType(true, false);
     InstructionDesc[OpDecorate].setResultAndType(false, false);
+    InstructionDesc[OpDecorateId].setResultAndType(false, false);
+    InstructionDesc[OpDecorateStringGOOGLE].setResultAndType(false, false);
     InstructionDesc[OpMemberDecorate].setResultAndType(false, false);
+    InstructionDesc[OpMemberDecorateStringGOOGLE].setResultAndType(false, false);
     InstructionDesc[OpGroupDecorate].setResultAndType(false, false);
     InstructionDesc[OpGroupMemberDecorate].setResultAndType(false, false);
     InstructionDesc[OpName].setResultAndType(false, false);
@@ -1921,11 +1931,24 @@ void Parameterize()
     InstructionDesc[OpDecorate].operands.push(OperandDecoration, "");
     InstructionDesc[OpDecorate].operands.push(OperandVariableLiterals, "See <<Decoration,'Decoration'>>.");
 
+    InstructionDesc[OpDecorateId].operands.push(OperandId, "'Target'");
+    InstructionDesc[OpDecorateId].operands.push(OperandDecoration, "");
+    InstructionDesc[OpDecorateId].operands.push(OperandVariableIds, "See <<Decoration,'Decoration'>>.");
+
+    InstructionDesc[OpDecorateStringGOOGLE].operands.push(OperandId, "'Target'");
+    InstructionDesc[OpDecorateStringGOOGLE].operands.push(OperandDecoration, "");
+    InstructionDesc[OpDecorateStringGOOGLE].operands.push(OperandLiteralString, "'Literal String'");
+
     InstructionDesc[OpMemberDecorate].operands.push(OperandId, "'Structure Type'");
     InstructionDesc[OpMemberDecorate].operands.push(OperandLiteralNumber, "'Member'");
     InstructionDesc[OpMemberDecorate].operands.push(OperandDecoration, "");
     InstructionDesc[OpMemberDecorate].operands.push(OperandVariableLiterals, "See <<Decoration,'Decoration'>>.");
 
+    InstructionDesc[OpMemberDecorateStringGOOGLE].operands.push(OperandId, "'Structure Type'");
+    InstructionDesc[OpMemberDecorateStringGOOGLE].operands.push(OperandLiteralNumber, "'Member'");
+    InstructionDesc[OpMemberDecorateStringGOOGLE].operands.push(OperandDecoration, "");
+    InstructionDesc[OpMemberDecorateStringGOOGLE].operands.push(OperandLiteralString, "'Literal String'");
+
     InstructionDesc[OpGroupDecorate].operands.push(OperandId, "'Decoration Group'");
     InstructionDesc[OpGroupDecorate].operands.push(OperandVariableIds, "'Targets'");
 
diff --git a/StandAlone/StandAlone.cpp b/StandAlone/StandAlone.cpp
index 8480ca67374f491a563e4451dec4dca9c022b361..356e016e8dc2dd32c83c8238bd9f10fe0aae17a2 100644
--- a/StandAlone/StandAlone.cpp
+++ b/StandAlone/StandAlone.cpp
@@ -101,6 +101,7 @@ enum TOptions {
     EOptionInvertY              = (1 << 30),
     EOptionDumpBareVersion      = (1 << 31),
 };
+bool targetHlslFunctionality1 = false;
 
 //
 // Return codes from main/exit().
@@ -159,9 +160,9 @@ const char* variableName = nullptr;
 bool HlslEnable16BitTypes = false;
 std::vector<std::string> IncludeDirectoryList;
 int ClientInputSemanticsVersion = 100;                  // maps to, say, #define VULKAN 100
-glslang::EshTargetClientVersion VulkanClientVersion =
+glslang::EShTargetClientVersion VulkanClientVersion =
                           glslang::EShTargetVulkan_1_0; // would map to, say, Vulkan 1.0
-glslang::EshTargetClientVersion OpenGLClientVersion =
+glslang::EShTargetClientVersion OpenGLClientVersion =
                           glslang::EShTargetOpenGL_450; // doesn't influence anything yet, but maps to OpenGL 4.50
 glslang::EShTargetLanguageVersion TargetVersion =
                           glslang::EShTargetSpv_1_0;    // maps to, say, SPIR-V 1.0
@@ -523,7 +524,7 @@ void ProcessArguments(std::vector<std::unique_ptr<glslang::TWorkItem>>& workItem
                                 setOpenGlSpv();
                                 OpenGLClientVersion = glslang::EShTargetOpenGL_450;
                             } else
-                                Error("--target-env expected vulkan1.0, opengl, or hlsl-16bit-types");
+                                Error("--target-env expected vulkan1.0, vulkan1.1, or opengl");
                         }
                         bumpArg();
                     } else if (lowerword == "variable-name" || // synonyms
@@ -613,6 +614,12 @@ void ProcessArguments(std::vector<std::unique_ptr<glslang::TWorkItem>>& workItem
                     Error("no <name> provided for -e");
                 bumpArg();
                 break;
+            case 'f':
+                if (strcmp(&argv[0][2], "hlsl_functionality1") == 0)
+                    targetHlslFunctionality1 = true;
+                else
+                    Error("-f: expected hlsl_functionality1");
+                break;
             case 'g':
                 Options |= EOptionDebug;
                 break;
@@ -874,14 +881,15 @@ void CompileAndLinkShaderUnits(std::vector<ShaderCompUnit> compUnits)
                                                                 : glslang::EShSourceGlsl,
                                         compUnit.stage, glslang::EShClientVulkan, ClientInputSemanticsVersion);
                 shader->setEnvClient(glslang::EShClientVulkan, VulkanClientVersion);
-                shader->setEnvTarget(glslang::EShTargetSpv, TargetVersion);
             } else {
                 shader->setEnvInput((Options & EOptionReadHlsl) ? glslang::EShSourceHlsl
                                                                 : glslang::EShSourceGlsl,
                                         compUnit.stage, glslang::EShClientOpenGL, ClientInputSemanticsVersion);
                 shader->setEnvClient(glslang::EShClientOpenGL, OpenGLClientVersion);
-                shader->setEnvTarget(glslang::EshTargetSpv, TargetVersion);
             }
+            shader->setEnvTarget(glslang::EShTargetSpv, TargetVersion);
+            if (targetHlslFunctionality1)
+                shader->setEnvTargetHlslFunctionality1();
         }
 
         shaders.push_back(shader);
@@ -1318,6 +1326,9 @@ void usage()
            "  -d          default to desktop (#version 110) when there is no shader #version\n"
            "              (default is ES version 100)\n"
            "  -e <name>   specify <name> as the entry-point name\n"
+           "  -f{hlsl_functionality1}\n"
+           "              'hlsl_functionality1' enables use of the\n"
+           "                  SPV_GOOGLE_hlsl_functionality1 extension\n"
            "  -g          generate debug information\n"
            "  -h          print this usage message\n"
            "  -i          intermediate tree (glslang AST) is printed out\n"
@@ -1390,8 +1401,8 @@ void usage()
            "                                       set execution environment that emitted code\n"
            "                                       will execute in (as opposed to the language\n"
            "                                       semantics selected by --client) defaults:\n"
-           "                                        'vulkan1.0' under '--client vulkan<ver>'\n"
-           "                                        'opengl' under '--client opengl<ver>'\n"
+           "                                          'vulkan1.0' under '--client vulkan<ver>'\n"
+           "                                          'opengl' under '--client opengl<ver>'\n"
            "  --variable-name <name>               Creates a C header file that contains a\n"
            "                                       uint32_t array named <name>\n"
            "                                       initialized with the shader binary code.\n"
diff --git a/Test/baseResults/300.frag.out b/Test/baseResults/300.frag.out
index 63abec1a562f42b77458e3ac6b0c7c21f40cdc30..b2051ed912f71f51b7c5e0a2ef1820fb2be614fa 100644
--- a/Test/baseResults/300.frag.out
+++ b/Test/baseResults/300.frag.out
@@ -1,7 +1,7 @@
 300.frag
 ERROR: 0:2: 'float' : type requires declaration of default precision qualifier 
 ERROR: 0:30: 'noperspective' : Reserved word. 
-ERROR: 0:30: 'noperspective' : not supported with this profile: es
+ERROR: 0:30: 'noperspective' : not supported for this version or the enabled extensions 
 ERROR: 0:31: 'sampler2D' : sampler/image types can only be used in uniform variables or function parameters: bads
 ERROR: 0:32: 'uint' : cannot apply precision statement to this type; use 'float', 'int' or a sampler type 
 ERROR: 0:39: 'structure' : must be qualified as flat in
diff --git a/Test/baseResults/310.frag.out b/Test/baseResults/310.frag.out
index 8107556132333f706e7b3a42794af43b9a997f0c..cb02cd8a42b619aacdaf4f5fa53909ca2cd572ea 100644
--- a/Test/baseResults/310.frag.out
+++ b/Test/baseResults/310.frag.out
@@ -105,7 +105,7 @@ ERROR: 0:346: 'centroid/sample/patch' : can't use auxiliary qualifier on a fragm
 ERROR: 0:347: 'flat/smooth/noperspective' : can't use interpolation qualifier on a fragment output 
 ERROR: 0:348: 'flat/smooth/noperspective' : can't use interpolation qualifier on a fragment output 
 ERROR: 0:349: 'noperspective' : Reserved word. 
-ERROR: 0:349: 'noperspective' : not supported with this profile: es
+ERROR: 0:349: 'noperspective' : not supported for this version or the enabled extensions 
 ERROR: 0:349: 'flat/smooth/noperspective' : can't use interpolation qualifier on a fragment output 
 ERROR: 0:355: 'interpolateAtCentroid' : required extension not requested: GL_OES_shader_multisample_interpolation
 ERROR: 0:356: 'interpolateAtSample' : required extension not requested: GL_OES_shader_multisample_interpolation
diff --git a/Test/baseResults/310.tese.out b/Test/baseResults/310.tese.out
index 52d19b4fdf604b62ec0b039ff8caec68d367eea6..28cf96b35270803d6fffe8933f879a9076fc55e5 100644
--- a/Test/baseResults/310.tese.out
+++ b/Test/baseResults/310.tese.out
@@ -21,7 +21,7 @@ ERROR: 0:48: 'assign' :  l-value required (can't modify a const)
 ERROR: 0:51: 'patch' : cannot use interpolation qualifiers with patch 
 ERROR: 0:52: 'patch' : cannot use interpolation qualifiers with patch 
 ERROR: 0:53: 'noperspective' : Reserved word. 
-ERROR: 0:53: 'noperspective' : not supported with this profile: es
+ERROR: 0:53: 'noperspective' : not supported for this version or the enabled extensions 
 ERROR: 0:53: 'patch' : cannot use interpolation qualifiers with patch 
 ERROR: 0:54: 'sample' : Reserved word. 
 ERROR: 0:54: '' : can only have one auxiliary qualifier (centroid, patch, and sample) 
diff --git a/Test/baseResults/320.frag.out b/Test/baseResults/320.frag.out
index 76dbeaf8dc5271728b1cbd59a3483afd0d7b9d08..33c74e503018569c4ffd4690e65e6910cb913524 100755
--- a/Test/baseResults/320.frag.out
+++ b/Test/baseResults/320.frag.out
@@ -23,7 +23,7 @@ ERROR: 0:157: 'centroid/sample/patch' : can't use auxiliary qualifier on a fragm
 ERROR: 0:158: 'flat/smooth/noperspective' : can't use interpolation qualifier on a fragment output 
 ERROR: 0:159: 'flat/smooth/noperspective' : can't use interpolation qualifier on a fragment output 
 ERROR: 0:160: 'noperspective' : Reserved word. 
-ERROR: 0:160: 'noperspective' : not supported with this profile: es
+ERROR: 0:160: 'noperspective' : not supported for this version or the enabled extensions 
 ERROR: 0:160: 'flat/smooth/noperspective' : can't use interpolation qualifier on a fragment output 
 ERROR: 0:165: 'centroid/sample/patch' : can't use auxiliary qualifier on a fragment output 
 ERROR: 0:180: 'interpolateAtCentroid' : no matching overloaded function found 
diff --git a/Test/baseResults/320.tese.out b/Test/baseResults/320.tese.out
index ad8fe72e3fe99defda6802a8d7e518533f744012..c72ce33f4bc2206cb959d1f726dfb30a039b6664 100755
--- a/Test/baseResults/320.tese.out
+++ b/Test/baseResults/320.tese.out
@@ -21,7 +21,7 @@ ERROR: 0:44: 'assign' :  l-value required (can't modify a const)
 ERROR: 0:47: 'patch' : cannot use interpolation qualifiers with patch 
 ERROR: 0:48: 'patch' : cannot use interpolation qualifiers with patch 
 ERROR: 0:49: 'noperspective' : Reserved word. 
-ERROR: 0:49: 'noperspective' : not supported with this profile: es
+ERROR: 0:49: 'noperspective' : not supported for this version or the enabled extensions 
 ERROR: 0:49: 'patch' : cannot use interpolation qualifiers with patch 
 ERROR: 0:50: '' : can only have one auxiliary qualifier (centroid, patch, and sample) 
 ERROR: 0:54: 'gl_PerVertex' : block already declared with size, can't redeclare as implicitly-sized 
diff --git a/Test/baseResults/cppRelaxSkipTokensErrors.vert.out b/Test/baseResults/cppRelaxSkipTokensErrors.vert.out
new file mode 100755
index 0000000000000000000000000000000000000000..e9b4b1b7a7cb79025281e86dd6d9de0a13f87bea
--- /dev/null
+++ b/Test/baseResults/cppRelaxSkipTokensErrors.vert.out
@@ -0,0 +1,14 @@
+cppRelaxSkipTokensErrors.vert
+Shader version: 110
+0:? Sequence
+0:?   Linker Objects
+
+
+Linked vertex stage:
+
+ERROR: Linking vertex stage: Missing entry point: Each stage requires one entry point
+
+Shader version: 110
+0:? Sequence
+0:?   Linker Objects
+
diff --git a/Test/baseResults/hlsl.implicitBool.frag.out b/Test/baseResults/hlsl.implicitBool.frag.out
index 173e2596f63cbb603a3f93b2682b0c37d9087ac2..c545a2e3894f79ce6eb54756649e16a9121c67c3 100755
--- a/Test/baseResults/hlsl.implicitBool.frag.out
+++ b/Test/baseResults/hlsl.implicitBool.frag.out
@@ -74,12 +74,11 @@ gl_FragCoord origin is upper left
 0:17                'anon@0' (layout( row_major std140) uniform block{ uniform float condf,  uniform int condi,  uniform 1-component vector of float condf1,  uniform 1-component vector of int condi1})
 0:17                Constant:
 0:17                  1 (const uint)
-0:17            Convert int to bool ( temp bool)
-0:17              Convert float to int ( temp int)
-0:17                condf: direct index for structure ( uniform float)
-0:17                  'anon@0' (layout( row_major std140) uniform block{ uniform float condf,  uniform int condi,  uniform 1-component vector of float condf1,  uniform 1-component vector of int condi1})
-0:17                  Constant:
-0:17                    0 (const uint)
+0:17            Convert float to bool ( temp bool)
+0:17              condf: direct index for structure ( uniform float)
+0:17                'anon@0' (layout( row_major std140) uniform block{ uniform float condf,  uniform int condi,  uniform 1-component vector of float condf1,  uniform 1-component vector of int condi1})
+0:17                Constant:
+0:17                  0 (const uint)
 0:17          Convert float to bool ( temp bool)
 0:17            condf1: direct index for structure ( uniform 1-component vector of float)
 0:17              'anon@0' (layout( row_major std140) uniform block{ uniform float condf,  uniform int condi,  uniform 1-component vector of float condf1,  uniform 1-component vector of int condi1})
@@ -243,12 +242,11 @@ gl_FragCoord origin is upper left
 0:17                'anon@0' (layout( row_major std140) uniform block{ uniform float condf,  uniform int condi,  uniform 1-component vector of float condf1,  uniform 1-component vector of int condi1})
 0:17                Constant:
 0:17                  1 (const uint)
-0:17            Convert int to bool ( temp bool)
-0:17              Convert float to int ( temp int)
-0:17                condf: direct index for structure ( uniform float)
-0:17                  'anon@0' (layout( row_major std140) uniform block{ uniform float condf,  uniform int condi,  uniform 1-component vector of float condf1,  uniform 1-component vector of int condi1})
-0:17                  Constant:
-0:17                    0 (const uint)
+0:17            Convert float to bool ( temp bool)
+0:17              condf: direct index for structure ( uniform float)
+0:17                'anon@0' (layout( row_major std140) uniform block{ uniform float condf,  uniform int condi,  uniform 1-component vector of float condf1,  uniform 1-component vector of int condi1})
+0:17                Constant:
+0:17                  0 (const uint)
 0:17          Convert float to bool ( temp bool)
 0:17            condf1: direct index for structure ( uniform 1-component vector of float)
 0:17              'anon@0' (layout( row_major std140) uniform block{ uniform float condf,  uniform int condi,  uniform 1-component vector of float condf1,  uniform 1-component vector of int condi1})
@@ -335,12 +333,12 @@ gl_FragCoord origin is upper left
 
 // Module Version 10000
 // Generated by (magic number): 80006
-// Id's are bound by 140
+// Id's are bound by 139
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 138
+                              EntryPoint Fragment 4  "main" 137
                               ExecutionMode 4 OriginUpperLeft
                               Source HLSL 500
                               Name 4  "main"
@@ -352,17 +350,17 @@ gl_FragCoord origin is upper left
                               MemberName 16($Global) 2  "condf1"
                               MemberName 16($Global) 3  "condi1"
                               Name 18  ""
-                              Name 88  "f"
-                              Name 101  "i"
-                              Name 121  "g"
-                              Name 138  "@entryPointOutput"
+                              Name 87  "f"
+                              Name 100  "i"
+                              Name 120  "g"
+                              Name 137  "@entryPointOutput"
                               MemberDecorate 16($Global) 0 Offset 0
                               MemberDecorate 16($Global) 1 Offset 4
                               MemberDecorate 16($Global) 2 Offset 8
                               MemberDecorate 16($Global) 3 Offset 12
                               Decorate 16($Global) Block
                               Decorate 18 DescriptorSet 0
-                              Decorate 138(@entryPointOutput) Location 0
+                              Decorate 137(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -388,25 +386,25 @@ gl_FragCoord origin is upper left
               53:    6(float) Constant 1077936128
               57:     15(int) Constant 3
               64:    6(float) Constant 1082130432
-              83:    6(float) Constant 1084227584
-              87:             TypePointer Function 6(float)
-             100:             TypePointer Function 15(int)
-             125:    6(float) Constant 1088421888
-             126:    6(float) Constant 1090519040
-             137:             TypePointer Output 7(fvec4)
-138(@entryPointOutput):    137(ptr) Variable Output
+              82:    6(float) Constant 1084227584
+              86:             TypePointer Function 6(float)
+              99:             TypePointer Function 15(int)
+             124:    6(float) Constant 1088421888
+             125:    6(float) Constant 1090519040
+             136:             TypePointer Output 7(fvec4)
+137(@entryPointOutput):    136(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
-             139:    7(fvec4) FunctionCall 9(@main()
-                              Store 138(@entryPointOutput) 139
+             138:    7(fvec4) FunctionCall 9(@main()
+                              Store 137(@entryPointOutput) 138
                               Return
                               FunctionEnd
        9(@main():    7(fvec4) Function None 8
               10:             Label
            12(a):     11(ptr) Variable Function
-           88(f):     87(ptr) Variable Function
-          101(i):    100(ptr) Variable Function
-          121(g):     87(ptr) Variable Function
+           87(f):     86(ptr) Variable Function
+          100(i):     99(ptr) Variable Function
+          120(g):     86(ptr) Variable Function
                               Store 12(a) 14
               21:     20(ptr) AccessChain 18 19
               22:     15(int) Load 21
@@ -457,85 +455,84 @@ gl_FragCoord origin is upper left
               70:    23(bool) INotEqual 69 25
               71:     35(ptr) AccessChain 18 34
               72:    6(float) Load 71
-              73:     15(int) ConvertFToS 72
-              74:    23(bool) INotEqual 73 25
-              75:    23(bool) LogicalAnd 70 74
-              76:     35(ptr) AccessChain 18 46
-              77:    6(float) Load 76
-              78:    23(bool) FOrdNotEqual 77 38
-              79:    23(bool) LogicalOr 75 78
-                              SelectionMerge 81 None
-                              BranchConditional 79 80 81
-              80:               Label
-              82:    7(fvec4)   Load 12(a)
-              84:    7(fvec4)   CompositeConstruct 83 83 83 83
-              85:    7(fvec4)   FAdd 82 84
-                                ReturnValue 85
-              81:             Label
-              89:     35(ptr) AccessChain 18 34
-              90:    6(float) Load 89
-                              Store 88(f) 90
-                              Branch 91
-              91:             Label
-                              LoopMerge 93 94 None
-                              Branch 95
-              95:             Label
-              96:    6(float) Load 88(f)
-              97:    23(bool) FOrdNotEqual 96 38
-                              BranchConditional 97 92 93
-              92:               Label
-              98:    6(float)   Load 88(f)
-              99:    6(float)   FSub 98 30
-                                Store 88(f) 99
-                                Branch 94
-              94:               Label
-                                Branch 91
-              93:             Label
-             102:     20(ptr) AccessChain 18 19
-             103:     15(int) Load 102
-                              Store 101(i) 103
+              73:    23(bool) FOrdNotEqual 72 38
+              74:    23(bool) LogicalAnd 70 73
+              75:     35(ptr) AccessChain 18 46
+              76:    6(float) Load 75
+              77:    23(bool) FOrdNotEqual 76 38
+              78:    23(bool) LogicalOr 74 77
+                              SelectionMerge 80 None
+                              BranchConditional 78 79 80
+              79:               Label
+              81:    7(fvec4)   Load 12(a)
+              83:    7(fvec4)   CompositeConstruct 82 82 82 82
+              84:    7(fvec4)   FAdd 81 83
+                                ReturnValue 84
+              80:             Label
+              88:     35(ptr) AccessChain 18 34
+              89:    6(float) Load 88
+                              Store 87(f) 89
+                              Branch 90
+              90:             Label
+                              LoopMerge 92 93 None
+                              Branch 94
+              94:             Label
+              95:    6(float) Load 87(f)
+              96:    23(bool) FOrdNotEqual 95 38
+                              BranchConditional 96 91 92
+              91:               Label
+              97:    6(float)   Load 87(f)
+              98:    6(float)   FSub 97 30
+                                Store 87(f) 98
+                                Branch 93
+              93:               Label
+                                Branch 90
+              92:             Label
+             101:     20(ptr) AccessChain 18 19
+             102:     15(int) Load 101
+                              Store 100(i) 102
+                              Branch 103
+             103:             Label
+                              LoopMerge 105 106 None
                               Branch 104
              104:             Label
-                              LoopMerge 106 107 None
-                              Branch 105
-             105:             Label
-             108:     15(int) Load 101(i)
-             109:     15(int) ISub 108 19
-                              Store 101(i) 109
-                              Branch 107
-             107:             Label
-             110:     15(int) Load 101(i)
-             111:    23(bool) INotEqual 110 25
-                              BranchConditional 111 104 106
+             107:     15(int) Load 100(i)
+             108:     15(int) ISub 107 19
+                              Store 100(i) 108
+                              Branch 106
              106:             Label
-                              Branch 112
-             112:             Label
-                              LoopMerge 114 115 None
-                              Branch 116
-             116:             Label
-             117:     15(int) Load 101(i)
-             118:    23(bool) INotEqual 117 25
-                              BranchConditional 118 113 114
-             113:               Label
-             119:     15(int)   Load 101(i)
-             120:     15(int)   ISub 119 19
-                                Store 101(i) 120
-                                Branch 115
-             115:               Label
-                                Branch 112
-             114:             Label
-             122:     35(ptr) AccessChain 18 34
-             123:    6(float) Load 122
-             124:    23(bool) FOrdNotEqual 123 38
-             127:    6(float) Select 124 125 126
-                              Store 121(g) 127
-             128:    6(float) Load 121(g)
-             129:    7(fvec4) Load 12(a)
-             130:    7(fvec4) CompositeConstruct 128 128 128 128
-             131:    7(fvec4) FAdd 129 130
-                              Store 12(a) 131
-             132:    7(fvec4) Load 12(a)
-             133:    7(fvec4) CompositeConstruct 30 30 30 30
-             134:    7(fvec4) FSub 132 133
-                              ReturnValue 134
+             109:     15(int) Load 100(i)
+             110:    23(bool) INotEqual 109 25
+                              BranchConditional 110 103 105
+             105:             Label
+                              Branch 111
+             111:             Label
+                              LoopMerge 113 114 None
+                              Branch 115
+             115:             Label
+             116:     15(int) Load 100(i)
+             117:    23(bool) INotEqual 116 25
+                              BranchConditional 117 112 113
+             112:               Label
+             118:     15(int)   Load 100(i)
+             119:     15(int)   ISub 118 19
+                                Store 100(i) 119
+                                Branch 114
+             114:               Label
+                                Branch 111
+             113:             Label
+             121:     35(ptr) AccessChain 18 34
+             122:    6(float) Load 121
+             123:    23(bool) FOrdNotEqual 122 38
+             126:    6(float) Select 123 124 125
+                              Store 120(g) 126
+             127:    6(float) Load 120(g)
+             128:    7(fvec4) Load 12(a)
+             129:    7(fvec4) CompositeConstruct 127 127 127 127
+             130:    7(fvec4) FAdd 128 129
+                              Store 12(a) 130
+             131:    7(fvec4) Load 12(a)
+             132:    7(fvec4) CompositeConstruct 30 30 30 30
+             133:    7(fvec4) FSub 131 132
+                              ReturnValue 133
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.logical.binary.frag.out b/Test/baseResults/hlsl.logical.binary.frag.out
index d8c4c246a16bcaa617350431ce4b996304c09c18..6fa45b52ff384d9d21295a3ea3f081d83723d1f8 100644
--- a/Test/baseResults/hlsl.logical.binary.frag.out
+++ b/Test/baseResults/hlsl.logical.binary.frag.out
@@ -13,12 +13,11 @@ gl_FragCoord origin is upper left
 0:13              'anon@0' (layout( row_major std140) uniform block{ uniform int ival,  uniform 4-component vector of int ival4,  uniform float fval,  uniform 4-component vector of float fval4})
 0:13              Constant:
 0:13                0 (const uint)
-0:13          Convert int to bool ( temp bool)
-0:13            Convert float to int ( temp int)
-0:13              fval: direct index for structure ( uniform float)
-0:13                'anon@0' (layout( row_major std140) uniform block{ uniform int ival,  uniform 4-component vector of int ival4,  uniform float fval,  uniform 4-component vector of float fval4})
-0:13                Constant:
-0:13                  2 (const uint)
+0:13          Convert float to bool ( temp bool)
+0:13            fval: direct index for structure ( uniform float)
+0:13              'anon@0' (layout( row_major std140) uniform block{ uniform int ival,  uniform 4-component vector of int ival4,  uniform float fval,  uniform 4-component vector of float fval4})
+0:13              Constant:
+0:13                2 (const uint)
 0:13        true case is null
 0:14      Test condition and select ( temp void)
 0:14        Condition
@@ -28,12 +27,11 @@ gl_FragCoord origin is upper left
 0:14              'anon@0' (layout( row_major std140) uniform block{ uniform int ival,  uniform 4-component vector of int ival4,  uniform float fval,  uniform 4-component vector of float fval4})
 0:14              Constant:
 0:14                0 (const uint)
-0:14          Convert int to bool ( temp bool)
-0:14            Convert float to int ( temp int)
-0:14              fval: direct index for structure ( uniform float)
-0:14                'anon@0' (layout( row_major std140) uniform block{ uniform int ival,  uniform 4-component vector of int ival4,  uniform float fval,  uniform 4-component vector of float fval4})
-0:14                Constant:
-0:14                  2 (const uint)
+0:14          Convert float to bool ( temp bool)
+0:14            fval: direct index for structure ( uniform float)
+0:14              'anon@0' (layout( row_major std140) uniform block{ uniform int ival,  uniform 4-component vector of int ival4,  uniform float fval,  uniform 4-component vector of float fval4})
+0:14              Constant:
+0:14                2 (const uint)
 0:14        true case is null
 0:17      move second child to first child ( temp 4-component vector of float)
 0:17        Color: direct index for structure ( temp 4-component vector of float)
@@ -79,12 +77,11 @@ gl_FragCoord origin is upper left
 0:13              'anon@0' (layout( row_major std140) uniform block{ uniform int ival,  uniform 4-component vector of int ival4,  uniform float fval,  uniform 4-component vector of float fval4})
 0:13              Constant:
 0:13                0 (const uint)
-0:13          Convert int to bool ( temp bool)
-0:13            Convert float to int ( temp int)
-0:13              fval: direct index for structure ( uniform float)
-0:13                'anon@0' (layout( row_major std140) uniform block{ uniform int ival,  uniform 4-component vector of int ival4,  uniform float fval,  uniform 4-component vector of float fval4})
-0:13                Constant:
-0:13                  2 (const uint)
+0:13          Convert float to bool ( temp bool)
+0:13            fval: direct index for structure ( uniform float)
+0:13              'anon@0' (layout( row_major std140) uniform block{ uniform int ival,  uniform 4-component vector of int ival4,  uniform float fval,  uniform 4-component vector of float fval4})
+0:13              Constant:
+0:13                2 (const uint)
 0:13        true case is null
 0:14      Test condition and select ( temp void)
 0:14        Condition
@@ -94,12 +91,11 @@ gl_FragCoord origin is upper left
 0:14              'anon@0' (layout( row_major std140) uniform block{ uniform int ival,  uniform 4-component vector of int ival4,  uniform float fval,  uniform 4-component vector of float fval4})
 0:14              Constant:
 0:14                0 (const uint)
-0:14          Convert int to bool ( temp bool)
-0:14            Convert float to int ( temp int)
-0:14              fval: direct index for structure ( uniform float)
-0:14                'anon@0' (layout( row_major std140) uniform block{ uniform int ival,  uniform 4-component vector of int ival4,  uniform float fval,  uniform 4-component vector of float fval4})
-0:14                Constant:
-0:14                  2 (const uint)
+0:14          Convert float to bool ( temp bool)
+0:14            fval: direct index for structure ( uniform float)
+0:14              'anon@0' (layout( row_major std140) uniform block{ uniform int ival,  uniform 4-component vector of int ival4,  uniform float fval,  uniform 4-component vector of float fval4})
+0:14              Constant:
+0:14                2 (const uint)
 0:14        true case is null
 0:17      move second child to first child ( temp 4-component vector of float)
 0:17        Color: direct index for structure ( temp 4-component vector of float)
@@ -129,12 +125,12 @@ gl_FragCoord origin is upper left
 
 // Module Version 10000
 // Generated by (magic number): 80006
-// Id's are bound by 57
+// Id's are bound by 56
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 54
+                              EntryPoint Fragment 4  "main" 53
                               ExecutionMode 4 OriginUpperLeft
                               Source HLSL 500
                               Name 4  "main"
@@ -147,15 +143,15 @@ gl_FragCoord origin is upper left
                               MemberName 14($Global) 2  "fval"
                               MemberName 14($Global) 3  "fval4"
                               Name 16  ""
-                              Name 45  "psout"
-                              Name 54  "@entryPointOutput.Color"
+                              Name 44  "psout"
+                              Name 53  "@entryPointOutput.Color"
                               MemberDecorate 14($Global) 0 Offset 0
                               MemberDecorate 14($Global) 1 Offset 16
                               MemberDecorate 14($Global) 2 Offset 32
                               MemberDecorate 14($Global) 3 Offset 48
                               Decorate 14($Global) Block
                               Decorate 16 DescriptorSet 0
-                              Decorate 54(@entryPointOutput.Color) Location 0
+                              Decorate 53(@entryPointOutput.Color) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -174,29 +170,29 @@ gl_FragCoord origin is upper left
               23:     22(int) Constant 0
               25:     12(int) Constant 2
               26:             TypePointer Uniform 6(float)
-              44:             TypePointer Function 8(PS_OUTPUT)
-              46:    6(float) Constant 1065353216
-              47:    7(fvec4) ConstantComposite 46 46 46 46
-              48:             TypePointer Function 7(fvec4)
-              53:             TypePointer Output 7(fvec4)
-54(@entryPointOutput.Color):     53(ptr) Variable Output
+              29:    6(float) Constant 0
+              43:             TypePointer Function 8(PS_OUTPUT)
+              45:    6(float) Constant 1065353216
+              46:    7(fvec4) ConstantComposite 45 45 45 45
+              47:             TypePointer Function 7(fvec4)
+              52:             TypePointer Output 7(fvec4)
+53(@entryPointOutput.Color):     52(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
-              55:8(PS_OUTPUT) FunctionCall 10(@main()
-              56:    7(fvec4) CompositeExtract 55 0
-                              Store 54(@entryPointOutput.Color) 56
+              54:8(PS_OUTPUT) FunctionCall 10(@main()
+              55:    7(fvec4) CompositeExtract 54 0
+                              Store 53(@entryPointOutput.Color) 55
                               Return
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
               11:             Label
-       45(psout):     44(ptr) Variable Function
+       44(psout):     43(ptr) Variable Function
               19:     18(ptr) AccessChain 16 17
               20:     12(int) Load 19
               24:    21(bool) INotEqual 20 23
               27:     26(ptr) AccessChain 16 25
               28:    6(float) Load 27
-              29:     12(int) ConvertFToS 28
-              30:    21(bool) INotEqual 29 23
+              30:    21(bool) FOrdNotEqual 28 29
               31:    21(bool) LogicalAnd 24 30
                               SelectionMerge 33 None
                               BranchConditional 31 32 33
@@ -208,16 +204,15 @@ gl_FragCoord origin is upper left
               36:    21(bool) INotEqual 35 23
               37:     26(ptr) AccessChain 16 25
               38:    6(float) Load 37
-              39:     12(int) ConvertFToS 38
-              40:    21(bool) INotEqual 39 23
-              41:    21(bool) LogicalOr 36 40
-                              SelectionMerge 43 None
-                              BranchConditional 41 42 43
-              42:               Label
-                                Branch 43
-              43:             Label
-              49:     48(ptr) AccessChain 45(psout) 17
-                              Store 49 47
-              50:8(PS_OUTPUT) Load 45(psout)
-                              ReturnValue 50
+              39:    21(bool) FOrdNotEqual 38 29
+              40:    21(bool) LogicalOr 36 39
+                              SelectionMerge 42 None
+                              BranchConditional 40 41 42
+              41:               Label
+                                Branch 42
+              42:             Label
+              48:     47(ptr) AccessChain 44(psout) 17
+                              Store 48 46
+              49:8(PS_OUTPUT) Load 44(psout)
+                              ReturnValue 49
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.structbuffer.incdec.frag.hlslfun1.out b/Test/baseResults/hlsl.structbuffer.incdec.frag.hlslfun1.out
new file mode 100644
index 0000000000000000000000000000000000000000..9e42ed344bfcb8fb3a5c910f52a7f1529222ad49
--- /dev/null
+++ b/Test/baseResults/hlsl.structbuffer.incdec.frag.hlslfun1.out
@@ -0,0 +1,125 @@
+hlsl.structbuffer.incdec.frag
+// Module Version 10000
+// Generated by (magic number): 80006
+// Id's are bound by 70
+
+                              Capability Shader
+                              Extension  "SPV_GOOGLE_hlsl_functionality1"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 63 66
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 12  "@main(u1;"
+                              Name 11  "pos"
+                              Name 16  "result"
+                              Name 20  "sbuf_rw_i"
+                              MemberName 20(sbuf_rw_i) 0  "@data"
+                              Name 22  "sbuf_rw_i"
+                              Name 26  "sbuf_rw_d"
+                              Name 27  "sbuf_rw_nocounter"
+                              Name 33  "c1"
+                              Name 34  "sbuf_rw_i@count"
+                              MemberName 34(sbuf_rw_i@count) 0  "@count"
+                              Name 36  "sbuf_rw_i@count"
+                              Name 42  "c2"
+                              Name 43  "sbuf_rw_d@count"
+                              Name 61  "pos"
+                              Name 63  "pos"
+                              Name 66  "@entryPointOutput"
+                              Name 67  "param"
+                              Decorate 19 ArrayStride 16
+                              MemberDecorate 20(sbuf_rw_i) 0 Offset 0
+                              Decorate 20(sbuf_rw_i) BufferBlock
+                              Decorate 22(sbuf_rw_i) DescriptorSet 0
+                              Decorate 26(sbuf_rw_d) DescriptorSet 0
+                              Decorate 27(sbuf_rw_nocounter) DescriptorSet 0
+                              MemberDecorate 34(sbuf_rw_i@count) 0 Offset 0
+                              Decorate 34(sbuf_rw_i@count) BufferBlock
+                              Decorate 36(sbuf_rw_i@count) DescriptorSet 0
+                              Decorate 43(sbuf_rw_d@count) DescriptorSet 0
+                              Decorate 63(pos) Flat
+                              Decorate 63(pos) Location 0
+                              DecorateStringGOOGLE 63(pos) DecorationHlslSemanticGOOGLE  "FOO"
+                              Decorate 66(@entryPointOutput) Location 0
+                              DecorateStringGOOGLE 66(@entryPointOutput) DecorationHlslSemanticGOOGLE  "SV_TARGET0"
+                              DecorateId 22(sbuf_rw_i) DecorationHlslCounterBufferGOOGLE 36(sbuf_rw_i@count)
+                              DecorateId 26(sbuf_rw_d) DecorationHlslCounterBufferGOOGLE 43(sbuf_rw_d@count)
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypePointer Function 6(int)
+               8:             TypeFloat 32
+               9:             TypeVector 8(float) 4
+              10:             TypeFunction 9(fvec4) 7(ptr)
+              14:             TypeVector 6(int) 4
+              15:             TypePointer Function 14(ivec4)
+              17:      6(int) Constant 0
+              18:   14(ivec4) ConstantComposite 17 17 17 17
+              19:             TypeRuntimeArray 14(ivec4)
+   20(sbuf_rw_i):             TypeStruct 19
+              21:             TypePointer Uniform 20(sbuf_rw_i)
+   22(sbuf_rw_i):     21(ptr) Variable Uniform
+              23:             TypeInt 32 1
+              24:     23(int) Constant 0
+              25:     23(int) Constant 7
+   26(sbuf_rw_d):     21(ptr) Variable Uniform
+27(sbuf_rw_nocounter):     21(ptr) Variable Uniform
+              28:     23(int) Constant 5
+              29:      6(int) Constant 2
+              30:   14(ivec4) ConstantComposite 29 29 29 29
+              31:             TypePointer Uniform 14(ivec4)
+34(sbuf_rw_i@count):             TypeStruct 23(int)
+              35:             TypePointer Uniform 34(sbuf_rw_i@count)
+36(sbuf_rw_i@count):     35(ptr) Variable Uniform
+              37:             TypePointer Uniform 23(int)
+              39:     23(int) Constant 1
+              40:      6(int) Constant 1
+43(sbuf_rw_d@count):     35(ptr) Variable Uniform
+              45:     23(int) Constant 4294967295
+              62:             TypePointer Input 6(int)
+         63(pos):     62(ptr) Variable Input
+              65:             TypePointer Output 9(fvec4)
+66(@entryPointOutput):     65(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+         61(pos):      7(ptr) Variable Function
+       67(param):      7(ptr) Variable Function
+              64:      6(int) Load 63(pos)
+                              Store 61(pos) 64
+              68:      6(int) Load 61(pos)
+                              Store 67(param) 68
+              69:    9(fvec4) FunctionCall 12(@main(u1;) 67(param)
+                              Store 66(@entryPointOutput) 69
+                              Return
+                              FunctionEnd
+   12(@main(u1;):    9(fvec4) Function None 10
+         11(pos):      7(ptr) FunctionParameter
+              13:             Label
+      16(result):     15(ptr) Variable Function
+          33(c1):      7(ptr) Variable Function
+          42(c2):      7(ptr) Variable Function
+                              Store 16(result) 18
+              32:     31(ptr) AccessChain 27(sbuf_rw_nocounter) 24 28
+                              Store 32 30
+              38:     37(ptr) AccessChain 36(sbuf_rw_i@count) 24
+              41:      6(int) AtomicIAdd 38 40 17 39
+                              Store 33(c1) 41
+              44:     37(ptr) AccessChain 43(sbuf_rw_d@count) 24
+              46:      6(int) AtomicIAdd 44 40 17 45
+              47:      6(int) IAdd 46 45
+                              Store 42(c2) 47
+              48:      7(ptr) AccessChain 16(result) 17
+              49:      6(int) Load 48
+              50:    8(float) ConvertUToF 49
+              51:      7(ptr) AccessChain 16(result) 40
+              52:      6(int) Load 51
+              53:    8(float) ConvertUToF 52
+              54:      6(int) Load 33(c1)
+              55:    8(float) ConvertUToF 54
+              56:      6(int) Load 42(c2)
+              57:    8(float) ConvertUToF 56
+              58:    9(fvec4) CompositeConstruct 50 53 55 57
+                              ReturnValue 58
+                              FunctionEnd
diff --git a/Test/baseResults/nvShaderNoperspectiveInterpolation.frag.out b/Test/baseResults/nvShaderNoperspectiveInterpolation.frag.out
new file mode 100644
index 0000000000000000000000000000000000000000..ae004c64d42590958d40cd142cde95a292131b99
--- /dev/null
+++ b/Test/baseResults/nvShaderNoperspectiveInterpolation.frag.out
@@ -0,0 +1,38 @@
+nvShaderNoperspectiveInterpolation.frag
+ERROR: 0:5: 'noperspective' : Reserved word. 
+ERROR: 0:5: 'noperspective' : not supported for this version or the enabled extensions 
+ERROR: 2 compilation errors.  No code generated.
+
+
+Shader version: 300
+Requested GL_NV_shader_noperspective_interpolation
+ERROR: node is still EOpNull!
+0:13  Function Definition: main( ( global void)
+0:13    Function Parameters: 
+0:14    Sequence
+0:14      move second child to first child ( temp mediump 4-component vector of float)
+0:14        'fragColor' ( out mediump 4-component vector of float)
+0:14        'color' ( noperspective in mediump 4-component vector of float)
+0:?   Linker Objects
+0:?     'bad' ( noperspective in mediump 4-component vector of float)
+0:?     'color' ( noperspective in mediump 4-component vector of float)
+0:?     'fragColor' ( out mediump 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 300
+Requested GL_NV_shader_noperspective_interpolation
+ERROR: node is still EOpNull!
+0:13  Function Definition: main( ( global void)
+0:13    Function Parameters: 
+0:14    Sequence
+0:14      move second child to first child ( temp mediump 4-component vector of float)
+0:14        'fragColor' ( out mediump 4-component vector of float)
+0:14        'color' ( noperspective in mediump 4-component vector of float)
+0:?   Linker Objects
+0:?     'bad' ( noperspective in mediump 4-component vector of float)
+0:?     'color' ( noperspective in mediump 4-component vector of float)
+0:?     'fragColor' ( out mediump 4-component vector of float)
+
diff --git a/Test/baseResults/spv.debugInfo.1.1.frag.out b/Test/baseResults/spv.debugInfo.1.1.frag.out
index b730376250bb23f43e8823479c1c31acfeac111b..9bd14910bfd940b6b4d715a31ed1ee92e3740cbf 100644
--- a/Test/baseResults/spv.debugInfo.1.1.frag.out
+++ b/Test/baseResults/spv.debugInfo.1.1.frag.out
@@ -94,6 +94,7 @@ void main()
                               MemberDecorate 54(ubuf) 0 Offset 0
                               Decorate 54(ubuf) Block
                               Decorate 56 DescriptorSet 3
+                              Decorate 69(s2d) Location 0
                               Decorate 69(s2d) DescriptorSet 3
                3:             TypeVoid
                4:             TypeFunction 3
diff --git a/Test/baseResults/spv.debugInfo.frag.out b/Test/baseResults/spv.debugInfo.frag.out
index de54415127da24566c35d77d52797a4f74495a58..0bb266bde7245c736257cfba52f41eda103ae358 100644
--- a/Test/baseResults/spv.debugInfo.frag.out
+++ b/Test/baseResults/spv.debugInfo.frag.out
@@ -97,6 +97,7 @@ void main()
                               Decorate 54(ubuf) Block
                               Decorate 56 DescriptorSet 3
                               Decorate 56 Binding 0
+                              Decorate 69(s2d) Location 0
                               Decorate 69(s2d) DescriptorSet 3
                               Decorate 69(s2d) Binding 1
                3:             TypeVoid
diff --git a/Test/baseResults/spv.int16.frag.out b/Test/baseResults/spv.int16.frag.out
index 22f51380abf60169b1cb773b01724eb53c93b77b..835556913fb5363088706d9adb41ec85b5642383 100644
--- a/Test/baseResults/spv.int16.frag.out
+++ b/Test/baseResults/spv.int16.frag.out
@@ -1,7 +1,7 @@
 spv.int16.frag
 // Module Version 10000
 // Generated by (magic number): 80006
-// Id's are bound by 525
+// Id's are bound by 523
 
                               Capability Shader
                               Capability Float16
@@ -55,48 +55,48 @@ spv.int16.frag
                               Name 220  "i"
                               Name 227  "uv"
                               Name 243  "i64"
-                              Name 283  "b"
-                              Name 345  "i16v"
-                              Name 348  "i16"
-                              Name 358  "u16v"
-                              Name 360  "u16"
-                              Name 430  "i32"
-                              Name 433  "i64"
-                              Name 436  "i16v4"
-                              Name 439  "u32"
-                              Name 440  "u16v2"
-                              Name 444  "u64"
-                              Name 447  "u16v4"
-                              Name 459  "bv"
-                              Name 520  "Block"
-                              MemberName 520(Block) 0  "i16"
-                              MemberName 520(Block) 1  "i16v2"
-                              MemberName 520(Block) 2  "i16v3"
-                              MemberName 520(Block) 3  "i16v4"
-                              MemberName 520(Block) 4  "u16"
-                              MemberName 520(Block) 5  "u16v2"
-                              MemberName 520(Block) 6  "u16v3"
-                              MemberName 520(Block) 7  "u16v4"
-                              Name 522  "block"
-                              Name 523  "si16"
-                              Name 524  "su16"
+                              Name 281  "b"
+                              Name 343  "i16v"
+                              Name 346  "i16"
+                              Name 356  "u16v"
+                              Name 358  "u16"
+                              Name 428  "i32"
+                              Name 431  "i64"
+                              Name 434  "i16v4"
+                              Name 437  "u32"
+                              Name 438  "u16v2"
+                              Name 442  "u64"
+                              Name 445  "u16v4"
+                              Name 457  "bv"
+                              Name 518  "Block"
+                              MemberName 518(Block) 0  "i16"
+                              MemberName 518(Block) 1  "i16v2"
+                              MemberName 518(Block) 2  "i16v3"
+                              MemberName 518(Block) 3  "i16v4"
+                              MemberName 518(Block) 4  "u16"
+                              MemberName 518(Block) 5  "u16v2"
+                              MemberName 518(Block) 6  "u16v3"
+                              MemberName 518(Block) 7  "u16v4"
+                              Name 520  "block"
+                              Name 521  "si16"
+                              Name 522  "su16"
                               MemberDecorate 24(Uniforms) 0 Offset 0
                               Decorate 24(Uniforms) Block
                               Decorate 26 DescriptorSet 0
                               Decorate 26 Binding 0
-                              MemberDecorate 520(Block) 0 Offset 0
-                              MemberDecorate 520(Block) 1 Offset 4
-                              MemberDecorate 520(Block) 2 Offset 8
-                              MemberDecorate 520(Block) 3 Offset 16
-                              MemberDecorate 520(Block) 4 Offset 24
-                              MemberDecorate 520(Block) 5 Offset 28
-                              MemberDecorate 520(Block) 6 Offset 32
-                              MemberDecorate 520(Block) 7 Offset 40
-                              Decorate 520(Block) Block
-                              Decorate 522(block) DescriptorSet 0
-                              Decorate 522(block) Binding 1
-                              Decorate 523(si16) SpecId 100
-                              Decorate 524(su16) SpecId 101
+                              MemberDecorate 518(Block) 0 Offset 0
+                              MemberDecorate 518(Block) 1 Offset 4
+                              MemberDecorate 518(Block) 2 Offset 8
+                              MemberDecorate 518(Block) 3 Offset 16
+                              MemberDecorate 518(Block) 4 Offset 24
+                              MemberDecorate 518(Block) 5 Offset 28
+                              MemberDecorate 518(Block) 6 Offset 32
+                              MemberDecorate 518(Block) 7 Offset 40
+                              Decorate 518(Block) Block
+                              Decorate 520(block) DescriptorSet 0
+                              Decorate 520(block) Binding 1
+                              Decorate 521(si16) SpecId 100
+                              Decorate 522(su16) SpecId 101
                2:             TypeVoid
                3:             TypeFunction 2
               14:             TypeInt 16 1
@@ -171,28 +171,28 @@ spv.int16.frag
              242:             TypePointer Function 71(int)
              264:     17(int) Constant 1
              270:     17(int) Constant 2
-             275:             TypeVector 27(int) 3
-             282:             TypePointer Function 173(bool)
-             284:     17(int) Constant 0
-             298:             TypePointer Function 17(int)
-             356:   52(ivec2) ConstantComposite 21 21
-             365:  193(ivec3) ConstantComposite 184 184 184
-             407:   173(bool) ConstantTrue
-             414:   173(bool) ConstantFalse
-             415:  174(bvec2) ConstantComposite 414 414
-             427:             TypeVector 173(bool) 3
-             428:  427(bvec3) ConstantComposite 414 414 414
-             434:             TypeVector 14(int) 4
-             435:             TypePointer Function 434(ivec4)
-             443:             TypePointer Function 77(int)
-             445:             TypeVector 36(int) 4
-             446:             TypePointer Function 445(ivec4)
-             458:             TypePointer Function 427(bvec3)
-      520(Block):             TypeStruct 14(int) 52(ivec2) 197(ivec3) 434(ivec4) 36(int) 57(ivec2) 193(ivec3) 445(ivec4)
-             521:             TypePointer Uniform 520(Block)
-      522(block):    521(ptr) Variable Uniform
-       523(si16):     14(int) SpecConstant 4294967286
-       524(su16):     36(int) SpecConstant 20
+             276:             TypeVector 27(int) 3
+             280:             TypePointer Function 173(bool)
+             282:     17(int) Constant 0
+             296:             TypePointer Function 17(int)
+             354:   52(ivec2) ConstantComposite 21 21
+             363:  193(ivec3) ConstantComposite 184 184 184
+             405:   173(bool) ConstantTrue
+             412:   173(bool) ConstantFalse
+             413:  174(bvec2) ConstantComposite 412 412
+             425:             TypeVector 173(bool) 3
+             426:  425(bvec3) ConstantComposite 412 412 412
+             432:             TypeVector 14(int) 4
+             433:             TypePointer Function 432(ivec4)
+             441:             TypePointer Function 77(int)
+             443:             TypeVector 36(int) 4
+             444:             TypePointer Function 443(ivec4)
+             456:             TypePointer Function 425(bvec3)
+      518(Block):             TypeStruct 14(int) 52(ivec2) 197(ivec3) 432(ivec4) 36(int) 57(ivec2) 193(ivec3) 443(ivec4)
+             519:             TypePointer Uniform 518(Block)
+      520(block):    519(ptr) Variable Uniform
+       521(si16):     14(int) SpecConstant 4294967286
+       522(su16):     36(int) SpecConstant 20
          4(main):           2 Function None 3
                5:             Label
                               Return
@@ -371,7 +371,7 @@ spv.int16.frag
           220(i):    219(ptr) Variable Function
          227(uv):    226(ptr) Variable Function
         243(i64):    242(ptr) Variable Function
-          283(b):    282(ptr) Variable Function
+          281(b):    280(ptr) Variable Function
              196:  193(ivec3) Load 195(u16v)
              198:  197(ivec3) CompositeConstruct 179 179 179
              199:  193(ivec3) IAdd 196 198
@@ -460,287 +460,285 @@ spv.int16.frag
              273:     14(int) ShiftLeftLogical 269 272
                               Store 200(i16) 273
              274:  193(ivec3) Load 195(u16v)
-             276:  275(ivec3) UConvert 274
-             277:  275(ivec3) Bitcast 276
-             278:     27(int) Load 220(i)
-             279:  275(ivec3) CompositeConstruct 278 278 278
-             280:  275(ivec3) ShiftLeftLogical 277 279
-             281:  225(ivec3) Bitcast 280
-                              Store 227(uv) 281
-             285:     37(ptr) AccessChain 195(u16v) 284
-             286:     36(int) Load 285
-             287:     14(int) Load 200(i16)
-             288:     36(int) Bitcast 287
-             289:   173(bool) INotEqual 286 288
-                              Store 283(b) 289
-             290:     14(int) Load 200(i16)
-             291:     36(int) Bitcast 290
-             292:     37(ptr) AccessChain 195(u16v) 284
-             293:     36(int) Load 292
-             294:   173(bool) IEqual 291 293
-                              Store 283(b) 294
-             295:     37(ptr) AccessChain 195(u16v) 284
-             296:     36(int) Load 295
-             297:     17(int) UConvert 296
-             299:    298(ptr) AccessChain 227(uv) 264
-             300:     17(int) Load 299
-             301:   173(bool) UGreaterThan 297 300
-                              Store 283(b) 301
-             302:     14(int) Load 200(i16)
-             303:     27(int) SConvert 302
-             304:     27(int) Load 220(i)
-             305:   173(bool) SLessThan 303 304
-                              Store 283(b) 305
-             306:     37(ptr) AccessChain 195(u16v) 264
-             307:     36(int) Load 306
-             308:     17(int) UConvert 307
-             309:    298(ptr) AccessChain 227(uv) 284
-             310:     17(int) Load 309
-             311:   173(bool) UGreaterThanEqual 308 310
-                              Store 283(b) 311
-             312:     14(int) Load 200(i16)
-             313:     27(int) SConvert 312
-             314:     27(int) Load 220(i)
-             315:   173(bool) SLessThanEqual 313 314
-                              Store 283(b) 315
-             316:     14(int) Load 200(i16)
-             317:     27(int) SConvert 316
-             318:     17(int) Bitcast 317
-             319:  225(ivec3) Load 227(uv)
-             320:  225(ivec3) CompositeConstruct 318 318 318
-             321:  225(ivec3) BitwiseOr 319 320
-                              Store 227(uv) 321
-             322:     14(int) Load 200(i16)
-             323:     27(int) SConvert 322
-             324:     27(int) Load 220(i)
-             325:     27(int) BitwiseOr 323 324
-                              Store 220(i) 325
-             326:     14(int) Load 200(i16)
-             327:     71(int) SConvert 326
-             328:     71(int) Load 243(i64)
-             329:     71(int) BitwiseAnd 328 327
-                              Store 243(i64) 329
-             330:  193(ivec3) Load 195(u16v)
-             331:  225(ivec3) UConvert 330
-             332:  225(ivec3) Load 227(uv)
-             333:  225(ivec3) BitwiseAnd 331 332
-                              Store 227(uv) 333
-             334:     14(int) Load 200(i16)
-             335:     27(int) SConvert 334
-             336:     17(int) Bitcast 335
-             337:  225(ivec3) Load 227(uv)
-             338:  225(ivec3) CompositeConstruct 336 336 336
-             339:  225(ivec3) BitwiseXor 337 338
-                              Store 227(uv) 339
-             340:  193(ivec3) Load 195(u16v)
-             341:     14(int) Load 200(i16)
-             342:     36(int) Bitcast 341
-             343:  193(ivec3) CompositeConstruct 342 342 342
-             344:  193(ivec3) BitwiseXor 340 343
-                              Store 195(u16v) 344
+             275:     27(int) Load 220(i)
+             277:  276(ivec3) CompositeConstruct 275 275 275
+             278:  193(ivec3) ShiftLeftLogical 274 277
+             279:  225(ivec3) UConvert 278
+                              Store 227(uv) 279
+             283:     37(ptr) AccessChain 195(u16v) 282
+             284:     36(int) Load 283
+             285:     14(int) Load 200(i16)
+             286:     36(int) Bitcast 285
+             287:   173(bool) INotEqual 284 286
+                              Store 281(b) 287
+             288:     14(int) Load 200(i16)
+             289:     36(int) Bitcast 288
+             290:     37(ptr) AccessChain 195(u16v) 282
+             291:     36(int) Load 290
+             292:   173(bool) IEqual 289 291
+                              Store 281(b) 292
+             293:     37(ptr) AccessChain 195(u16v) 282
+             294:     36(int) Load 293
+             295:     17(int) UConvert 294
+             297:    296(ptr) AccessChain 227(uv) 264
+             298:     17(int) Load 297
+             299:   173(bool) UGreaterThan 295 298
+                              Store 281(b) 299
+             300:     14(int) Load 200(i16)
+             301:     27(int) SConvert 300
+             302:     27(int) Load 220(i)
+             303:   173(bool) SLessThan 301 302
+                              Store 281(b) 303
+             304:     37(ptr) AccessChain 195(u16v) 264
+             305:     36(int) Load 304
+             306:     17(int) UConvert 305
+             307:    296(ptr) AccessChain 227(uv) 282
+             308:     17(int) Load 307
+             309:   173(bool) UGreaterThanEqual 306 308
+                              Store 281(b) 309
+             310:     14(int) Load 200(i16)
+             311:     27(int) SConvert 310
+             312:     27(int) Load 220(i)
+             313:   173(bool) SLessThanEqual 311 312
+                              Store 281(b) 313
+             314:     14(int) Load 200(i16)
+             315:     27(int) SConvert 314
+             316:     17(int) Bitcast 315
+             317:  225(ivec3) Load 227(uv)
+             318:  225(ivec3) CompositeConstruct 316 316 316
+             319:  225(ivec3) BitwiseOr 317 318
+                              Store 227(uv) 319
+             320:     14(int) Load 200(i16)
+             321:     27(int) SConvert 320
+             322:     27(int) Load 220(i)
+             323:     27(int) BitwiseOr 321 322
+                              Store 220(i) 323
+             324:     14(int) Load 200(i16)
+             325:     71(int) SConvert 324
+             326:     71(int) Load 243(i64)
+             327:     71(int) BitwiseAnd 326 325
+                              Store 243(i64) 327
+             328:  193(ivec3) Load 195(u16v)
+             329:  225(ivec3) UConvert 328
+             330:  225(ivec3) Load 227(uv)
+             331:  225(ivec3) BitwiseAnd 329 330
+                              Store 227(uv) 331
+             332:     14(int) Load 200(i16)
+             333:     27(int) SConvert 332
+             334:     17(int) Bitcast 333
+             335:  225(ivec3) Load 227(uv)
+             336:  225(ivec3) CompositeConstruct 334 334 334
+             337:  225(ivec3) BitwiseXor 335 336
+                              Store 227(uv) 337
+             338:  193(ivec3) Load 195(u16v)
+             339:     14(int) Load 200(i16)
+             340:     36(int) Bitcast 339
+             341:  193(ivec3) CompositeConstruct 340 340 340
+             342:  193(ivec3) BitwiseXor 338 341
+                              Store 195(u16v) 342
                               Return
                               FunctionEnd
 12(builtinFuncs():           2 Function None 3
               13:             Label
-       345(i16v):     53(ptr) Variable Function
-        348(i16):     15(ptr) Variable Function
-       358(u16v):    194(ptr) Variable Function
-        360(u16):     37(ptr) Variable Function
-        430(i32):    219(ptr) Variable Function
-        433(i64):    242(ptr) Variable Function
-      436(i16v4):    435(ptr) Variable Function
-        439(u32):    298(ptr) Variable Function
-      440(u16v2):     58(ptr) Variable Function
-        444(u64):    443(ptr) Variable Function
-      447(u16v4):    446(ptr) Variable Function
-         459(bv):    458(ptr) Variable Function
-             346:   52(ivec2) Load 345(i16v)
-             347:   52(ivec2) ExtInst 1(GLSL.std.450) 5(SAbs) 346
-                              Store 345(i16v) 347
-             349:     14(int) Load 348(i16)
-             350:     14(int) ExtInst 1(GLSL.std.450) 7(SSign) 349
-                              Store 348(i16) 350
-             351:   52(ivec2) Load 345(i16v)
-             352:     14(int) Load 348(i16)
-             353:   52(ivec2) CompositeConstruct 352 352
-             354:   52(ivec2) ExtInst 1(GLSL.std.450) 39(SMin) 351 353
-                              Store 345(i16v) 354
-             355:   52(ivec2) Load 345(i16v)
-             357:   52(ivec2) ExtInst 1(GLSL.std.450) 39(SMin) 355 356
-                              Store 345(i16v) 357
-             359:  193(ivec3) Load 358(u16v)
-             361:     36(int) Load 360(u16)
-             362:  193(ivec3) CompositeConstruct 361 361 361
-             363:  193(ivec3) ExtInst 1(GLSL.std.450) 38(UMin) 359 362
-                              Store 358(u16v) 363
-             364:  193(ivec3) Load 358(u16v)
-             366:  193(ivec3) ExtInst 1(GLSL.std.450) 38(UMin) 364 365
-                              Store 358(u16v) 366
-             367:   52(ivec2) Load 345(i16v)
-             368:     14(int) Load 348(i16)
-             369:   52(ivec2) CompositeConstruct 368 368
-             370:   52(ivec2) ExtInst 1(GLSL.std.450) 42(SMax) 367 369
-                              Store 345(i16v) 370
-             371:   52(ivec2) Load 345(i16v)
-             372:   52(ivec2) ExtInst 1(GLSL.std.450) 42(SMax) 371 356
-                              Store 345(i16v) 372
-             373:  193(ivec3) Load 358(u16v)
-             374:     36(int) Load 360(u16)
-             375:  193(ivec3) CompositeConstruct 374 374 374
-             376:  193(ivec3) ExtInst 1(GLSL.std.450) 41(UMax) 373 375
-                              Store 358(u16v) 376
-             377:  193(ivec3) Load 358(u16v)
-             378:  193(ivec3) ExtInst 1(GLSL.std.450) 41(UMax) 377 365
-                              Store 358(u16v) 378
-             379:   52(ivec2) Load 345(i16v)
-             380:     14(int) Load 348(i16)
-             381:     14(int) SNegate 380
-             382:     14(int) Load 348(i16)
-             383:   52(ivec2) CompositeConstruct 381 381
-             384:   52(ivec2) CompositeConstruct 382 382
-             385:   52(ivec2) ExtInst 1(GLSL.std.450) 45(SClamp) 379 383 384
-                              Store 345(i16v) 385
-             386:   52(ivec2) Load 345(i16v)
-             387:   52(ivec2) Load 345(i16v)
-             388:   52(ivec2) SNegate 387
-             389:   52(ivec2) Load 345(i16v)
-             390:   52(ivec2) ExtInst 1(GLSL.std.450) 45(SClamp) 386 388 389
-                              Store 345(i16v) 390
-             391:  193(ivec3) Load 358(u16v)
-             392:     36(int) Load 360(u16)
-             393:     36(int) SNegate 392
-             394:     36(int) Load 360(u16)
-             395:  193(ivec3) CompositeConstruct 393 393 393
-             396:  193(ivec3) CompositeConstruct 394 394 394
-             397:  193(ivec3) ExtInst 1(GLSL.std.450) 44(UClamp) 391 395 396
-                              Store 358(u16v) 397
-             398:  193(ivec3) Load 358(u16v)
-             399:  193(ivec3) Load 358(u16v)
-             400:  193(ivec3) SNegate 399
-             401:  193(ivec3) Load 358(u16v)
-             402:  193(ivec3) ExtInst 1(GLSL.std.450) 44(UClamp) 398 400 401
-                              Store 358(u16v) 402
-             403:     15(ptr) AccessChain 345(i16v) 284
+       343(i16v):     53(ptr) Variable Function
+        346(i16):     15(ptr) Variable Function
+       356(u16v):    194(ptr) Variable Function
+        358(u16):     37(ptr) Variable Function
+        428(i32):    219(ptr) Variable Function
+        431(i64):    242(ptr) Variable Function
+      434(i16v4):    433(ptr) Variable Function
+        437(u32):    296(ptr) Variable Function
+      438(u16v2):     58(ptr) Variable Function
+        442(u64):    441(ptr) Variable Function
+      445(u16v4):    444(ptr) Variable Function
+         457(bv):    456(ptr) Variable Function
+             344:   52(ivec2) Load 343(i16v)
+             345:   52(ivec2) ExtInst 1(GLSL.std.450) 5(SAbs) 344
+                              Store 343(i16v) 345
+             347:     14(int) Load 346(i16)
+             348:     14(int) ExtInst 1(GLSL.std.450) 7(SSign) 347
+                              Store 346(i16) 348
+             349:   52(ivec2) Load 343(i16v)
+             350:     14(int) Load 346(i16)
+             351:   52(ivec2) CompositeConstruct 350 350
+             352:   52(ivec2) ExtInst 1(GLSL.std.450) 39(SMin) 349 351
+                              Store 343(i16v) 352
+             353:   52(ivec2) Load 343(i16v)
+             355:   52(ivec2) ExtInst 1(GLSL.std.450) 39(SMin) 353 354
+                              Store 343(i16v) 355
+             357:  193(ivec3) Load 356(u16v)
+             359:     36(int) Load 358(u16)
+             360:  193(ivec3) CompositeConstruct 359 359 359
+             361:  193(ivec3) ExtInst 1(GLSL.std.450) 38(UMin) 357 360
+                              Store 356(u16v) 361
+             362:  193(ivec3) Load 356(u16v)
+             364:  193(ivec3) ExtInst 1(GLSL.std.450) 38(UMin) 362 363
+                              Store 356(u16v) 364
+             365:   52(ivec2) Load 343(i16v)
+             366:     14(int) Load 346(i16)
+             367:   52(ivec2) CompositeConstruct 366 366
+             368:   52(ivec2) ExtInst 1(GLSL.std.450) 42(SMax) 365 367
+                              Store 343(i16v) 368
+             369:   52(ivec2) Load 343(i16v)
+             370:   52(ivec2) ExtInst 1(GLSL.std.450) 42(SMax) 369 354
+                              Store 343(i16v) 370
+             371:  193(ivec3) Load 356(u16v)
+             372:     36(int) Load 358(u16)
+             373:  193(ivec3) CompositeConstruct 372 372 372
+             374:  193(ivec3) ExtInst 1(GLSL.std.450) 41(UMax) 371 373
+                              Store 356(u16v) 374
+             375:  193(ivec3) Load 356(u16v)
+             376:  193(ivec3) ExtInst 1(GLSL.std.450) 41(UMax) 375 363
+                              Store 356(u16v) 376
+             377:   52(ivec2) Load 343(i16v)
+             378:     14(int) Load 346(i16)
+             379:     14(int) SNegate 378
+             380:     14(int) Load 346(i16)
+             381:   52(ivec2) CompositeConstruct 379 379
+             382:   52(ivec2) CompositeConstruct 380 380
+             383:   52(ivec2) ExtInst 1(GLSL.std.450) 45(SClamp) 377 381 382
+                              Store 343(i16v) 383
+             384:   52(ivec2) Load 343(i16v)
+             385:   52(ivec2) Load 343(i16v)
+             386:   52(ivec2) SNegate 385
+             387:   52(ivec2) Load 343(i16v)
+             388:   52(ivec2) ExtInst 1(GLSL.std.450) 45(SClamp) 384 386 387
+                              Store 343(i16v) 388
+             389:  193(ivec3) Load 356(u16v)
+             390:     36(int) Load 358(u16)
+             391:     36(int) SNegate 390
+             392:     36(int) Load 358(u16)
+             393:  193(ivec3) CompositeConstruct 391 391 391
+             394:  193(ivec3) CompositeConstruct 392 392 392
+             395:  193(ivec3) ExtInst 1(GLSL.std.450) 44(UClamp) 389 393 394
+                              Store 356(u16v) 395
+             396:  193(ivec3) Load 356(u16v)
+             397:  193(ivec3) Load 356(u16v)
+             398:  193(ivec3) SNegate 397
+             399:  193(ivec3) Load 356(u16v)
+             400:  193(ivec3) ExtInst 1(GLSL.std.450) 44(UClamp) 396 398 399
+                              Store 356(u16v) 400
+             401:     15(ptr) AccessChain 343(i16v) 282
+             402:     14(int) Load 401
+             403:     15(ptr) AccessChain 343(i16v) 264
              404:     14(int) Load 403
-             405:     15(ptr) AccessChain 345(i16v) 264
-             406:     14(int) Load 405
-             408:     14(int) Select 407 406 404
-                              Store 348(i16) 408
-             409:     14(int) Load 348(i16)
-             410:   52(ivec2) CompositeConstruct 409 409
-             411:     14(int) Load 348(i16)
-             412:     14(int) SNegate 411
-             413:   52(ivec2) CompositeConstruct 412 412
-             416:   52(ivec2) Select 415 413 410
-                              Store 345(i16v) 416
-             417:     37(ptr) AccessChain 358(u16v) 284
+             406:     14(int) Select 405 404 402
+                              Store 346(i16) 406
+             407:     14(int) Load 346(i16)
+             408:   52(ivec2) CompositeConstruct 407 407
+             409:     14(int) Load 346(i16)
+             410:     14(int) SNegate 409
+             411:   52(ivec2) CompositeConstruct 410 410
+             414:   52(ivec2) Select 413 411 408
+                              Store 343(i16v) 414
+             415:     37(ptr) AccessChain 356(u16v) 282
+             416:     36(int) Load 415
+             417:     37(ptr) AccessChain 356(u16v) 264
              418:     36(int) Load 417
-             419:     37(ptr) AccessChain 358(u16v) 264
-             420:     36(int) Load 419
-             421:     36(int) Select 407 420 418
-                              Store 360(u16) 421
-             422:     36(int) Load 360(u16)
-             423:  193(ivec3) CompositeConstruct 422 422 422
-             424:     36(int) Load 360(u16)
-             425:     36(int) SNegate 424
-             426:  193(ivec3) CompositeConstruct 425 425 425
-             429:  193(ivec3) Select 428 426 423
-                              Store 358(u16v) 429
-             431:   52(ivec2) Load 345(i16v)
-             432:     27(int) Bitcast 431
-                              Store 430(i32) 432
-             437:  434(ivec4) Load 436(i16v4)
-             438:     71(int) Bitcast 437
-                              Store 433(i64) 438
-             441:   57(ivec2) Load 440(u16v2)
-             442:     17(int) Bitcast 441
-                              Store 439(u32) 442
-             448:  445(ivec4) Load 447(u16v4)
-             449:     77(int) Bitcast 448
-                              Store 444(u64) 449
-             450:     27(int) Load 430(i32)
-             451:   52(ivec2) Bitcast 450
-                              Store 345(i16v) 451
-             452:     71(int) Load 433(i64)
-             453:  434(ivec4) Bitcast 452
-                              Store 436(i16v4) 453
-             454:     17(int) Load 439(u32)
-             455:   57(ivec2) Bitcast 454
-                              Store 440(u16v2) 455
-             456:     77(int) Load 444(u64)
-             457:  445(ivec4) Bitcast 456
-                              Store 447(u16v4) 457
-             460:  193(ivec3) Load 358(u16v)
-             461:     36(int) Load 360(u16)
-             462:  193(ivec3) CompositeConstruct 461 461 461
-             463:  427(bvec3) ULessThan 460 462
-                              Store 459(bv) 463
-             464:   52(ivec2) Load 345(i16v)
-             465:     14(int) Load 348(i16)
-             466:   52(ivec2) CompositeConstruct 465 465
-             467:  174(bvec2) SLessThan 464 466
-             468:  427(bvec3) Load 459(bv)
-             469:  427(bvec3) VectorShuffle 468 467 3 4 2
-                              Store 459(bv) 469
-             470:  193(ivec3) Load 358(u16v)
-             471:     36(int) Load 360(u16)
-             472:  193(ivec3) CompositeConstruct 471 471 471
-             473:  427(bvec3) ULessThanEqual 470 472
-                              Store 459(bv) 473
-             474:   52(ivec2) Load 345(i16v)
-             475:     14(int) Load 348(i16)
-             476:   52(ivec2) CompositeConstruct 475 475
-             477:  174(bvec2) SLessThanEqual 474 476
-             478:  427(bvec3) Load 459(bv)
-             479:  427(bvec3) VectorShuffle 478 477 3 4 2
-                              Store 459(bv) 479
-             480:  193(ivec3) Load 358(u16v)
-             481:     36(int) Load 360(u16)
-             482:  193(ivec3) CompositeConstruct 481 481 481
-             483:  427(bvec3) UGreaterThan 480 482
-                              Store 459(bv) 483
-             484:   52(ivec2) Load 345(i16v)
-             485:     14(int) Load 348(i16)
-             486:   52(ivec2) CompositeConstruct 485 485
-             487:  174(bvec2) SGreaterThan 484 486
-             488:  427(bvec3) Load 459(bv)
-             489:  427(bvec3) VectorShuffle 488 487 3 4 2
-                              Store 459(bv) 489
-             490:  193(ivec3) Load 358(u16v)
-             491:     36(int) Load 360(u16)
-             492:  193(ivec3) CompositeConstruct 491 491 491
-             493:  427(bvec3) UGreaterThanEqual 490 492
-                              Store 459(bv) 493
-             494:   52(ivec2) Load 345(i16v)
-             495:     14(int) Load 348(i16)
-             496:   52(ivec2) CompositeConstruct 495 495
-             497:  174(bvec2) SGreaterThanEqual 494 496
-             498:  427(bvec3) Load 459(bv)
-             499:  427(bvec3) VectorShuffle 498 497 3 4 2
-                              Store 459(bv) 499
-             500:  193(ivec3) Load 358(u16v)
-             501:     36(int) Load 360(u16)
-             502:  193(ivec3) CompositeConstruct 501 501 501
-             503:  427(bvec3) IEqual 500 502
-                              Store 459(bv) 503
-             504:   52(ivec2) Load 345(i16v)
-             505:     14(int) Load 348(i16)
-             506:   52(ivec2) CompositeConstruct 505 505
-             507:  174(bvec2) IEqual 504 506
-             508:  427(bvec3) Load 459(bv)
-             509:  427(bvec3) VectorShuffle 508 507 3 4 2
-                              Store 459(bv) 509
-             510:  193(ivec3) Load 358(u16v)
-             511:     36(int) Load 360(u16)
-             512:  193(ivec3) CompositeConstruct 511 511 511
-             513:  427(bvec3) INotEqual 510 512
-                              Store 459(bv) 513
-             514:   52(ivec2) Load 345(i16v)
-             515:     14(int) Load 348(i16)
-             516:   52(ivec2) CompositeConstruct 515 515
-             517:  174(bvec2) INotEqual 514 516
-             518:  427(bvec3) Load 459(bv)
-             519:  427(bvec3) VectorShuffle 518 517 3 4 2
-                              Store 459(bv) 519
+             419:     36(int) Select 405 418 416
+                              Store 358(u16) 419
+             420:     36(int) Load 358(u16)
+             421:  193(ivec3) CompositeConstruct 420 420 420
+             422:     36(int) Load 358(u16)
+             423:     36(int) SNegate 422
+             424:  193(ivec3) CompositeConstruct 423 423 423
+             427:  193(ivec3) Select 426 424 421
+                              Store 356(u16v) 427
+             429:   52(ivec2) Load 343(i16v)
+             430:     27(int) Bitcast 429
+                              Store 428(i32) 430
+             435:  432(ivec4) Load 434(i16v4)
+             436:     71(int) Bitcast 435
+                              Store 431(i64) 436
+             439:   57(ivec2) Load 438(u16v2)
+             440:     17(int) Bitcast 439
+                              Store 437(u32) 440
+             446:  443(ivec4) Load 445(u16v4)
+             447:     77(int) Bitcast 446
+                              Store 442(u64) 447
+             448:     27(int) Load 428(i32)
+             449:   52(ivec2) Bitcast 448
+                              Store 343(i16v) 449
+             450:     71(int) Load 431(i64)
+             451:  432(ivec4) Bitcast 450
+                              Store 434(i16v4) 451
+             452:     17(int) Load 437(u32)
+             453:   57(ivec2) Bitcast 452
+                              Store 438(u16v2) 453
+             454:     77(int) Load 442(u64)
+             455:  443(ivec4) Bitcast 454
+                              Store 445(u16v4) 455
+             458:  193(ivec3) Load 356(u16v)
+             459:     36(int) Load 358(u16)
+             460:  193(ivec3) CompositeConstruct 459 459 459
+             461:  425(bvec3) ULessThan 458 460
+                              Store 457(bv) 461
+             462:   52(ivec2) Load 343(i16v)
+             463:     14(int) Load 346(i16)
+             464:   52(ivec2) CompositeConstruct 463 463
+             465:  174(bvec2) SLessThan 462 464
+             466:  425(bvec3) Load 457(bv)
+             467:  425(bvec3) VectorShuffle 466 465 3 4 2
+                              Store 457(bv) 467
+             468:  193(ivec3) Load 356(u16v)
+             469:     36(int) Load 358(u16)
+             470:  193(ivec3) CompositeConstruct 469 469 469
+             471:  425(bvec3) ULessThanEqual 468 470
+                              Store 457(bv) 471
+             472:   52(ivec2) Load 343(i16v)
+             473:     14(int) Load 346(i16)
+             474:   52(ivec2) CompositeConstruct 473 473
+             475:  174(bvec2) SLessThanEqual 472 474
+             476:  425(bvec3) Load 457(bv)
+             477:  425(bvec3) VectorShuffle 476 475 3 4 2
+                              Store 457(bv) 477
+             478:  193(ivec3) Load 356(u16v)
+             479:     36(int) Load 358(u16)
+             480:  193(ivec3) CompositeConstruct 479 479 479
+             481:  425(bvec3) UGreaterThan 478 480
+                              Store 457(bv) 481
+             482:   52(ivec2) Load 343(i16v)
+             483:     14(int) Load 346(i16)
+             484:   52(ivec2) CompositeConstruct 483 483
+             485:  174(bvec2) SGreaterThan 482 484
+             486:  425(bvec3) Load 457(bv)
+             487:  425(bvec3) VectorShuffle 486 485 3 4 2
+                              Store 457(bv) 487
+             488:  193(ivec3) Load 356(u16v)
+             489:     36(int) Load 358(u16)
+             490:  193(ivec3) CompositeConstruct 489 489 489
+             491:  425(bvec3) UGreaterThanEqual 488 490
+                              Store 457(bv) 491
+             492:   52(ivec2) Load 343(i16v)
+             493:     14(int) Load 346(i16)
+             494:   52(ivec2) CompositeConstruct 493 493
+             495:  174(bvec2) SGreaterThanEqual 492 494
+             496:  425(bvec3) Load 457(bv)
+             497:  425(bvec3) VectorShuffle 496 495 3 4 2
+                              Store 457(bv) 497
+             498:  193(ivec3) Load 356(u16v)
+             499:     36(int) Load 358(u16)
+             500:  193(ivec3) CompositeConstruct 499 499 499
+             501:  425(bvec3) IEqual 498 500
+                              Store 457(bv) 501
+             502:   52(ivec2) Load 343(i16v)
+             503:     14(int) Load 346(i16)
+             504:   52(ivec2) CompositeConstruct 503 503
+             505:  174(bvec2) IEqual 502 504
+             506:  425(bvec3) Load 457(bv)
+             507:  425(bvec3) VectorShuffle 506 505 3 4 2
+                              Store 457(bv) 507
+             508:  193(ivec3) Load 356(u16v)
+             509:     36(int) Load 358(u16)
+             510:  193(ivec3) CompositeConstruct 509 509 509
+             511:  425(bvec3) INotEqual 508 510
+                              Store 457(bv) 511
+             512:   52(ivec2) Load 343(i16v)
+             513:     14(int) Load 346(i16)
+             514:   52(ivec2) CompositeConstruct 513 513
+             515:  174(bvec2) INotEqual 512 514
+             516:  425(bvec3) Load 457(bv)
+             517:  425(bvec3) VectorShuffle 516 515 3 4 2
+                              Store 457(bv) 517
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.int32.frag.out b/Test/baseResults/spv.int32.frag.out
index a6d07d032d872c2adb4b79004225ae122c4dff66..c615672f2d91e29a9964ec8dc40c5f7def7fcab9 100644
--- a/Test/baseResults/spv.int32.frag.out
+++ b/Test/baseResults/spv.int32.frag.out
@@ -1,7 +1,7 @@
 spv.int32.frag
 // Module Version 10300
 // Generated by (magic number): 80006
-// Id's are bound by 495
+// Id's are bound by 493
 
                               Capability Shader
                               Capability Float16
@@ -52,54 +52,54 @@ spv.int32.frag
                               Name 210  "i"
                               Name 214  "uv"
                               Name 227  "i64"
-                              Name 262  "b"
-                              Name 314  "i32v"
-                              Name 317  "i32"
-                              Name 327  "u32v"
-                              Name 329  "u32"
-                              Name 401  "i8v4"
-                              Name 404  "i16v2"
-                              Name 409  "u8v4"
-                              Name 412  "u16v2"
-                              Name 415  "i64"
-                              Name 418  "u32v2"
-                              Name 420  "u64"
-                              Name 424  "bv"
-                              Name 487  "Block"
-                              MemberName 487(Block) 0  "i32"
-                              MemberName 487(Block) 1  "i32v2"
-                              MemberName 487(Block) 2  "i32v3"
-                              MemberName 487(Block) 3  "i32v4"
-                              MemberName 487(Block) 4  "u32"
-                              MemberName 487(Block) 5  "u32v2"
-                              MemberName 487(Block) 6  "u32v3"
-                              MemberName 487(Block) 7  "u32v4"
-                              Name 489  "block"
-                              Name 490  "si32"
-                              Name 491  "su32"
-                              Name 492  "si"
-                              Name 493  "su"
-                              Name 494  "sb"
+                              Name 260  "b"
+                              Name 312  "i32v"
+                              Name 315  "i32"
+                              Name 325  "u32v"
+                              Name 327  "u32"
+                              Name 399  "i8v4"
+                              Name 402  "i16v2"
+                              Name 407  "u8v4"
+                              Name 410  "u16v2"
+                              Name 413  "i64"
+                              Name 416  "u32v2"
+                              Name 418  "u64"
+                              Name 422  "bv"
+                              Name 485  "Block"
+                              MemberName 485(Block) 0  "i32"
+                              MemberName 485(Block) 1  "i32v2"
+                              MemberName 485(Block) 2  "i32v3"
+                              MemberName 485(Block) 3  "i32v4"
+                              MemberName 485(Block) 4  "u32"
+                              MemberName 485(Block) 5  "u32v2"
+                              MemberName 485(Block) 6  "u32v3"
+                              MemberName 485(Block) 7  "u32v4"
+                              Name 487  "block"
+                              Name 488  "si32"
+                              Name 489  "su32"
+                              Name 490  "si"
+                              Name 491  "su"
+                              Name 492  "sb"
                               MemberDecorate 27(Uniforms) 0 Offset 0
                               Decorate 27(Uniforms) Block
                               Decorate 29 DescriptorSet 0
                               Decorate 29 Binding 0
-                              MemberDecorate 487(Block) 0 Offset 0
-                              MemberDecorate 487(Block) 1 Offset 8
-                              MemberDecorate 487(Block) 2 Offset 16
-                              MemberDecorate 487(Block) 3 Offset 32
-                              MemberDecorate 487(Block) 4 Offset 48
-                              MemberDecorate 487(Block) 5 Offset 56
-                              MemberDecorate 487(Block) 6 Offset 64
-                              MemberDecorate 487(Block) 7 Offset 80
-                              Decorate 487(Block) Block
-                              Decorate 489(block) DescriptorSet 0
-                              Decorate 489(block) Binding 1
-                              Decorate 490(si32) SpecId 100
-                              Decorate 491(su32) SpecId 101
-                              Decorate 492(si) SpecId 102
-                              Decorate 493(su) SpecId 103
-                              Decorate 494(sb) SpecId 104
+                              MemberDecorate 485(Block) 0 Offset 0
+                              MemberDecorate 485(Block) 1 Offset 8
+                              MemberDecorate 485(Block) 2 Offset 16
+                              MemberDecorate 485(Block) 3 Offset 32
+                              MemberDecorate 485(Block) 4 Offset 48
+                              MemberDecorate 485(Block) 5 Offset 56
+                              MemberDecorate 485(Block) 6 Offset 64
+                              MemberDecorate 485(Block) 7 Offset 80
+                              Decorate 485(Block) Block
+                              Decorate 487(block) DescriptorSet 0
+                              Decorate 487(block) Binding 1
+                              Decorate 488(si32) SpecId 100
+                              Decorate 489(su32) SpecId 101
+                              Decorate 490(si) SpecId 102
+                              Decorate 491(su) SpecId 103
+                              Decorate 492(sb) SpecId 104
                2:             TypeVoid
                3:             TypeFunction 2
               14:             TypeInt 32 0
@@ -171,30 +171,30 @@ spv.int32.frag
              188:             TypeVector 18(int) 3
              226:             TypePointer Function 57(int)
              251:     14(int) Constant 2
-             261:             TypePointer Function 165(bool)
-             325:   52(ivec2) ConstantComposite 24 24
-             334:  184(ivec3) ConstantComposite 175 175 175
-             376:   165(bool) ConstantTrue
-             383:   165(bool) ConstantFalse
-             384:  166(bvec2) ConstantComposite 383 383
-             396:             TypeVector 165(bool) 3
-             397:  396(bvec3) ConstantComposite 383 383 383
-             399:             TypeVector 91(int) 4
-             400:             TypePointer Function 399(ivec4)
-             407:             TypeVector 120(int) 4
-             408:             TypePointer Function 407(ivec4)
-             419:             TypePointer Function 63(int)
-             423:             TypePointer Function 396(bvec3)
-             485:             TypeVector 18(int) 4
-             486:             TypeVector 14(int) 4
-      487(Block):             TypeStruct 18(int) 52(ivec2) 188(ivec3) 485(ivec4) 14(int) 49(ivec2) 184(ivec3) 486(ivec4)
-             488:             TypePointer Uniform 487(Block)
-      489(block):    488(ptr) Variable Uniform
-       490(si32):     18(int) SpecConstant 4294967286
-       491(su32):     14(int) SpecConstant 20
-         492(si):     18(int) SpecConstant 4294967291
-         493(su):     14(int) SpecConstant 4
-         494(sb):   165(bool) SpecConstantTrue
+             259:             TypePointer Function 165(bool)
+             323:   52(ivec2) ConstantComposite 24 24
+             332:  184(ivec3) ConstantComposite 175 175 175
+             374:   165(bool) ConstantTrue
+             381:   165(bool) ConstantFalse
+             382:  166(bvec2) ConstantComposite 381 381
+             394:             TypeVector 165(bool) 3
+             395:  394(bvec3) ConstantComposite 381 381 381
+             397:             TypeVector 91(int) 4
+             398:             TypePointer Function 397(ivec4)
+             405:             TypeVector 120(int) 4
+             406:             TypePointer Function 405(ivec4)
+             417:             TypePointer Function 63(int)
+             421:             TypePointer Function 394(bvec3)
+             483:             TypeVector 18(int) 4
+             484:             TypeVector 14(int) 4
+      485(Block):             TypeStruct 18(int) 52(ivec2) 188(ivec3) 483(ivec4) 14(int) 49(ivec2) 184(ivec3) 484(ivec4)
+             486:             TypePointer Uniform 485(Block)
+      487(block):    486(ptr) Variable Uniform
+       488(si32):     18(int) SpecConstant 4294967286
+       489(su32):     14(int) SpecConstant 20
+         490(si):     18(int) SpecConstant 4294967291
+         491(su):     14(int) SpecConstant 4
+         492(sb):   165(bool) SpecConstantTrue
          4(main):           2 Function None 3
                5:             Label
                               Store 16(u32Max) 17
@@ -360,7 +360,7 @@ spv.int32.frag
           210(i):     19(ptr) Variable Function
          214(uv):    185(ptr) Variable Function
         227(i64):    226(ptr) Variable Function
-          262(b):    261(ptr) Variable Function
+          260(b):    259(ptr) Variable Function
              187:  184(ivec3) Load 186(u32v)
              189:  188(ivec3) CompositeConstruct 170 170 170
              190:  184(ivec3) IAdd 187 189
@@ -440,275 +440,273 @@ spv.int32.frag
              250:     57(int) Load 227(i64)
              252:     38(ptr) AccessChain 186(u32v) 251
              253:     14(int) Load 252
-             254:     57(int) UConvert 253
-             255:     57(int) Bitcast 254
-             256:     57(int) ShiftLeftLogical 250 255
-                              Store 227(i64) 256
-             257:  184(ivec3) Load 186(u32v)
-             258:     18(int) Load 210(i)
-             259:  188(ivec3) CompositeConstruct 258 258 258
-             260:  184(ivec3) ShiftLeftLogical 257 259
-                              Store 214(uv) 260
-             263:     38(ptr) AccessChain 186(u32v) 175
-             264:     14(int) Load 263
-             265:     18(int) Load 191(i32)
-             266:     14(int) Bitcast 265
-             267:   165(bool) INotEqual 264 266
-                              Store 262(b) 267
-             268:     18(int) Load 191(i32)
-             269:     14(int) Bitcast 268
-             270:     38(ptr) AccessChain 186(u32v) 175
-             271:     14(int) Load 270
-             272:   165(bool) IEqual 269 271
-                              Store 262(b) 272
-             273:     38(ptr) AccessChain 186(u32v) 175
+             254:     57(int) ShiftLeftLogical 250 253
+                              Store 227(i64) 254
+             255:  184(ivec3) Load 186(u32v)
+             256:     18(int) Load 210(i)
+             257:  188(ivec3) CompositeConstruct 256 256 256
+             258:  184(ivec3) ShiftLeftLogical 255 257
+                              Store 214(uv) 258
+             261:     38(ptr) AccessChain 186(u32v) 175
+             262:     14(int) Load 261
+             263:     18(int) Load 191(i32)
+             264:     14(int) Bitcast 263
+             265:   165(bool) INotEqual 262 264
+                              Store 260(b) 265
+             266:     18(int) Load 191(i32)
+             267:     14(int) Bitcast 266
+             268:     38(ptr) AccessChain 186(u32v) 175
+             269:     14(int) Load 268
+             270:   165(bool) IEqual 267 269
+                              Store 260(b) 270
+             271:     38(ptr) AccessChain 186(u32v) 175
+             272:     14(int) Load 271
+             273:     38(ptr) AccessChain 214(uv) 176
              274:     14(int) Load 273
-             275:     38(ptr) AccessChain 214(uv) 176
-             276:     14(int) Load 275
-             277:   165(bool) UGreaterThan 274 276
-                              Store 262(b) 277
-             278:     18(int) Load 191(i32)
-             279:     18(int) Load 210(i)
-             280:   165(bool) SLessThan 278 279
-                              Store 262(b) 280
-             281:     38(ptr) AccessChain 186(u32v) 176
+             275:   165(bool) UGreaterThan 272 274
+                              Store 260(b) 275
+             276:     18(int) Load 191(i32)
+             277:     18(int) Load 210(i)
+             278:   165(bool) SLessThan 276 277
+                              Store 260(b) 278
+             279:     38(ptr) AccessChain 186(u32v) 176
+             280:     14(int) Load 279
+             281:     38(ptr) AccessChain 214(uv) 175
              282:     14(int) Load 281
-             283:     38(ptr) AccessChain 214(uv) 175
-             284:     14(int) Load 283
-             285:   165(bool) UGreaterThanEqual 282 284
-                              Store 262(b) 285
-             286:     18(int) Load 191(i32)
-             287:     18(int) Load 210(i)
-             288:   165(bool) SLessThanEqual 286 287
-                              Store 262(b) 288
-             289:     18(int) Load 191(i32)
-             290:     14(int) Bitcast 289
-             291:  184(ivec3) Load 214(uv)
-             292:  184(ivec3) CompositeConstruct 290 290 290
-             293:  184(ivec3) BitwiseOr 291 292
-                              Store 214(uv) 293
-             294:     18(int) Load 191(i32)
-             295:     18(int) Load 210(i)
-             296:     18(int) BitwiseOr 294 295
-                              Store 210(i) 296
-             297:     18(int) Load 191(i32)
-             298:     57(int) SConvert 297
-             299:     57(int) Load 227(i64)
-             300:     57(int) BitwiseAnd 299 298
-                              Store 227(i64) 300
-             301:  184(ivec3) Load 186(u32v)
-             302:  184(ivec3) Load 214(uv)
-             303:  184(ivec3) BitwiseAnd 301 302
-                              Store 214(uv) 303
-             304:     18(int) Load 191(i32)
-             305:     14(int) Bitcast 304
-             306:  184(ivec3) Load 214(uv)
-             307:  184(ivec3) CompositeConstruct 305 305 305
-             308:  184(ivec3) BitwiseXor 306 307
-                              Store 214(uv) 308
-             309:  184(ivec3) Load 186(u32v)
-             310:     18(int) Load 191(i32)
-             311:     14(int) Bitcast 310
-             312:  184(ivec3) CompositeConstruct 311 311 311
-             313:  184(ivec3) BitwiseXor 309 312
-                              Store 186(u32v) 313
+             283:   165(bool) UGreaterThanEqual 280 282
+                              Store 260(b) 283
+             284:     18(int) Load 191(i32)
+             285:     18(int) Load 210(i)
+             286:   165(bool) SLessThanEqual 284 285
+                              Store 260(b) 286
+             287:     18(int) Load 191(i32)
+             288:     14(int) Bitcast 287
+             289:  184(ivec3) Load 214(uv)
+             290:  184(ivec3) CompositeConstruct 288 288 288
+             291:  184(ivec3) BitwiseOr 289 290
+                              Store 214(uv) 291
+             292:     18(int) Load 191(i32)
+             293:     18(int) Load 210(i)
+             294:     18(int) BitwiseOr 292 293
+                              Store 210(i) 294
+             295:     18(int) Load 191(i32)
+             296:     57(int) SConvert 295
+             297:     57(int) Load 227(i64)
+             298:     57(int) BitwiseAnd 297 296
+                              Store 227(i64) 298
+             299:  184(ivec3) Load 186(u32v)
+             300:  184(ivec3) Load 214(uv)
+             301:  184(ivec3) BitwiseAnd 299 300
+                              Store 214(uv) 301
+             302:     18(int) Load 191(i32)
+             303:     14(int) Bitcast 302
+             304:  184(ivec3) Load 214(uv)
+             305:  184(ivec3) CompositeConstruct 303 303 303
+             306:  184(ivec3) BitwiseXor 304 305
+                              Store 214(uv) 306
+             307:  184(ivec3) Load 186(u32v)
+             308:     18(int) Load 191(i32)
+             309:     14(int) Bitcast 308
+             310:  184(ivec3) CompositeConstruct 309 309 309
+             311:  184(ivec3) BitwiseXor 307 310
+                              Store 186(u32v) 311
                               Return
                               FunctionEnd
 12(builtinFuncs():           2 Function None 3
               13:             Label
-       314(i32v):     53(ptr) Variable Function
-        317(i32):     19(ptr) Variable Function
-       327(u32v):    185(ptr) Variable Function
-        329(u32):     38(ptr) Variable Function
-       401(i8v4):    400(ptr) Variable Function
-      404(i16v2):    102(ptr) Variable Function
-       409(u8v4):    408(ptr) Variable Function
-      412(u16v2):    131(ptr) Variable Function
-        415(i64):    226(ptr) Variable Function
-      418(u32v2):     50(ptr) Variable Function
-        420(u64):    419(ptr) Variable Function
-         424(bv):    423(ptr) Variable Function
-             315:   52(ivec2) Load 314(i32v)
-             316:   52(ivec2) ExtInst 1(GLSL.std.450) 5(SAbs) 315
-                              Store 314(i32v) 316
-             318:     18(int) Load 317(i32)
-             319:     18(int) ExtInst 1(GLSL.std.450) 7(SSign) 318
-                              Store 317(i32) 319
-             320:   52(ivec2) Load 314(i32v)
-             321:     18(int) Load 317(i32)
-             322:   52(ivec2) CompositeConstruct 321 321
-             323:   52(ivec2) ExtInst 1(GLSL.std.450) 39(SMin) 320 322
-                              Store 314(i32v) 323
-             324:   52(ivec2) Load 314(i32v)
-             326:   52(ivec2) ExtInst 1(GLSL.std.450) 39(SMin) 324 325
-                              Store 314(i32v) 326
-             328:  184(ivec3) Load 327(u32v)
-             330:     14(int) Load 329(u32)
-             331:  184(ivec3) CompositeConstruct 330 330 330
-             332:  184(ivec3) ExtInst 1(GLSL.std.450) 38(UMin) 328 331
-                              Store 327(u32v) 332
-             333:  184(ivec3) Load 327(u32v)
-             335:  184(ivec3) ExtInst 1(GLSL.std.450) 38(UMin) 333 334
-                              Store 327(u32v) 335
-             336:   52(ivec2) Load 314(i32v)
-             337:     18(int) Load 317(i32)
-             338:   52(ivec2) CompositeConstruct 337 337
-             339:   52(ivec2) ExtInst 1(GLSL.std.450) 42(SMax) 336 338
-                              Store 314(i32v) 339
-             340:   52(ivec2) Load 314(i32v)
-             341:   52(ivec2) ExtInst 1(GLSL.std.450) 42(SMax) 340 325
-                              Store 314(i32v) 341
-             342:  184(ivec3) Load 327(u32v)
-             343:     14(int) Load 329(u32)
-             344:  184(ivec3) CompositeConstruct 343 343 343
-             345:  184(ivec3) ExtInst 1(GLSL.std.450) 41(UMax) 342 344
-                              Store 327(u32v) 345
-             346:  184(ivec3) Load 327(u32v)
-             347:  184(ivec3) ExtInst 1(GLSL.std.450) 41(UMax) 346 334
-                              Store 327(u32v) 347
-             348:   52(ivec2) Load 314(i32v)
-             349:     18(int) Load 317(i32)
-             350:     18(int) SNegate 349
-             351:     18(int) Load 317(i32)
-             352:   52(ivec2) CompositeConstruct 350 350
-             353:   52(ivec2) CompositeConstruct 351 351
-             354:   52(ivec2) ExtInst 1(GLSL.std.450) 45(SClamp) 348 352 353
-                              Store 314(i32v) 354
-             355:   52(ivec2) Load 314(i32v)
-             356:   52(ivec2) Load 314(i32v)
-             357:   52(ivec2) SNegate 356
-             358:   52(ivec2) Load 314(i32v)
-             359:   52(ivec2) ExtInst 1(GLSL.std.450) 45(SClamp) 355 357 358
-                              Store 314(i32v) 359
-             360:  184(ivec3) Load 327(u32v)
-             361:     14(int) Load 329(u32)
-             362:     14(int) SNegate 361
-             363:     14(int) Load 329(u32)
-             364:  184(ivec3) CompositeConstruct 362 362 362
-             365:  184(ivec3) CompositeConstruct 363 363 363
-             366:  184(ivec3) ExtInst 1(GLSL.std.450) 44(UClamp) 360 364 365
-                              Store 327(u32v) 366
-             367:  184(ivec3) Load 327(u32v)
-             368:  184(ivec3) Load 327(u32v)
-             369:  184(ivec3) SNegate 368
-             370:  184(ivec3) Load 327(u32v)
-             371:  184(ivec3) ExtInst 1(GLSL.std.450) 44(UClamp) 367 369 370
-                              Store 327(u32v) 371
-             372:     19(ptr) AccessChain 314(i32v) 175
+       312(i32v):     53(ptr) Variable Function
+        315(i32):     19(ptr) Variable Function
+       325(u32v):    185(ptr) Variable Function
+        327(u32):     38(ptr) Variable Function
+       399(i8v4):    398(ptr) Variable Function
+      402(i16v2):    102(ptr) Variable Function
+       407(u8v4):    406(ptr) Variable Function
+      410(u16v2):    131(ptr) Variable Function
+        413(i64):    226(ptr) Variable Function
+      416(u32v2):     50(ptr) Variable Function
+        418(u64):    417(ptr) Variable Function
+         422(bv):    421(ptr) Variable Function
+             313:   52(ivec2) Load 312(i32v)
+             314:   52(ivec2) ExtInst 1(GLSL.std.450) 5(SAbs) 313
+                              Store 312(i32v) 314
+             316:     18(int) Load 315(i32)
+             317:     18(int) ExtInst 1(GLSL.std.450) 7(SSign) 316
+                              Store 315(i32) 317
+             318:   52(ivec2) Load 312(i32v)
+             319:     18(int) Load 315(i32)
+             320:   52(ivec2) CompositeConstruct 319 319
+             321:   52(ivec2) ExtInst 1(GLSL.std.450) 39(SMin) 318 320
+                              Store 312(i32v) 321
+             322:   52(ivec2) Load 312(i32v)
+             324:   52(ivec2) ExtInst 1(GLSL.std.450) 39(SMin) 322 323
+                              Store 312(i32v) 324
+             326:  184(ivec3) Load 325(u32v)
+             328:     14(int) Load 327(u32)
+             329:  184(ivec3) CompositeConstruct 328 328 328
+             330:  184(ivec3) ExtInst 1(GLSL.std.450) 38(UMin) 326 329
+                              Store 325(u32v) 330
+             331:  184(ivec3) Load 325(u32v)
+             333:  184(ivec3) ExtInst 1(GLSL.std.450) 38(UMin) 331 332
+                              Store 325(u32v) 333
+             334:   52(ivec2) Load 312(i32v)
+             335:     18(int) Load 315(i32)
+             336:   52(ivec2) CompositeConstruct 335 335
+             337:   52(ivec2) ExtInst 1(GLSL.std.450) 42(SMax) 334 336
+                              Store 312(i32v) 337
+             338:   52(ivec2) Load 312(i32v)
+             339:   52(ivec2) ExtInst 1(GLSL.std.450) 42(SMax) 338 323
+                              Store 312(i32v) 339
+             340:  184(ivec3) Load 325(u32v)
+             341:     14(int) Load 327(u32)
+             342:  184(ivec3) CompositeConstruct 341 341 341
+             343:  184(ivec3) ExtInst 1(GLSL.std.450) 41(UMax) 340 342
+                              Store 325(u32v) 343
+             344:  184(ivec3) Load 325(u32v)
+             345:  184(ivec3) ExtInst 1(GLSL.std.450) 41(UMax) 344 332
+                              Store 325(u32v) 345
+             346:   52(ivec2) Load 312(i32v)
+             347:     18(int) Load 315(i32)
+             348:     18(int) SNegate 347
+             349:     18(int) Load 315(i32)
+             350:   52(ivec2) CompositeConstruct 348 348
+             351:   52(ivec2) CompositeConstruct 349 349
+             352:   52(ivec2) ExtInst 1(GLSL.std.450) 45(SClamp) 346 350 351
+                              Store 312(i32v) 352
+             353:   52(ivec2) Load 312(i32v)
+             354:   52(ivec2) Load 312(i32v)
+             355:   52(ivec2) SNegate 354
+             356:   52(ivec2) Load 312(i32v)
+             357:   52(ivec2) ExtInst 1(GLSL.std.450) 45(SClamp) 353 355 356
+                              Store 312(i32v) 357
+             358:  184(ivec3) Load 325(u32v)
+             359:     14(int) Load 327(u32)
+             360:     14(int) SNegate 359
+             361:     14(int) Load 327(u32)
+             362:  184(ivec3) CompositeConstruct 360 360 360
+             363:  184(ivec3) CompositeConstruct 361 361 361
+             364:  184(ivec3) ExtInst 1(GLSL.std.450) 44(UClamp) 358 362 363
+                              Store 325(u32v) 364
+             365:  184(ivec3) Load 325(u32v)
+             366:  184(ivec3) Load 325(u32v)
+             367:  184(ivec3) SNegate 366
+             368:  184(ivec3) Load 325(u32v)
+             369:  184(ivec3) ExtInst 1(GLSL.std.450) 44(UClamp) 365 367 368
+                              Store 325(u32v) 369
+             370:     19(ptr) AccessChain 312(i32v) 175
+             371:     18(int) Load 370
+             372:     19(ptr) AccessChain 312(i32v) 176
              373:     18(int) Load 372
-             374:     19(ptr) AccessChain 314(i32v) 176
-             375:     18(int) Load 374
-             377:     18(int) Select 376 375 373
-                              Store 317(i32) 377
-             378:     18(int) Load 317(i32)
-             379:   52(ivec2) CompositeConstruct 378 378
-             380:     18(int) Load 317(i32)
-             381:     18(int) SNegate 380
-             382:   52(ivec2) CompositeConstruct 381 381
-             385:   52(ivec2) Select 384 382 379
-                              Store 314(i32v) 385
-             386:     38(ptr) AccessChain 327(u32v) 175
+             375:     18(int) Select 374 373 371
+                              Store 315(i32) 375
+             376:     18(int) Load 315(i32)
+             377:   52(ivec2) CompositeConstruct 376 376
+             378:     18(int) Load 315(i32)
+             379:     18(int) SNegate 378
+             380:   52(ivec2) CompositeConstruct 379 379
+             383:   52(ivec2) Select 382 380 377
+                              Store 312(i32v) 383
+             384:     38(ptr) AccessChain 325(u32v) 175
+             385:     14(int) Load 384
+             386:     38(ptr) AccessChain 325(u32v) 176
              387:     14(int) Load 386
-             388:     38(ptr) AccessChain 327(u32v) 176
-             389:     14(int) Load 388
-             390:     14(int) Select 376 389 387
-                              Store 329(u32) 390
-             391:     14(int) Load 329(u32)
-             392:  184(ivec3) CompositeConstruct 391 391 391
-             393:     14(int) Load 329(u32)
-             394:     14(int) SNegate 393
-             395:  184(ivec3) CompositeConstruct 394 394 394
-             398:  184(ivec3) Select 397 395 392
-                              Store 327(u32v) 398
-             402:  399(ivec4) Load 401(i8v4)
-             403:     18(int) Bitcast 402
-                              Store 317(i32) 403
-             405:  101(ivec2) Load 404(i16v2)
-             406:     18(int) Bitcast 405
-                              Store 317(i32) 406
-             410:  407(ivec4) Load 409(u8v4)
-             411:     14(int) Bitcast 410
-                              Store 329(u32) 411
-             413:  130(ivec2) Load 412(u16v2)
-             414:     14(int) Bitcast 413
-                              Store 329(u32) 414
-             416:     57(int) Load 415(i64)
-             417:   52(ivec2) Bitcast 416
-                              Store 314(i32v) 417
-             421:     63(int) Load 420(u64)
-             422:   49(ivec2) Bitcast 421
-                              Store 418(u32v2) 422
-             425:  184(ivec3) Load 327(u32v)
-             426:     14(int) Load 329(u32)
-             427:  184(ivec3) CompositeConstruct 426 426 426
-             428:  396(bvec3) ULessThan 425 427
-                              Store 424(bv) 428
-             429:   52(ivec2) Load 314(i32v)
-             430:     18(int) Load 317(i32)
-             431:   52(ivec2) CompositeConstruct 430 430
-             432:  166(bvec2) SLessThan 429 431
-             433:  396(bvec3) Load 424(bv)
-             434:  396(bvec3) VectorShuffle 433 432 3 4 2
-                              Store 424(bv) 434
-             435:  184(ivec3) Load 327(u32v)
-             436:     14(int) Load 329(u32)
-             437:  184(ivec3) CompositeConstruct 436 436 436
-             438:  396(bvec3) ULessThanEqual 435 437
-                              Store 424(bv) 438
-             439:   52(ivec2) Load 314(i32v)
-             440:     18(int) Load 317(i32)
-             441:   52(ivec2) CompositeConstruct 440 440
-             442:  166(bvec2) SLessThanEqual 439 441
-             443:  396(bvec3) Load 424(bv)
-             444:  396(bvec3) VectorShuffle 443 442 3 4 2
-                              Store 424(bv) 444
-             445:  184(ivec3) Load 327(u32v)
-             446:     14(int) Load 329(u32)
-             447:  184(ivec3) CompositeConstruct 446 446 446
-             448:  396(bvec3) UGreaterThan 445 447
-                              Store 424(bv) 448
-             449:   52(ivec2) Load 314(i32v)
-             450:     18(int) Load 317(i32)
-             451:   52(ivec2) CompositeConstruct 450 450
-             452:  166(bvec2) SGreaterThan 449 451
-             453:  396(bvec3) Load 424(bv)
-             454:  396(bvec3) VectorShuffle 453 452 3 4 2
-                              Store 424(bv) 454
-             455:  184(ivec3) Load 327(u32v)
-             456:     14(int) Load 329(u32)
-             457:  184(ivec3) CompositeConstruct 456 456 456
-             458:  396(bvec3) UGreaterThanEqual 455 457
-                              Store 424(bv) 458
-             459:   52(ivec2) Load 314(i32v)
-             460:     18(int) Load 317(i32)
-             461:   52(ivec2) CompositeConstruct 460 460
-             462:  166(bvec2) SGreaterThanEqual 459 461
-             463:  396(bvec3) Load 424(bv)
-             464:  396(bvec3) VectorShuffle 463 462 3 4 2
-                              Store 424(bv) 464
-             465:  184(ivec3) Load 327(u32v)
-             466:     14(int) Load 329(u32)
-             467:  184(ivec3) CompositeConstruct 466 466 466
-             468:  396(bvec3) IEqual 465 467
-                              Store 424(bv) 468
-             469:   52(ivec2) Load 314(i32v)
-             470:     18(int) Load 317(i32)
-             471:   52(ivec2) CompositeConstruct 470 470
-             472:  166(bvec2) IEqual 469 471
-             473:  396(bvec3) Load 424(bv)
-             474:  396(bvec3) VectorShuffle 473 472 3 4 2
-                              Store 424(bv) 474
-             475:  184(ivec3) Load 327(u32v)
-             476:     14(int) Load 329(u32)
-             477:  184(ivec3) CompositeConstruct 476 476 476
-             478:  396(bvec3) INotEqual 475 477
-                              Store 424(bv) 478
-             479:   52(ivec2) Load 314(i32v)
-             480:     18(int) Load 317(i32)
-             481:   52(ivec2) CompositeConstruct 480 480
-             482:  166(bvec2) INotEqual 479 481
-             483:  396(bvec3) Load 424(bv)
-             484:  396(bvec3) VectorShuffle 483 482 3 4 2
-                              Store 424(bv) 484
+             388:     14(int) Select 374 387 385
+                              Store 327(u32) 388
+             389:     14(int) Load 327(u32)
+             390:  184(ivec3) CompositeConstruct 389 389 389
+             391:     14(int) Load 327(u32)
+             392:     14(int) SNegate 391
+             393:  184(ivec3) CompositeConstruct 392 392 392
+             396:  184(ivec3) Select 395 393 390
+                              Store 325(u32v) 396
+             400:  397(ivec4) Load 399(i8v4)
+             401:     18(int) Bitcast 400
+                              Store 315(i32) 401
+             403:  101(ivec2) Load 402(i16v2)
+             404:     18(int) Bitcast 403
+                              Store 315(i32) 404
+             408:  405(ivec4) Load 407(u8v4)
+             409:     14(int) Bitcast 408
+                              Store 327(u32) 409
+             411:  130(ivec2) Load 410(u16v2)
+             412:     14(int) Bitcast 411
+                              Store 327(u32) 412
+             414:     57(int) Load 413(i64)
+             415:   52(ivec2) Bitcast 414
+                              Store 312(i32v) 415
+             419:     63(int) Load 418(u64)
+             420:   49(ivec2) Bitcast 419
+                              Store 416(u32v2) 420
+             423:  184(ivec3) Load 325(u32v)
+             424:     14(int) Load 327(u32)
+             425:  184(ivec3) CompositeConstruct 424 424 424
+             426:  394(bvec3) ULessThan 423 425
+                              Store 422(bv) 426
+             427:   52(ivec2) Load 312(i32v)
+             428:     18(int) Load 315(i32)
+             429:   52(ivec2) CompositeConstruct 428 428
+             430:  166(bvec2) SLessThan 427 429
+             431:  394(bvec3) Load 422(bv)
+             432:  394(bvec3) VectorShuffle 431 430 3 4 2
+                              Store 422(bv) 432
+             433:  184(ivec3) Load 325(u32v)
+             434:     14(int) Load 327(u32)
+             435:  184(ivec3) CompositeConstruct 434 434 434
+             436:  394(bvec3) ULessThanEqual 433 435
+                              Store 422(bv) 436
+             437:   52(ivec2) Load 312(i32v)
+             438:     18(int) Load 315(i32)
+             439:   52(ivec2) CompositeConstruct 438 438
+             440:  166(bvec2) SLessThanEqual 437 439
+             441:  394(bvec3) Load 422(bv)
+             442:  394(bvec3) VectorShuffle 441 440 3 4 2
+                              Store 422(bv) 442
+             443:  184(ivec3) Load 325(u32v)
+             444:     14(int) Load 327(u32)
+             445:  184(ivec3) CompositeConstruct 444 444 444
+             446:  394(bvec3) UGreaterThan 443 445
+                              Store 422(bv) 446
+             447:   52(ivec2) Load 312(i32v)
+             448:     18(int) Load 315(i32)
+             449:   52(ivec2) CompositeConstruct 448 448
+             450:  166(bvec2) SGreaterThan 447 449
+             451:  394(bvec3) Load 422(bv)
+             452:  394(bvec3) VectorShuffle 451 450 3 4 2
+                              Store 422(bv) 452
+             453:  184(ivec3) Load 325(u32v)
+             454:     14(int) Load 327(u32)
+             455:  184(ivec3) CompositeConstruct 454 454 454
+             456:  394(bvec3) UGreaterThanEqual 453 455
+                              Store 422(bv) 456
+             457:   52(ivec2) Load 312(i32v)
+             458:     18(int) Load 315(i32)
+             459:   52(ivec2) CompositeConstruct 458 458
+             460:  166(bvec2) SGreaterThanEqual 457 459
+             461:  394(bvec3) Load 422(bv)
+             462:  394(bvec3) VectorShuffle 461 460 3 4 2
+                              Store 422(bv) 462
+             463:  184(ivec3) Load 325(u32v)
+             464:     14(int) Load 327(u32)
+             465:  184(ivec3) CompositeConstruct 464 464 464
+             466:  394(bvec3) IEqual 463 465
+                              Store 422(bv) 466
+             467:   52(ivec2) Load 312(i32v)
+             468:     18(int) Load 315(i32)
+             469:   52(ivec2) CompositeConstruct 468 468
+             470:  166(bvec2) IEqual 467 469
+             471:  394(bvec3) Load 422(bv)
+             472:  394(bvec3) VectorShuffle 471 470 3 4 2
+                              Store 422(bv) 472
+             473:  184(ivec3) Load 325(u32v)
+             474:     14(int) Load 327(u32)
+             475:  184(ivec3) CompositeConstruct 474 474 474
+             476:  394(bvec3) INotEqual 473 475
+                              Store 422(bv) 476
+             477:   52(ivec2) Load 312(i32v)
+             478:     18(int) Load 315(i32)
+             479:   52(ivec2) CompositeConstruct 478 478
+             480:  166(bvec2) INotEqual 477 479
+             481:  394(bvec3) Load 422(bv)
+             482:  394(bvec3) VectorShuffle 481 480 3 4 2
+                              Store 422(bv) 482
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.int64.frag.out b/Test/baseResults/spv.int64.frag.out
index ac32fb9db61ec6ded2da6c7f365e620af5c5ba78..598fc94f6dea87c798ee82b40eb96676b62a7152 100644
--- a/Test/baseResults/spv.int64.frag.out
+++ b/Test/baseResults/spv.int64.frag.out
@@ -1,7 +1,7 @@
 spv.int64.frag
 // Module Version 10000
 // Generated by (magic number): 80006
-// Id's are bound by 483
+// Id's are bound by 488
 
                               Capability Shader
                               Capability Float64
@@ -37,38 +37,38 @@ spv.int64.frag
                               Name 139  "i64"
                               Name 159  "i"
                               Name 166  "uv"
-                              Name 221  "b"
-                              Name 281  "i64v"
-                              Name 284  "i64"
-                              Name 294  "u64v"
-                              Name 296  "u64"
-                              Name 368  "dv"
-                              Name 387  "iv"
-                              Name 392  "uv"
-                              Name 396  "bv"
-                              Name 457  "Block"
-                              MemberName 457(Block) 0  "i64v"
-                              MemberName 457(Block) 1  "u64"
-                              Name 459  "block"
-                              Name 460  "si64"
-                              Name 461  "su64"
-                              Name 462  "si"
-                              Name 463  "su"
-                              Name 464  "sb"
+                              Name 226  "b"
+                              Name 286  "i64v"
+                              Name 289  "i64"
+                              Name 299  "u64v"
+                              Name 301  "u64"
+                              Name 373  "dv"
+                              Name 392  "iv"
+                              Name 397  "uv"
+                              Name 401  "bv"
+                              Name 462  "Block"
+                              MemberName 462(Block) 0  "i64v"
+                              MemberName 462(Block) 1  "u64"
+                              Name 464  "block"
+                              Name 465  "si64"
+                              Name 466  "su64"
+                              Name 467  "si"
+                              Name 468  "su"
+                              Name 469  "sb"
                               MemberDecorate 28(Uniforms) 0 Offset 0
                               Decorate 28(Uniforms) Block
                               Decorate 30 DescriptorSet 0
                               Decorate 30 Binding 0
-                              MemberDecorate 457(Block) 0 Offset 0
-                              MemberDecorate 457(Block) 1 Offset 24
-                              Decorate 457(Block) Block
-                              Decorate 459(block) DescriptorSet 0
-                              Decorate 459(block) Binding 1
-                              Decorate 460(si64) SpecId 100
-                              Decorate 461(su64) SpecId 101
-                              Decorate 462(si) SpecId 102
-                              Decorate 463(su) SpecId 103
-                              Decorate 464(sb) SpecId 104
+                              MemberDecorate 462(Block) 0 Offset 0
+                              MemberDecorate 462(Block) 1 Offset 24
+                              Decorate 462(Block) Block
+                              Decorate 464(block) DescriptorSet 0
+                              Decorate 464(block) Binding 1
+                              Decorate 465(si64) SpecId 100
+                              Decorate 466(su64) SpecId 101
+                              Decorate 467(si) SpecId 102
+                              Decorate 468(su) SpecId 103
+                              Decorate 469(sb) SpecId 104
                2:             TypeVoid
                3:             TypeFunction 2
               14:             TypeInt 64 0
@@ -128,52 +128,53 @@ spv.int64.frag
              158:             TypePointer Function 31(int)
              164:             TypeVector 21(int) 3
              165:             TypePointer Function 164(ivec3)
+             199:             TypeVector 31(int) 3
              203:     21(int) Constant 1
              204:             TypePointer Function 21(int)
-             212:     21(int) Constant 2
-             220:             TypePointer Function 55(bool)
-             222:     21(int) Constant 0
-             292:   52(ivec2) ConstantComposite 25 25
-             301:  132(ivec3) ConstantComposite 69 69 69
-             343:    55(bool) ConstantTrue
-             350:    55(bool) ConstantFalse
-             351:   56(bvec2) ConstantComposite 350 350
-             363:             TypeVector 55(bool) 3
-             364:  363(bvec3) ConstantComposite 350 350 350
-             366:             TypeVector 94(float) 3
-             367:             TypePointer Function 366(fvec3)
-             372:             TypePointer Function 94(float)
-             383:     31(int) Constant 1
-             384:     31(int) Constant 2
-             385:   74(ivec2) ConstantComposite 383 384
-             390:   81(ivec2) ConstantComposite 212 22
-             395:             TypePointer Function 363(bvec3)
-      457(Block):             TypeStruct 136(ivec3) 14(int)
-             458:             TypePointer Uniform 457(Block)
-      459(block):    458(ptr) Variable Uniform
-       460(si64):     18(int) SpecConstant 4294967286 4294967295
-       461(su64):     14(int) SpecConstant 20 0
-         462(si):     31(int) SpecConstant 4294967291
-         463(su):     21(int) SpecConstant 4
-         464(sb):    55(bool) SpecConstantTrue
-             465:    55(bool) SpecConstantOp 171 460(si64) 69
-             466:    55(bool) SpecConstantOp 171 461(su64) 69
-             467:     18(int) SpecConstantOp 169 464(sb) 61 60
-             468:     14(int) SpecConstantOp 169 464(sb) 70 69
-             469:     31(int) SpecConstantOp 114 460(si64)
-             470:     18(int) SpecConstantOp 114 462(si)
-             471:     21(int) SpecConstantOp 113 461(su64)
-             472:     14(int) SpecConstantOp 113 463(su)
-             473:     18(int) SpecConstantOp 128 461(su64) 69
-             474:     14(int) SpecConstantOp 128 460(si64) 69
-             475:     31(int) SpecConstantOp 113 461(su64)
-             476:     31(int) SpecConstantOp 128 475 222
-             477:     18(int) SpecConstantOp 114 462(si)
-             478:     14(int) SpecConstantOp 128 477 69
-             479:     31(int) SpecConstantOp 114 460(si64)
-             480:     21(int) SpecConstantOp 128 479 222
-             481:     18(int) SpecConstantOp 113 463(su)
-             482:     18(int) SpecConstantOp 128 481 69
+             217:     21(int) Constant 2
+             225:             TypePointer Function 55(bool)
+             227:     21(int) Constant 0
+             297:   52(ivec2) ConstantComposite 25 25
+             306:  132(ivec3) ConstantComposite 69 69 69
+             348:    55(bool) ConstantTrue
+             355:    55(bool) ConstantFalse
+             356:   56(bvec2) ConstantComposite 355 355
+             368:             TypeVector 55(bool) 3
+             369:  368(bvec3) ConstantComposite 355 355 355
+             371:             TypeVector 94(float) 3
+             372:             TypePointer Function 371(fvec3)
+             377:             TypePointer Function 94(float)
+             388:     31(int) Constant 1
+             389:     31(int) Constant 2
+             390:   74(ivec2) ConstantComposite 388 389
+             395:   81(ivec2) ConstantComposite 217 22
+             400:             TypePointer Function 368(bvec3)
+      462(Block):             TypeStruct 136(ivec3) 14(int)
+             463:             TypePointer Uniform 462(Block)
+      464(block):    463(ptr) Variable Uniform
+       465(si64):     18(int) SpecConstant 4294967286 4294967295
+       466(su64):     14(int) SpecConstant 20 0
+         467(si):     31(int) SpecConstant 4294967291
+         468(su):     21(int) SpecConstant 4
+         469(sb):    55(bool) SpecConstantTrue
+             470:    55(bool) SpecConstantOp 171 465(si64) 69
+             471:    55(bool) SpecConstantOp 171 466(su64) 69
+             472:     18(int) SpecConstantOp 169 469(sb) 61 60
+             473:     14(int) SpecConstantOp 169 469(sb) 70 69
+             474:     31(int) SpecConstantOp 114 465(si64)
+             475:     18(int) SpecConstantOp 114 467(si)
+             476:     21(int) SpecConstantOp 113 466(su64)
+             477:     14(int) SpecConstantOp 113 468(su)
+             478:     18(int) SpecConstantOp 128 466(su64) 69
+             479:     14(int) SpecConstantOp 128 465(si64) 69
+             480:     31(int) SpecConstantOp 113 466(su64)
+             481:     31(int) SpecConstantOp 128 480 227
+             482:     18(int) SpecConstantOp 114 467(si)
+             483:     14(int) SpecConstantOp 128 482 69
+             484:     31(int) SpecConstantOp 114 465(si64)
+             485:     21(int) SpecConstantOp 128 484 227
+             486:     18(int) SpecConstantOp 113 468(su)
+             487:     18(int) SpecConstantOp 128 486 69
          4(main):           2 Function None 3
                5:             Label
                               Store 16(u64Max) 17
@@ -286,7 +287,7 @@ spv.int64.frag
         139(i64):     19(ptr) Variable Function
           159(i):    158(ptr) Variable Function
          166(uv):    165(ptr) Variable Function
-          221(b):    220(ptr) Variable Function
+          226(b):    225(ptr) Variable Function
              135:  132(ivec3) Load 134(u64v)
              137:  136(ivec3) CompositeConstruct 61 61 61
              138:  132(ivec3) IAdd 135 137
@@ -359,302 +360,308 @@ spv.int64.frag
              195:     18(int) SConvert 194
              196:     18(int) SMod 193 195
                               Store 139(i64) 196
-             197:     31(int) Load 159(i)
-             198:     18(int) SConvert 197
-             199:     14(int) Bitcast 198
-             200:  132(ivec3) Load 134(u64v)
-             201:  132(ivec3) CompositeConstruct 199 199 199
-             202:  132(ivec3) ShiftLeftLogical 200 201
-                              Store 134(u64v) 202
+             197:  132(ivec3) Load 134(u64v)
+             198:     31(int) Load 159(i)
+             200:  199(ivec3) CompositeConstruct 198 198 198
+             201:  132(ivec3) ShiftLeftLogical 197 200
+                              Store 134(u64v) 201
+             202:     18(int) Load 139(i64)
              205:    204(ptr) AccessChain 166(uv) 203
              206:     21(int) Load 205
-             207:     18(int) UConvert 206
-             208:     18(int) Bitcast 207
-             209:     18(int) Load 139(i64)
-             210:     18(int) ShiftRightArithmetic 209 208
-                              Store 139(i64) 210
-             211:     18(int) Load 139(i64)
-             213:     40(ptr) AccessChain 134(u64v) 212
-             214:     14(int) Load 213
-             215:     18(int) ShiftLeftLogical 211 214
+             207:     18(int) ShiftRightArithmetic 202 206
+                              Store 139(i64) 207
+             208:     31(int) Load 159(i)
+             209:  132(ivec3) Load 134(u64v)
+             210:  199(ivec3) CompositeConstruct 208 208 208
+             211:  132(ivec3) ShiftLeftLogical 209 210
+                              Store 134(u64v) 211
+             212:    204(ptr) AccessChain 166(uv) 203
+             213:     21(int) Load 212
+             214:     18(int) Load 139(i64)
+             215:     18(int) ShiftRightArithmetic 214 213
                               Store 139(i64) 215
-             216:  132(ivec3) Load 134(u64v)
-             217:     18(int) Load 139(i64)
-             218:  136(ivec3) CompositeConstruct 217 217 217
-             219:  132(ivec3) ShiftLeftLogical 216 218
-                              Store 134(u64v) 219
-             223:     40(ptr) AccessChain 134(u64v) 222
-             224:     14(int) Load 223
-             225:     18(int) Load 139(i64)
-             226:     14(int) Bitcast 225
-             227:    55(bool) INotEqual 224 226
-                              Store 221(b) 227
-             228:     18(int) Load 139(i64)
-             229:     14(int) Bitcast 228
-             230:     40(ptr) AccessChain 134(u64v) 222
-             231:     14(int) Load 230
-             232:    55(bool) IEqual 229 231
-                              Store 221(b) 232
-             233:     40(ptr) AccessChain 134(u64v) 222
-             234:     14(int) Load 233
-             235:    204(ptr) AccessChain 166(uv) 203
-             236:     21(int) Load 235
-             237:     14(int) UConvert 236
-             238:    55(bool) UGreaterThan 234 237
-                              Store 221(b) 238
-             239:     18(int) Load 139(i64)
-             240:     31(int) Load 159(i)
-             241:     18(int) SConvert 240
-             242:    55(bool) SLessThan 239 241
-                              Store 221(b) 242
-             243:     40(ptr) AccessChain 134(u64v) 203
-             244:     14(int) Load 243
-             245:    204(ptr) AccessChain 166(uv) 222
-             246:     21(int) Load 245
-             247:     14(int) UConvert 246
-             248:    55(bool) UGreaterThanEqual 244 247
-                              Store 221(b) 248
-             249:     18(int) Load 139(i64)
-             250:     31(int) Load 159(i)
-             251:     18(int) SConvert 250
-             252:    55(bool) SLessThanEqual 249 251
-                              Store 221(b) 252
-             253:     31(int) Load 159(i)
-             254:     18(int) SConvert 253
-             255:     14(int) Bitcast 254
-             256:  132(ivec3) Load 134(u64v)
-             257:  132(ivec3) CompositeConstruct 255 255 255
-             258:  132(ivec3) BitwiseOr 256 257
-                              Store 134(u64v) 258
-             259:     18(int) Load 139(i64)
-             260:     31(int) Load 159(i)
-             261:     18(int) SConvert 260
-             262:     18(int) BitwiseOr 259 261
-                              Store 139(i64) 262
-             263:     31(int) Load 159(i)
-             264:     18(int) SConvert 263
-             265:     18(int) Load 139(i64)
-             266:     18(int) BitwiseAnd 265 264
-                              Store 139(i64) 266
-             267:  132(ivec3) Load 134(u64v)
-             268:  164(ivec3) Load 166(uv)
-             269:  132(ivec3) UConvert 268
-             270:  132(ivec3) BitwiseAnd 267 269
-                              Store 134(u64v) 270
-             271:     18(int) Load 139(i64)
-             272:     14(int) Bitcast 271
-             273:  132(ivec3) Load 134(u64v)
-             274:  132(ivec3) CompositeConstruct 272 272 272
-             275:  132(ivec3) BitwiseXor 273 274
+             216:     18(int) Load 139(i64)
+             218:     40(ptr) AccessChain 134(u64v) 217
+             219:     14(int) Load 218
+             220:     18(int) ShiftLeftLogical 216 219
+                              Store 139(i64) 220
+             221:  132(ivec3) Load 134(u64v)
+             222:     18(int) Load 139(i64)
+             223:  136(ivec3) CompositeConstruct 222 222 222
+             224:  132(ivec3) ShiftLeftLogical 221 223
+                              Store 134(u64v) 224
+             228:     40(ptr) AccessChain 134(u64v) 227
+             229:     14(int) Load 228
+             230:     18(int) Load 139(i64)
+             231:     14(int) Bitcast 230
+             232:    55(bool) INotEqual 229 231
+                              Store 226(b) 232
+             233:     18(int) Load 139(i64)
+             234:     14(int) Bitcast 233
+             235:     40(ptr) AccessChain 134(u64v) 227
+             236:     14(int) Load 235
+             237:    55(bool) IEqual 234 236
+                              Store 226(b) 237
+             238:     40(ptr) AccessChain 134(u64v) 227
+             239:     14(int) Load 238
+             240:    204(ptr) AccessChain 166(uv) 203
+             241:     21(int) Load 240
+             242:     14(int) UConvert 241
+             243:    55(bool) UGreaterThan 239 242
+                              Store 226(b) 243
+             244:     18(int) Load 139(i64)
+             245:     31(int) Load 159(i)
+             246:     18(int) SConvert 245
+             247:    55(bool) SLessThan 244 246
+                              Store 226(b) 247
+             248:     40(ptr) AccessChain 134(u64v) 203
+             249:     14(int) Load 248
+             250:    204(ptr) AccessChain 166(uv) 227
+             251:     21(int) Load 250
+             252:     14(int) UConvert 251
+             253:    55(bool) UGreaterThanEqual 249 252
+                              Store 226(b) 253
+             254:     18(int) Load 139(i64)
+             255:     31(int) Load 159(i)
+             256:     18(int) SConvert 255
+             257:    55(bool) SLessThanEqual 254 256
+                              Store 226(b) 257
+             258:     31(int) Load 159(i)
+             259:     18(int) SConvert 258
+             260:     14(int) Bitcast 259
+             261:  132(ivec3) Load 134(u64v)
+             262:  132(ivec3) CompositeConstruct 260 260 260
+             263:  132(ivec3) BitwiseOr 261 262
+                              Store 134(u64v) 263
+             264:     18(int) Load 139(i64)
+             265:     31(int) Load 159(i)
+             266:     18(int) SConvert 265
+             267:     18(int) BitwiseOr 264 266
+                              Store 139(i64) 267
+             268:     31(int) Load 159(i)
+             269:     18(int) SConvert 268
+             270:     18(int) Load 139(i64)
+             271:     18(int) BitwiseAnd 270 269
+                              Store 139(i64) 271
+             272:  132(ivec3) Load 134(u64v)
+             273:  164(ivec3) Load 166(uv)
+             274:  132(ivec3) UConvert 273
+             275:  132(ivec3) BitwiseAnd 272 274
                               Store 134(u64v) 275
-             276:  132(ivec3) Load 134(u64v)
-             277:     18(int) Load 139(i64)
-             278:     14(int) Bitcast 277
-             279:  132(ivec3) CompositeConstruct 278 278 278
-             280:  132(ivec3) BitwiseXor 276 279
+             276:     18(int) Load 139(i64)
+             277:     14(int) Bitcast 276
+             278:  132(ivec3) Load 134(u64v)
+             279:  132(ivec3) CompositeConstruct 277 277 277
+             280:  132(ivec3) BitwiseXor 278 279
                               Store 134(u64v) 280
+             281:  132(ivec3) Load 134(u64v)
+             282:     18(int) Load 139(i64)
+             283:     14(int) Bitcast 282
+             284:  132(ivec3) CompositeConstruct 283 283 283
+             285:  132(ivec3) BitwiseXor 281 284
+                              Store 134(u64v) 285
                               Return
                               FunctionEnd
 12(builtinFuncs():           2 Function None 3
               13:             Label
-       281(i64v):     53(ptr) Variable Function
-        284(i64):     19(ptr) Variable Function
-       294(u64v):    133(ptr) Variable Function
-        296(u64):     40(ptr) Variable Function
-         368(dv):    367(ptr) Variable Function
-         387(iv):     75(ptr) Variable Function
-         392(uv):     82(ptr) Variable Function
-         396(bv):    395(ptr) Variable Function
-             282:   52(ivec2) Load 281(i64v)
-             283:   52(ivec2) ExtInst 1(GLSL.std.450) 5(SAbs) 282
-                              Store 281(i64v) 283
-             285:     18(int) Load 284(i64)
-             286:     18(int) ExtInst 1(GLSL.std.450) 7(SSign) 285
-                              Store 284(i64) 286
-             287:   52(ivec2) Load 281(i64v)
-             288:     18(int) Load 284(i64)
-             289:   52(ivec2) CompositeConstruct 288 288
-             290:   52(ivec2) ExtInst 1(GLSL.std.450) 39(SMin) 287 289
-                              Store 281(i64v) 290
-             291:   52(ivec2) Load 281(i64v)
-             293:   52(ivec2) ExtInst 1(GLSL.std.450) 39(SMin) 291 292
-                              Store 281(i64v) 293
-             295:  132(ivec3) Load 294(u64v)
-             297:     14(int) Load 296(u64)
-             298:  132(ivec3) CompositeConstruct 297 297 297
-             299:  132(ivec3) ExtInst 1(GLSL.std.450) 38(UMin) 295 298
-                              Store 294(u64v) 299
-             300:  132(ivec3) Load 294(u64v)
-             302:  132(ivec3) ExtInst 1(GLSL.std.450) 38(UMin) 300 301
-                              Store 294(u64v) 302
-             303:   52(ivec2) Load 281(i64v)
-             304:     18(int) Load 284(i64)
-             305:   52(ivec2) CompositeConstruct 304 304
-             306:   52(ivec2) ExtInst 1(GLSL.std.450) 42(SMax) 303 305
-                              Store 281(i64v) 306
-             307:   52(ivec2) Load 281(i64v)
-             308:   52(ivec2) ExtInst 1(GLSL.std.450) 42(SMax) 307 292
-                              Store 281(i64v) 308
-             309:  132(ivec3) Load 294(u64v)
-             310:     14(int) Load 296(u64)
-             311:  132(ivec3) CompositeConstruct 310 310 310
-             312:  132(ivec3) ExtInst 1(GLSL.std.450) 41(UMax) 309 311
-                              Store 294(u64v) 312
-             313:  132(ivec3) Load 294(u64v)
-             314:  132(ivec3) ExtInst 1(GLSL.std.450) 41(UMax) 313 301
-                              Store 294(u64v) 314
-             315:   52(ivec2) Load 281(i64v)
-             316:     18(int) Load 284(i64)
-             317:     18(int) SNegate 316
-             318:     18(int) Load 284(i64)
-             319:   52(ivec2) CompositeConstruct 317 317
-             320:   52(ivec2) CompositeConstruct 318 318
-             321:   52(ivec2) ExtInst 1(GLSL.std.450) 45(SClamp) 315 319 320
-                              Store 281(i64v) 321
-             322:   52(ivec2) Load 281(i64v)
-             323:   52(ivec2) Load 281(i64v)
-             324:   52(ivec2) SNegate 323
-             325:   52(ivec2) Load 281(i64v)
-             326:   52(ivec2) ExtInst 1(GLSL.std.450) 45(SClamp) 322 324 325
-                              Store 281(i64v) 326
-             327:  132(ivec3) Load 294(u64v)
-             328:     14(int) Load 296(u64)
-             329:     14(int) SNegate 328
-             330:     14(int) Load 296(u64)
-             331:  132(ivec3) CompositeConstruct 329 329 329
-             332:  132(ivec3) CompositeConstruct 330 330 330
-             333:  132(ivec3) ExtInst 1(GLSL.std.450) 44(UClamp) 327 331 332
-                              Store 294(u64v) 333
-             334:  132(ivec3) Load 294(u64v)
-             335:  132(ivec3) Load 294(u64v)
-             336:  132(ivec3) SNegate 335
-             337:  132(ivec3) Load 294(u64v)
-             338:  132(ivec3) ExtInst 1(GLSL.std.450) 44(UClamp) 334 336 337
-                              Store 294(u64v) 338
-             339:     19(ptr) AccessChain 281(i64v) 222
-             340:     18(int) Load 339
-             341:     19(ptr) AccessChain 281(i64v) 203
-             342:     18(int) Load 341
-             344:     18(int) Select 343 342 340
-                              Store 284(i64) 344
-             345:     18(int) Load 284(i64)
-             346:   52(ivec2) CompositeConstruct 345 345
-             347:     18(int) Load 284(i64)
-             348:     18(int) SNegate 347
-             349:   52(ivec2) CompositeConstruct 348 348
-             352:   52(ivec2) Select 351 349 346
-                              Store 281(i64v) 352
-             353:     40(ptr) AccessChain 294(u64v) 222
-             354:     14(int) Load 353
-             355:     40(ptr) AccessChain 294(u64v) 203
-             356:     14(int) Load 355
-             357:     14(int) Select 343 356 354
-                              Store 296(u64) 357
-             358:     14(int) Load 296(u64)
-             359:  132(ivec3) CompositeConstruct 358 358 358
-             360:     14(int) Load 296(u64)
-             361:     14(int) SNegate 360
-             362:  132(ivec3) CompositeConstruct 361 361 361
-             365:  132(ivec3) Select 364 362 359
-                              Store 294(u64v) 365
-             369:  366(fvec3) Load 368(dv)
-             370:   95(fvec2) VectorShuffle 369 369 0 1
-             371:   52(ivec2) Bitcast 370
-                              Store 281(i64v) 371
-             373:    372(ptr) AccessChain 368(dv) 212
-             374:   94(float) Load 373
-             375:     14(int) Bitcast 374
-             376:     40(ptr) AccessChain 294(u64v) 222
-                              Store 376 375
-             377:   52(ivec2) Load 281(i64v)
-             378:   95(fvec2) Bitcast 377
-             379:  366(fvec3) Load 368(dv)
-             380:  366(fvec3) VectorShuffle 379 378 3 4 2
-                              Store 368(dv) 380
-             381:  132(ivec3) Load 294(u64v)
-             382:  366(fvec3) Bitcast 381
-                              Store 368(dv) 382
-             386:     18(int) Bitcast 385
-                              Store 284(i64) 386
-             388:     18(int) Load 284(i64)
-             389:   74(ivec2) Bitcast 388
-                              Store 387(iv) 389
-             391:     14(int) Bitcast 390
-                              Store 296(u64) 391
-             393:     14(int) Load 296(u64)
-             394:   81(ivec2) Bitcast 393
-                              Store 392(uv) 394
-             397:  132(ivec3) Load 294(u64v)
-             398:     14(int) Load 296(u64)
-             399:  132(ivec3) CompositeConstruct 398 398 398
-             400:  363(bvec3) ULessThan 397 399
-                              Store 396(bv) 400
-             401:   52(ivec2) Load 281(i64v)
-             402:     18(int) Load 284(i64)
-             403:   52(ivec2) CompositeConstruct 402 402
-             404:   56(bvec2) SLessThan 401 403
-             405:  363(bvec3) Load 396(bv)
-             406:  363(bvec3) VectorShuffle 405 404 3 4 2
-                              Store 396(bv) 406
-             407:  132(ivec3) Load 294(u64v)
-             408:     14(int) Load 296(u64)
-             409:  132(ivec3) CompositeConstruct 408 408 408
-             410:  363(bvec3) ULessThanEqual 407 409
-                              Store 396(bv) 410
-             411:   52(ivec2) Load 281(i64v)
-             412:     18(int) Load 284(i64)
-             413:   52(ivec2) CompositeConstruct 412 412
-             414:   56(bvec2) SLessThanEqual 411 413
-             415:  363(bvec3) Load 396(bv)
-             416:  363(bvec3) VectorShuffle 415 414 3 4 2
-                              Store 396(bv) 416
-             417:  132(ivec3) Load 294(u64v)
-             418:     14(int) Load 296(u64)
-             419:  132(ivec3) CompositeConstruct 418 418 418
-             420:  363(bvec3) UGreaterThan 417 419
-                              Store 396(bv) 420
-             421:   52(ivec2) Load 281(i64v)
-             422:     18(int) Load 284(i64)
-             423:   52(ivec2) CompositeConstruct 422 422
-             424:   56(bvec2) SGreaterThan 421 423
-             425:  363(bvec3) Load 396(bv)
-             426:  363(bvec3) VectorShuffle 425 424 3 4 2
-                              Store 396(bv) 426
-             427:  132(ivec3) Load 294(u64v)
-             428:     14(int) Load 296(u64)
-             429:  132(ivec3) CompositeConstruct 428 428 428
-             430:  363(bvec3) UGreaterThanEqual 427 429
-                              Store 396(bv) 430
-             431:   52(ivec2) Load 281(i64v)
-             432:     18(int) Load 284(i64)
-             433:   52(ivec2) CompositeConstruct 432 432
-             434:   56(bvec2) SGreaterThanEqual 431 433
-             435:  363(bvec3) Load 396(bv)
-             436:  363(bvec3) VectorShuffle 435 434 3 4 2
-                              Store 396(bv) 436
-             437:  132(ivec3) Load 294(u64v)
-             438:     14(int) Load 296(u64)
-             439:  132(ivec3) CompositeConstruct 438 438 438
-             440:  363(bvec3) IEqual 437 439
-                              Store 396(bv) 440
-             441:   52(ivec2) Load 281(i64v)
-             442:     18(int) Load 284(i64)
-             443:   52(ivec2) CompositeConstruct 442 442
-             444:   56(bvec2) IEqual 441 443
-             445:  363(bvec3) Load 396(bv)
-             446:  363(bvec3) VectorShuffle 445 444 3 4 2
-                              Store 396(bv) 446
-             447:  132(ivec3) Load 294(u64v)
-             448:     14(int) Load 296(u64)
-             449:  132(ivec3) CompositeConstruct 448 448 448
-             450:  363(bvec3) INotEqual 447 449
-                              Store 396(bv) 450
-             451:   52(ivec2) Load 281(i64v)
-             452:     18(int) Load 284(i64)
-             453:   52(ivec2) CompositeConstruct 452 452
-             454:   56(bvec2) INotEqual 451 453
-             455:  363(bvec3) Load 396(bv)
-             456:  363(bvec3) VectorShuffle 455 454 3 4 2
-                              Store 396(bv) 456
+       286(i64v):     53(ptr) Variable Function
+        289(i64):     19(ptr) Variable Function
+       299(u64v):    133(ptr) Variable Function
+        301(u64):     40(ptr) Variable Function
+         373(dv):    372(ptr) Variable Function
+         392(iv):     75(ptr) Variable Function
+         397(uv):     82(ptr) Variable Function
+         401(bv):    400(ptr) Variable Function
+             287:   52(ivec2) Load 286(i64v)
+             288:   52(ivec2) ExtInst 1(GLSL.std.450) 5(SAbs) 287
+                              Store 286(i64v) 288
+             290:     18(int) Load 289(i64)
+             291:     18(int) ExtInst 1(GLSL.std.450) 7(SSign) 290
+                              Store 289(i64) 291
+             292:   52(ivec2) Load 286(i64v)
+             293:     18(int) Load 289(i64)
+             294:   52(ivec2) CompositeConstruct 293 293
+             295:   52(ivec2) ExtInst 1(GLSL.std.450) 39(SMin) 292 294
+                              Store 286(i64v) 295
+             296:   52(ivec2) Load 286(i64v)
+             298:   52(ivec2) ExtInst 1(GLSL.std.450) 39(SMin) 296 297
+                              Store 286(i64v) 298
+             300:  132(ivec3) Load 299(u64v)
+             302:     14(int) Load 301(u64)
+             303:  132(ivec3) CompositeConstruct 302 302 302
+             304:  132(ivec3) ExtInst 1(GLSL.std.450) 38(UMin) 300 303
+                              Store 299(u64v) 304
+             305:  132(ivec3) Load 299(u64v)
+             307:  132(ivec3) ExtInst 1(GLSL.std.450) 38(UMin) 305 306
+                              Store 299(u64v) 307
+             308:   52(ivec2) Load 286(i64v)
+             309:     18(int) Load 289(i64)
+             310:   52(ivec2) CompositeConstruct 309 309
+             311:   52(ivec2) ExtInst 1(GLSL.std.450) 42(SMax) 308 310
+                              Store 286(i64v) 311
+             312:   52(ivec2) Load 286(i64v)
+             313:   52(ivec2) ExtInst 1(GLSL.std.450) 42(SMax) 312 297
+                              Store 286(i64v) 313
+             314:  132(ivec3) Load 299(u64v)
+             315:     14(int) Load 301(u64)
+             316:  132(ivec3) CompositeConstruct 315 315 315
+             317:  132(ivec3) ExtInst 1(GLSL.std.450) 41(UMax) 314 316
+                              Store 299(u64v) 317
+             318:  132(ivec3) Load 299(u64v)
+             319:  132(ivec3) ExtInst 1(GLSL.std.450) 41(UMax) 318 306
+                              Store 299(u64v) 319
+             320:   52(ivec2) Load 286(i64v)
+             321:     18(int) Load 289(i64)
+             322:     18(int) SNegate 321
+             323:     18(int) Load 289(i64)
+             324:   52(ivec2) CompositeConstruct 322 322
+             325:   52(ivec2) CompositeConstruct 323 323
+             326:   52(ivec2) ExtInst 1(GLSL.std.450) 45(SClamp) 320 324 325
+                              Store 286(i64v) 326
+             327:   52(ivec2) Load 286(i64v)
+             328:   52(ivec2) Load 286(i64v)
+             329:   52(ivec2) SNegate 328
+             330:   52(ivec2) Load 286(i64v)
+             331:   52(ivec2) ExtInst 1(GLSL.std.450) 45(SClamp) 327 329 330
+                              Store 286(i64v) 331
+             332:  132(ivec3) Load 299(u64v)
+             333:     14(int) Load 301(u64)
+             334:     14(int) SNegate 333
+             335:     14(int) Load 301(u64)
+             336:  132(ivec3) CompositeConstruct 334 334 334
+             337:  132(ivec3) CompositeConstruct 335 335 335
+             338:  132(ivec3) ExtInst 1(GLSL.std.450) 44(UClamp) 332 336 337
+                              Store 299(u64v) 338
+             339:  132(ivec3) Load 299(u64v)
+             340:  132(ivec3) Load 299(u64v)
+             341:  132(ivec3) SNegate 340
+             342:  132(ivec3) Load 299(u64v)
+             343:  132(ivec3) ExtInst 1(GLSL.std.450) 44(UClamp) 339 341 342
+                              Store 299(u64v) 343
+             344:     19(ptr) AccessChain 286(i64v) 227
+             345:     18(int) Load 344
+             346:     19(ptr) AccessChain 286(i64v) 203
+             347:     18(int) Load 346
+             349:     18(int) Select 348 347 345
+                              Store 289(i64) 349
+             350:     18(int) Load 289(i64)
+             351:   52(ivec2) CompositeConstruct 350 350
+             352:     18(int) Load 289(i64)
+             353:     18(int) SNegate 352
+             354:   52(ivec2) CompositeConstruct 353 353
+             357:   52(ivec2) Select 356 354 351
+                              Store 286(i64v) 357
+             358:     40(ptr) AccessChain 299(u64v) 227
+             359:     14(int) Load 358
+             360:     40(ptr) AccessChain 299(u64v) 203
+             361:     14(int) Load 360
+             362:     14(int) Select 348 361 359
+                              Store 301(u64) 362
+             363:     14(int) Load 301(u64)
+             364:  132(ivec3) CompositeConstruct 363 363 363
+             365:     14(int) Load 301(u64)
+             366:     14(int) SNegate 365
+             367:  132(ivec3) CompositeConstruct 366 366 366
+             370:  132(ivec3) Select 369 367 364
+                              Store 299(u64v) 370
+             374:  371(fvec3) Load 373(dv)
+             375:   95(fvec2) VectorShuffle 374 374 0 1
+             376:   52(ivec2) Bitcast 375
+                              Store 286(i64v) 376
+             378:    377(ptr) AccessChain 373(dv) 217
+             379:   94(float) Load 378
+             380:     14(int) Bitcast 379
+             381:     40(ptr) AccessChain 299(u64v) 227
+                              Store 381 380
+             382:   52(ivec2) Load 286(i64v)
+             383:   95(fvec2) Bitcast 382
+             384:  371(fvec3) Load 373(dv)
+             385:  371(fvec3) VectorShuffle 384 383 3 4 2
+                              Store 373(dv) 385
+             386:  132(ivec3) Load 299(u64v)
+             387:  371(fvec3) Bitcast 386
+                              Store 373(dv) 387
+             391:     18(int) Bitcast 390
+                              Store 289(i64) 391
+             393:     18(int) Load 289(i64)
+             394:   74(ivec2) Bitcast 393
+                              Store 392(iv) 394
+             396:     14(int) Bitcast 395
+                              Store 301(u64) 396
+             398:     14(int) Load 301(u64)
+             399:   81(ivec2) Bitcast 398
+                              Store 397(uv) 399
+             402:  132(ivec3) Load 299(u64v)
+             403:     14(int) Load 301(u64)
+             404:  132(ivec3) CompositeConstruct 403 403 403
+             405:  368(bvec3) ULessThan 402 404
+                              Store 401(bv) 405
+             406:   52(ivec2) Load 286(i64v)
+             407:     18(int) Load 289(i64)
+             408:   52(ivec2) CompositeConstruct 407 407
+             409:   56(bvec2) SLessThan 406 408
+             410:  368(bvec3) Load 401(bv)
+             411:  368(bvec3) VectorShuffle 410 409 3 4 2
+                              Store 401(bv) 411
+             412:  132(ivec3) Load 299(u64v)
+             413:     14(int) Load 301(u64)
+             414:  132(ivec3) CompositeConstruct 413 413 413
+             415:  368(bvec3) ULessThanEqual 412 414
+                              Store 401(bv) 415
+             416:   52(ivec2) Load 286(i64v)
+             417:     18(int) Load 289(i64)
+             418:   52(ivec2) CompositeConstruct 417 417
+             419:   56(bvec2) SLessThanEqual 416 418
+             420:  368(bvec3) Load 401(bv)
+             421:  368(bvec3) VectorShuffle 420 419 3 4 2
+                              Store 401(bv) 421
+             422:  132(ivec3) Load 299(u64v)
+             423:     14(int) Load 301(u64)
+             424:  132(ivec3) CompositeConstruct 423 423 423
+             425:  368(bvec3) UGreaterThan 422 424
+                              Store 401(bv) 425
+             426:   52(ivec2) Load 286(i64v)
+             427:     18(int) Load 289(i64)
+             428:   52(ivec2) CompositeConstruct 427 427
+             429:   56(bvec2) SGreaterThan 426 428
+             430:  368(bvec3) Load 401(bv)
+             431:  368(bvec3) VectorShuffle 430 429 3 4 2
+                              Store 401(bv) 431
+             432:  132(ivec3) Load 299(u64v)
+             433:     14(int) Load 301(u64)
+             434:  132(ivec3) CompositeConstruct 433 433 433
+             435:  368(bvec3) UGreaterThanEqual 432 434
+                              Store 401(bv) 435
+             436:   52(ivec2) Load 286(i64v)
+             437:     18(int) Load 289(i64)
+             438:   52(ivec2) CompositeConstruct 437 437
+             439:   56(bvec2) SGreaterThanEqual 436 438
+             440:  368(bvec3) Load 401(bv)
+             441:  368(bvec3) VectorShuffle 440 439 3 4 2
+                              Store 401(bv) 441
+             442:  132(ivec3) Load 299(u64v)
+             443:     14(int) Load 301(u64)
+             444:  132(ivec3) CompositeConstruct 443 443 443
+             445:  368(bvec3) IEqual 442 444
+                              Store 401(bv) 445
+             446:   52(ivec2) Load 286(i64v)
+             447:     18(int) Load 289(i64)
+             448:   52(ivec2) CompositeConstruct 447 447
+             449:   56(bvec2) IEqual 446 448
+             450:  368(bvec3) Load 401(bv)
+             451:  368(bvec3) VectorShuffle 450 449 3 4 2
+                              Store 401(bv) 451
+             452:  132(ivec3) Load 299(u64v)
+             453:     14(int) Load 301(u64)
+             454:  132(ivec3) CompositeConstruct 453 453 453
+             455:  368(bvec3) INotEqual 452 454
+                              Store 401(bv) 455
+             456:   52(ivec2) Load 286(i64v)
+             457:     18(int) Load 289(i64)
+             458:   52(ivec2) CompositeConstruct 457 457
+             459:   56(bvec2) INotEqual 456 458
+             460:  368(bvec3) Load 401(bv)
+             461:  368(bvec3) VectorShuffle 460 459 3 4 2
+                              Store 401(bv) 461
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.rankShift.comp.out b/Test/baseResults/spv.rankShift.comp.out
new file mode 100755
index 0000000000000000000000000000000000000000..4cdb6d5df72a7c51998a426b7542f868f2c7977a
--- /dev/null
+++ b/Test/baseResults/spv.rankShift.comp.out
@@ -0,0 +1,57 @@
+spv.rankShift.comp
+// Module Version 10000
+// Generated by (magic number): 80006
+// Id's are bound by 33
+
+                              Capability Shader
+                              Capability Int64
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint GLCompute 4  "main"
+                              ExecutionMode 4 LocalSize 54 1 1
+                              Source GLSL 450
+                              SourceExtension  "GL_ARB_gpu_shader_int64"
+                              Name 4  "main"
+                              Name 8  "result"
+                              Name 11  "arg0"
+                              Name 15  "arg1"
+                              Decorate 11(arg0) Location 4
+                              Decorate 15(arg1) Location 5
+                              Decorate 32 BuiltIn WorkgroupSize
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 64 0
+               7:             TypePointer Function 6(int)
+               9:             TypeInt 64 1
+              10:             TypePointer UniformConstant 9(int)
+        11(arg0):     10(ptr) Variable UniformConstant
+              13:             TypeInt 32 0
+              14:             TypePointer UniformConstant 13(int)
+        15(arg1):     14(ptr) Variable UniformConstant
+              29:             TypeVector 13(int) 3
+              30:     13(int) Constant 54
+              31:     13(int) Constant 1
+              32:   29(ivec3) ConstantComposite 30 31 31
+         4(main):           2 Function None 3
+               5:             Label
+       8(result):      7(ptr) Variable Function
+              12:      9(int) Load 11(arg0)
+              16:     13(int) Load 15(arg1)
+              17:      9(int) ShiftLeftLogical 12 16
+              18:      6(int) Bitcast 17
+                              Store 8(result) 18
+              19:      9(int) Load 11(arg0)
+              20:     13(int) Load 15(arg1)
+              21:      9(int) ShiftRightArithmetic 19 20
+              22:      6(int) Bitcast 21
+                              Store 8(result) 22
+              23:     13(int) Load 15(arg1)
+              24:      6(int) Load 8(result)
+              25:      6(int) ShiftLeftLogical 24 23
+                              Store 8(result) 25
+              26:     13(int) Load 15(arg1)
+              27:      6(int) Load 8(result)
+              28:      6(int) ShiftRightLogical 27 26
+                              Store 8(result) 28
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.vulkan110.int16.frag.out b/Test/baseResults/spv.vulkan110.int16.frag.out
index c8135a1d583b6d5aa355fe56067c57c5afc85aad..6639dc7b50d7441860b30b1e3a0702dc4ffddef7 100755
--- a/Test/baseResults/spv.vulkan110.int16.frag.out
+++ b/Test/baseResults/spv.vulkan110.int16.frag.out
@@ -1,7 +1,7 @@
 spv.vulkan110.int16.frag
 // Module Version 10300
 // Generated by (magic number): 80006
-// Id's are bound by 525
+// Id's are bound by 523
 
                               Capability Shader
                               Capability Float16
@@ -52,48 +52,48 @@ spv.vulkan110.int16.frag
                               Name 220  "i"
                               Name 227  "uv"
                               Name 243  "i64"
-                              Name 283  "b"
-                              Name 345  "i16v"
-                              Name 348  "i16"
-                              Name 358  "u16v"
-                              Name 360  "u16"
-                              Name 430  "i32"
-                              Name 433  "i64"
-                              Name 436  "i16v4"
-                              Name 439  "u32"
-                              Name 440  "u16v2"
-                              Name 444  "u64"
-                              Name 447  "u16v4"
-                              Name 459  "bv"
-                              Name 520  "Block"
-                              MemberName 520(Block) 0  "i16"
-                              MemberName 520(Block) 1  "i16v2"
-                              MemberName 520(Block) 2  "i16v3"
-                              MemberName 520(Block) 3  "i16v4"
-                              MemberName 520(Block) 4  "u16"
-                              MemberName 520(Block) 5  "u16v2"
-                              MemberName 520(Block) 6  "u16v3"
-                              MemberName 520(Block) 7  "u16v4"
-                              Name 522  "block"
-                              Name 523  "si16"
-                              Name 524  "su16"
+                              Name 281  "b"
+                              Name 343  "i16v"
+                              Name 346  "i16"
+                              Name 356  "u16v"
+                              Name 358  "u16"
+                              Name 428  "i32"
+                              Name 431  "i64"
+                              Name 434  "i16v4"
+                              Name 437  "u32"
+                              Name 438  "u16v2"
+                              Name 442  "u64"
+                              Name 445  "u16v4"
+                              Name 457  "bv"
+                              Name 518  "Block"
+                              MemberName 518(Block) 0  "i16"
+                              MemberName 518(Block) 1  "i16v2"
+                              MemberName 518(Block) 2  "i16v3"
+                              MemberName 518(Block) 3  "i16v4"
+                              MemberName 518(Block) 4  "u16"
+                              MemberName 518(Block) 5  "u16v2"
+                              MemberName 518(Block) 6  "u16v3"
+                              MemberName 518(Block) 7  "u16v4"
+                              Name 520  "block"
+                              Name 521  "si16"
+                              Name 522  "su16"
                               MemberDecorate 24(Uniforms) 0 Offset 0
                               Decorate 24(Uniforms) Block
                               Decorate 26 DescriptorSet 0
                               Decorate 26 Binding 0
-                              MemberDecorate 520(Block) 0 Offset 0
-                              MemberDecorate 520(Block) 1 Offset 4
-                              MemberDecorate 520(Block) 2 Offset 8
-                              MemberDecorate 520(Block) 3 Offset 16
-                              MemberDecorate 520(Block) 4 Offset 24
-                              MemberDecorate 520(Block) 5 Offset 28
-                              MemberDecorate 520(Block) 6 Offset 32
-                              MemberDecorate 520(Block) 7 Offset 40
-                              Decorate 520(Block) Block
-                              Decorate 522(block) DescriptorSet 0
-                              Decorate 522(block) Binding 1
-                              Decorate 523(si16) SpecId 100
-                              Decorate 524(su16) SpecId 101
+                              MemberDecorate 518(Block) 0 Offset 0
+                              MemberDecorate 518(Block) 1 Offset 4
+                              MemberDecorate 518(Block) 2 Offset 8
+                              MemberDecorate 518(Block) 3 Offset 16
+                              MemberDecorate 518(Block) 4 Offset 24
+                              MemberDecorate 518(Block) 5 Offset 28
+                              MemberDecorate 518(Block) 6 Offset 32
+                              MemberDecorate 518(Block) 7 Offset 40
+                              Decorate 518(Block) Block
+                              Decorate 520(block) DescriptorSet 0
+                              Decorate 520(block) Binding 1
+                              Decorate 521(si16) SpecId 100
+                              Decorate 522(su16) SpecId 101
                2:             TypeVoid
                3:             TypeFunction 2
               14:             TypeInt 16 1
@@ -168,28 +168,28 @@ spv.vulkan110.int16.frag
              242:             TypePointer Function 71(int)
              264:     17(int) Constant 1
              270:     17(int) Constant 2
-             275:             TypeVector 27(int) 3
-             282:             TypePointer Function 173(bool)
-             284:     17(int) Constant 0
-             298:             TypePointer Function 17(int)
-             356:   52(ivec2) ConstantComposite 21 21
-             365:  193(ivec3) ConstantComposite 184 184 184
-             407:   173(bool) ConstantTrue
-             414:   173(bool) ConstantFalse
-             415:  174(bvec2) ConstantComposite 414 414
-             427:             TypeVector 173(bool) 3
-             428:  427(bvec3) ConstantComposite 414 414 414
-             434:             TypeVector 14(int) 4
-             435:             TypePointer Function 434(ivec4)
-             443:             TypePointer Function 77(int)
-             445:             TypeVector 36(int) 4
-             446:             TypePointer Function 445(ivec4)
-             458:             TypePointer Function 427(bvec3)
-      520(Block):             TypeStruct 14(int) 52(ivec2) 197(ivec3) 434(ivec4) 36(int) 57(ivec2) 193(ivec3) 445(ivec4)
-             521:             TypePointer Uniform 520(Block)
-      522(block):    521(ptr) Variable Uniform
-       523(si16):     14(int) SpecConstant 4294967286
-       524(su16):     36(int) SpecConstant 20
+             276:             TypeVector 27(int) 3
+             280:             TypePointer Function 173(bool)
+             282:     17(int) Constant 0
+             296:             TypePointer Function 17(int)
+             354:   52(ivec2) ConstantComposite 21 21
+             363:  193(ivec3) ConstantComposite 184 184 184
+             405:   173(bool) ConstantTrue
+             412:   173(bool) ConstantFalse
+             413:  174(bvec2) ConstantComposite 412 412
+             425:             TypeVector 173(bool) 3
+             426:  425(bvec3) ConstantComposite 412 412 412
+             432:             TypeVector 14(int) 4
+             433:             TypePointer Function 432(ivec4)
+             441:             TypePointer Function 77(int)
+             443:             TypeVector 36(int) 4
+             444:             TypePointer Function 443(ivec4)
+             456:             TypePointer Function 425(bvec3)
+      518(Block):             TypeStruct 14(int) 52(ivec2) 197(ivec3) 432(ivec4) 36(int) 57(ivec2) 193(ivec3) 443(ivec4)
+             519:             TypePointer Uniform 518(Block)
+      520(block):    519(ptr) Variable Uniform
+       521(si16):     14(int) SpecConstant 4294967286
+       522(su16):     36(int) SpecConstant 20
          4(main):           2 Function None 3
                5:             Label
                               Return
@@ -368,7 +368,7 @@ spv.vulkan110.int16.frag
           220(i):    219(ptr) Variable Function
          227(uv):    226(ptr) Variable Function
         243(i64):    242(ptr) Variable Function
-          283(b):    282(ptr) Variable Function
+          281(b):    280(ptr) Variable Function
              196:  193(ivec3) Load 195(u16v)
              198:  197(ivec3) CompositeConstruct 179 179 179
              199:  193(ivec3) IAdd 196 198
@@ -457,287 +457,285 @@ spv.vulkan110.int16.frag
              273:     14(int) ShiftLeftLogical 269 272
                               Store 200(i16) 273
              274:  193(ivec3) Load 195(u16v)
-             276:  275(ivec3) UConvert 274
-             277:  275(ivec3) Bitcast 276
-             278:     27(int) Load 220(i)
-             279:  275(ivec3) CompositeConstruct 278 278 278
-             280:  275(ivec3) ShiftLeftLogical 277 279
-             281:  225(ivec3) Bitcast 280
-                              Store 227(uv) 281
-             285:     37(ptr) AccessChain 195(u16v) 284
-             286:     36(int) Load 285
-             287:     14(int) Load 200(i16)
-             288:     36(int) Bitcast 287
-             289:   173(bool) INotEqual 286 288
-                              Store 283(b) 289
-             290:     14(int) Load 200(i16)
-             291:     36(int) Bitcast 290
-             292:     37(ptr) AccessChain 195(u16v) 284
-             293:     36(int) Load 292
-             294:   173(bool) IEqual 291 293
-                              Store 283(b) 294
-             295:     37(ptr) AccessChain 195(u16v) 284
-             296:     36(int) Load 295
-             297:     17(int) UConvert 296
-             299:    298(ptr) AccessChain 227(uv) 264
-             300:     17(int) Load 299
-             301:   173(bool) UGreaterThan 297 300
-                              Store 283(b) 301
-             302:     14(int) Load 200(i16)
-             303:     27(int) SConvert 302
-             304:     27(int) Load 220(i)
-             305:   173(bool) SLessThan 303 304
-                              Store 283(b) 305
-             306:     37(ptr) AccessChain 195(u16v) 264
-             307:     36(int) Load 306
-             308:     17(int) UConvert 307
-             309:    298(ptr) AccessChain 227(uv) 284
-             310:     17(int) Load 309
-             311:   173(bool) UGreaterThanEqual 308 310
-                              Store 283(b) 311
-             312:     14(int) Load 200(i16)
-             313:     27(int) SConvert 312
-             314:     27(int) Load 220(i)
-             315:   173(bool) SLessThanEqual 313 314
-                              Store 283(b) 315
-             316:     14(int) Load 200(i16)
-             317:     27(int) SConvert 316
-             318:     17(int) Bitcast 317
-             319:  225(ivec3) Load 227(uv)
-             320:  225(ivec3) CompositeConstruct 318 318 318
-             321:  225(ivec3) BitwiseOr 319 320
-                              Store 227(uv) 321
-             322:     14(int) Load 200(i16)
-             323:     27(int) SConvert 322
-             324:     27(int) Load 220(i)
-             325:     27(int) BitwiseOr 323 324
-                              Store 220(i) 325
-             326:     14(int) Load 200(i16)
-             327:     71(int) SConvert 326
-             328:     71(int) Load 243(i64)
-             329:     71(int) BitwiseAnd 328 327
-                              Store 243(i64) 329
-             330:  193(ivec3) Load 195(u16v)
-             331:  225(ivec3) UConvert 330
-             332:  225(ivec3) Load 227(uv)
-             333:  225(ivec3) BitwiseAnd 331 332
-                              Store 227(uv) 333
-             334:     14(int) Load 200(i16)
-             335:     27(int) SConvert 334
-             336:     17(int) Bitcast 335
-             337:  225(ivec3) Load 227(uv)
-             338:  225(ivec3) CompositeConstruct 336 336 336
-             339:  225(ivec3) BitwiseXor 337 338
-                              Store 227(uv) 339
-             340:  193(ivec3) Load 195(u16v)
-             341:     14(int) Load 200(i16)
-             342:     36(int) Bitcast 341
-             343:  193(ivec3) CompositeConstruct 342 342 342
-             344:  193(ivec3) BitwiseXor 340 343
-                              Store 195(u16v) 344
+             275:     27(int) Load 220(i)
+             277:  276(ivec3) CompositeConstruct 275 275 275
+             278:  193(ivec3) ShiftLeftLogical 274 277
+             279:  225(ivec3) UConvert 278
+                              Store 227(uv) 279
+             283:     37(ptr) AccessChain 195(u16v) 282
+             284:     36(int) Load 283
+             285:     14(int) Load 200(i16)
+             286:     36(int) Bitcast 285
+             287:   173(bool) INotEqual 284 286
+                              Store 281(b) 287
+             288:     14(int) Load 200(i16)
+             289:     36(int) Bitcast 288
+             290:     37(ptr) AccessChain 195(u16v) 282
+             291:     36(int) Load 290
+             292:   173(bool) IEqual 289 291
+                              Store 281(b) 292
+             293:     37(ptr) AccessChain 195(u16v) 282
+             294:     36(int) Load 293
+             295:     17(int) UConvert 294
+             297:    296(ptr) AccessChain 227(uv) 264
+             298:     17(int) Load 297
+             299:   173(bool) UGreaterThan 295 298
+                              Store 281(b) 299
+             300:     14(int) Load 200(i16)
+             301:     27(int) SConvert 300
+             302:     27(int) Load 220(i)
+             303:   173(bool) SLessThan 301 302
+                              Store 281(b) 303
+             304:     37(ptr) AccessChain 195(u16v) 264
+             305:     36(int) Load 304
+             306:     17(int) UConvert 305
+             307:    296(ptr) AccessChain 227(uv) 282
+             308:     17(int) Load 307
+             309:   173(bool) UGreaterThanEqual 306 308
+                              Store 281(b) 309
+             310:     14(int) Load 200(i16)
+             311:     27(int) SConvert 310
+             312:     27(int) Load 220(i)
+             313:   173(bool) SLessThanEqual 311 312
+                              Store 281(b) 313
+             314:     14(int) Load 200(i16)
+             315:     27(int) SConvert 314
+             316:     17(int) Bitcast 315
+             317:  225(ivec3) Load 227(uv)
+             318:  225(ivec3) CompositeConstruct 316 316 316
+             319:  225(ivec3) BitwiseOr 317 318
+                              Store 227(uv) 319
+             320:     14(int) Load 200(i16)
+             321:     27(int) SConvert 320
+             322:     27(int) Load 220(i)
+             323:     27(int) BitwiseOr 321 322
+                              Store 220(i) 323
+             324:     14(int) Load 200(i16)
+             325:     71(int) SConvert 324
+             326:     71(int) Load 243(i64)
+             327:     71(int) BitwiseAnd 326 325
+                              Store 243(i64) 327
+             328:  193(ivec3) Load 195(u16v)
+             329:  225(ivec3) UConvert 328
+             330:  225(ivec3) Load 227(uv)
+             331:  225(ivec3) BitwiseAnd 329 330
+                              Store 227(uv) 331
+             332:     14(int) Load 200(i16)
+             333:     27(int) SConvert 332
+             334:     17(int) Bitcast 333
+             335:  225(ivec3) Load 227(uv)
+             336:  225(ivec3) CompositeConstruct 334 334 334
+             337:  225(ivec3) BitwiseXor 335 336
+                              Store 227(uv) 337
+             338:  193(ivec3) Load 195(u16v)
+             339:     14(int) Load 200(i16)
+             340:     36(int) Bitcast 339
+             341:  193(ivec3) CompositeConstruct 340 340 340
+             342:  193(ivec3) BitwiseXor 338 341
+                              Store 195(u16v) 342
                               Return
                               FunctionEnd
 12(builtinFuncs():           2 Function None 3
               13:             Label
-       345(i16v):     53(ptr) Variable Function
-        348(i16):     15(ptr) Variable Function
-       358(u16v):    194(ptr) Variable Function
-        360(u16):     37(ptr) Variable Function
-        430(i32):    219(ptr) Variable Function
-        433(i64):    242(ptr) Variable Function
-      436(i16v4):    435(ptr) Variable Function
-        439(u32):    298(ptr) Variable Function
-      440(u16v2):     58(ptr) Variable Function
-        444(u64):    443(ptr) Variable Function
-      447(u16v4):    446(ptr) Variable Function
-         459(bv):    458(ptr) Variable Function
-             346:   52(ivec2) Load 345(i16v)
-             347:   52(ivec2) ExtInst 1(GLSL.std.450) 5(SAbs) 346
-                              Store 345(i16v) 347
-             349:     14(int) Load 348(i16)
-             350:     14(int) ExtInst 1(GLSL.std.450) 7(SSign) 349
-                              Store 348(i16) 350
-             351:   52(ivec2) Load 345(i16v)
-             352:     14(int) Load 348(i16)
-             353:   52(ivec2) CompositeConstruct 352 352
-             354:   52(ivec2) ExtInst 1(GLSL.std.450) 39(SMin) 351 353
-                              Store 345(i16v) 354
-             355:   52(ivec2) Load 345(i16v)
-             357:   52(ivec2) ExtInst 1(GLSL.std.450) 39(SMin) 355 356
-                              Store 345(i16v) 357
-             359:  193(ivec3) Load 358(u16v)
-             361:     36(int) Load 360(u16)
-             362:  193(ivec3) CompositeConstruct 361 361 361
-             363:  193(ivec3) ExtInst 1(GLSL.std.450) 38(UMin) 359 362
-                              Store 358(u16v) 363
-             364:  193(ivec3) Load 358(u16v)
-             366:  193(ivec3) ExtInst 1(GLSL.std.450) 38(UMin) 364 365
-                              Store 358(u16v) 366
-             367:   52(ivec2) Load 345(i16v)
-             368:     14(int) Load 348(i16)
-             369:   52(ivec2) CompositeConstruct 368 368
-             370:   52(ivec2) ExtInst 1(GLSL.std.450) 42(SMax) 367 369
-                              Store 345(i16v) 370
-             371:   52(ivec2) Load 345(i16v)
-             372:   52(ivec2) ExtInst 1(GLSL.std.450) 42(SMax) 371 356
-                              Store 345(i16v) 372
-             373:  193(ivec3) Load 358(u16v)
-             374:     36(int) Load 360(u16)
-             375:  193(ivec3) CompositeConstruct 374 374 374
-             376:  193(ivec3) ExtInst 1(GLSL.std.450) 41(UMax) 373 375
-                              Store 358(u16v) 376
-             377:  193(ivec3) Load 358(u16v)
-             378:  193(ivec3) ExtInst 1(GLSL.std.450) 41(UMax) 377 365
-                              Store 358(u16v) 378
-             379:   52(ivec2) Load 345(i16v)
-             380:     14(int) Load 348(i16)
-             381:     14(int) SNegate 380
-             382:     14(int) Load 348(i16)
-             383:   52(ivec2) CompositeConstruct 381 381
-             384:   52(ivec2) CompositeConstruct 382 382
-             385:   52(ivec2) ExtInst 1(GLSL.std.450) 45(SClamp) 379 383 384
-                              Store 345(i16v) 385
-             386:   52(ivec2) Load 345(i16v)
-             387:   52(ivec2) Load 345(i16v)
-             388:   52(ivec2) SNegate 387
-             389:   52(ivec2) Load 345(i16v)
-             390:   52(ivec2) ExtInst 1(GLSL.std.450) 45(SClamp) 386 388 389
-                              Store 345(i16v) 390
-             391:  193(ivec3) Load 358(u16v)
-             392:     36(int) Load 360(u16)
-             393:     36(int) SNegate 392
-             394:     36(int) Load 360(u16)
-             395:  193(ivec3) CompositeConstruct 393 393 393
-             396:  193(ivec3) CompositeConstruct 394 394 394
-             397:  193(ivec3) ExtInst 1(GLSL.std.450) 44(UClamp) 391 395 396
-                              Store 358(u16v) 397
-             398:  193(ivec3) Load 358(u16v)
-             399:  193(ivec3) Load 358(u16v)
-             400:  193(ivec3) SNegate 399
-             401:  193(ivec3) Load 358(u16v)
-             402:  193(ivec3) ExtInst 1(GLSL.std.450) 44(UClamp) 398 400 401
-                              Store 358(u16v) 402
-             403:     15(ptr) AccessChain 345(i16v) 284
+       343(i16v):     53(ptr) Variable Function
+        346(i16):     15(ptr) Variable Function
+       356(u16v):    194(ptr) Variable Function
+        358(u16):     37(ptr) Variable Function
+        428(i32):    219(ptr) Variable Function
+        431(i64):    242(ptr) Variable Function
+      434(i16v4):    433(ptr) Variable Function
+        437(u32):    296(ptr) Variable Function
+      438(u16v2):     58(ptr) Variable Function
+        442(u64):    441(ptr) Variable Function
+      445(u16v4):    444(ptr) Variable Function
+         457(bv):    456(ptr) Variable Function
+             344:   52(ivec2) Load 343(i16v)
+             345:   52(ivec2) ExtInst 1(GLSL.std.450) 5(SAbs) 344
+                              Store 343(i16v) 345
+             347:     14(int) Load 346(i16)
+             348:     14(int) ExtInst 1(GLSL.std.450) 7(SSign) 347
+                              Store 346(i16) 348
+             349:   52(ivec2) Load 343(i16v)
+             350:     14(int) Load 346(i16)
+             351:   52(ivec2) CompositeConstruct 350 350
+             352:   52(ivec2) ExtInst 1(GLSL.std.450) 39(SMin) 349 351
+                              Store 343(i16v) 352
+             353:   52(ivec2) Load 343(i16v)
+             355:   52(ivec2) ExtInst 1(GLSL.std.450) 39(SMin) 353 354
+                              Store 343(i16v) 355
+             357:  193(ivec3) Load 356(u16v)
+             359:     36(int) Load 358(u16)
+             360:  193(ivec3) CompositeConstruct 359 359 359
+             361:  193(ivec3) ExtInst 1(GLSL.std.450) 38(UMin) 357 360
+                              Store 356(u16v) 361
+             362:  193(ivec3) Load 356(u16v)
+             364:  193(ivec3) ExtInst 1(GLSL.std.450) 38(UMin) 362 363
+                              Store 356(u16v) 364
+             365:   52(ivec2) Load 343(i16v)
+             366:     14(int) Load 346(i16)
+             367:   52(ivec2) CompositeConstruct 366 366
+             368:   52(ivec2) ExtInst 1(GLSL.std.450) 42(SMax) 365 367
+                              Store 343(i16v) 368
+             369:   52(ivec2) Load 343(i16v)
+             370:   52(ivec2) ExtInst 1(GLSL.std.450) 42(SMax) 369 354
+                              Store 343(i16v) 370
+             371:  193(ivec3) Load 356(u16v)
+             372:     36(int) Load 358(u16)
+             373:  193(ivec3) CompositeConstruct 372 372 372
+             374:  193(ivec3) ExtInst 1(GLSL.std.450) 41(UMax) 371 373
+                              Store 356(u16v) 374
+             375:  193(ivec3) Load 356(u16v)
+             376:  193(ivec3) ExtInst 1(GLSL.std.450) 41(UMax) 375 363
+                              Store 356(u16v) 376
+             377:   52(ivec2) Load 343(i16v)
+             378:     14(int) Load 346(i16)
+             379:     14(int) SNegate 378
+             380:     14(int) Load 346(i16)
+             381:   52(ivec2) CompositeConstruct 379 379
+             382:   52(ivec2) CompositeConstruct 380 380
+             383:   52(ivec2) ExtInst 1(GLSL.std.450) 45(SClamp) 377 381 382
+                              Store 343(i16v) 383
+             384:   52(ivec2) Load 343(i16v)
+             385:   52(ivec2) Load 343(i16v)
+             386:   52(ivec2) SNegate 385
+             387:   52(ivec2) Load 343(i16v)
+             388:   52(ivec2) ExtInst 1(GLSL.std.450) 45(SClamp) 384 386 387
+                              Store 343(i16v) 388
+             389:  193(ivec3) Load 356(u16v)
+             390:     36(int) Load 358(u16)
+             391:     36(int) SNegate 390
+             392:     36(int) Load 358(u16)
+             393:  193(ivec3) CompositeConstruct 391 391 391
+             394:  193(ivec3) CompositeConstruct 392 392 392
+             395:  193(ivec3) ExtInst 1(GLSL.std.450) 44(UClamp) 389 393 394
+                              Store 356(u16v) 395
+             396:  193(ivec3) Load 356(u16v)
+             397:  193(ivec3) Load 356(u16v)
+             398:  193(ivec3) SNegate 397
+             399:  193(ivec3) Load 356(u16v)
+             400:  193(ivec3) ExtInst 1(GLSL.std.450) 44(UClamp) 396 398 399
+                              Store 356(u16v) 400
+             401:     15(ptr) AccessChain 343(i16v) 282
+             402:     14(int) Load 401
+             403:     15(ptr) AccessChain 343(i16v) 264
              404:     14(int) Load 403
-             405:     15(ptr) AccessChain 345(i16v) 264
-             406:     14(int) Load 405
-             408:     14(int) Select 407 406 404
-                              Store 348(i16) 408
-             409:     14(int) Load 348(i16)
-             410:   52(ivec2) CompositeConstruct 409 409
-             411:     14(int) Load 348(i16)
-             412:     14(int) SNegate 411
-             413:   52(ivec2) CompositeConstruct 412 412
-             416:   52(ivec2) Select 415 413 410
-                              Store 345(i16v) 416
-             417:     37(ptr) AccessChain 358(u16v) 284
+             406:     14(int) Select 405 404 402
+                              Store 346(i16) 406
+             407:     14(int) Load 346(i16)
+             408:   52(ivec2) CompositeConstruct 407 407
+             409:     14(int) Load 346(i16)
+             410:     14(int) SNegate 409
+             411:   52(ivec2) CompositeConstruct 410 410
+             414:   52(ivec2) Select 413 411 408
+                              Store 343(i16v) 414
+             415:     37(ptr) AccessChain 356(u16v) 282
+             416:     36(int) Load 415
+             417:     37(ptr) AccessChain 356(u16v) 264
              418:     36(int) Load 417
-             419:     37(ptr) AccessChain 358(u16v) 264
-             420:     36(int) Load 419
-             421:     36(int) Select 407 420 418
-                              Store 360(u16) 421
-             422:     36(int) Load 360(u16)
-             423:  193(ivec3) CompositeConstruct 422 422 422
-             424:     36(int) Load 360(u16)
-             425:     36(int) SNegate 424
-             426:  193(ivec3) CompositeConstruct 425 425 425
-             429:  193(ivec3) Select 428 426 423
-                              Store 358(u16v) 429
-             431:   52(ivec2) Load 345(i16v)
-             432:     27(int) Bitcast 431
-                              Store 430(i32) 432
-             437:  434(ivec4) Load 436(i16v4)
-             438:     71(int) Bitcast 437
-                              Store 433(i64) 438
-             441:   57(ivec2) Load 440(u16v2)
-             442:     17(int) Bitcast 441
-                              Store 439(u32) 442
-             448:  445(ivec4) Load 447(u16v4)
-             449:     77(int) Bitcast 448
-                              Store 444(u64) 449
-             450:     27(int) Load 430(i32)
-             451:   52(ivec2) Bitcast 450
-                              Store 345(i16v) 451
-             452:     71(int) Load 433(i64)
-             453:  434(ivec4) Bitcast 452
-                              Store 436(i16v4) 453
-             454:     17(int) Load 439(u32)
-             455:   57(ivec2) Bitcast 454
-                              Store 440(u16v2) 455
-             456:     77(int) Load 444(u64)
-             457:  445(ivec4) Bitcast 456
-                              Store 447(u16v4) 457
-             460:  193(ivec3) Load 358(u16v)
-             461:     36(int) Load 360(u16)
-             462:  193(ivec3) CompositeConstruct 461 461 461
-             463:  427(bvec3) ULessThan 460 462
-                              Store 459(bv) 463
-             464:   52(ivec2) Load 345(i16v)
-             465:     14(int) Load 348(i16)
-             466:   52(ivec2) CompositeConstruct 465 465
-             467:  174(bvec2) SLessThan 464 466
-             468:  427(bvec3) Load 459(bv)
-             469:  427(bvec3) VectorShuffle 468 467 3 4 2
-                              Store 459(bv) 469
-             470:  193(ivec3) Load 358(u16v)
-             471:     36(int) Load 360(u16)
-             472:  193(ivec3) CompositeConstruct 471 471 471
-             473:  427(bvec3) ULessThanEqual 470 472
-                              Store 459(bv) 473
-             474:   52(ivec2) Load 345(i16v)
-             475:     14(int) Load 348(i16)
-             476:   52(ivec2) CompositeConstruct 475 475
-             477:  174(bvec2) SLessThanEqual 474 476
-             478:  427(bvec3) Load 459(bv)
-             479:  427(bvec3) VectorShuffle 478 477 3 4 2
-                              Store 459(bv) 479
-             480:  193(ivec3) Load 358(u16v)
-             481:     36(int) Load 360(u16)
-             482:  193(ivec3) CompositeConstruct 481 481 481
-             483:  427(bvec3) UGreaterThan 480 482
-                              Store 459(bv) 483
-             484:   52(ivec2) Load 345(i16v)
-             485:     14(int) Load 348(i16)
-             486:   52(ivec2) CompositeConstruct 485 485
-             487:  174(bvec2) SGreaterThan 484 486
-             488:  427(bvec3) Load 459(bv)
-             489:  427(bvec3) VectorShuffle 488 487 3 4 2
-                              Store 459(bv) 489
-             490:  193(ivec3) Load 358(u16v)
-             491:     36(int) Load 360(u16)
-             492:  193(ivec3) CompositeConstruct 491 491 491
-             493:  427(bvec3) UGreaterThanEqual 490 492
-                              Store 459(bv) 493
-             494:   52(ivec2) Load 345(i16v)
-             495:     14(int) Load 348(i16)
-             496:   52(ivec2) CompositeConstruct 495 495
-             497:  174(bvec2) SGreaterThanEqual 494 496
-             498:  427(bvec3) Load 459(bv)
-             499:  427(bvec3) VectorShuffle 498 497 3 4 2
-                              Store 459(bv) 499
-             500:  193(ivec3) Load 358(u16v)
-             501:     36(int) Load 360(u16)
-             502:  193(ivec3) CompositeConstruct 501 501 501
-             503:  427(bvec3) IEqual 500 502
-                              Store 459(bv) 503
-             504:   52(ivec2) Load 345(i16v)
-             505:     14(int) Load 348(i16)
-             506:   52(ivec2) CompositeConstruct 505 505
-             507:  174(bvec2) IEqual 504 506
-             508:  427(bvec3) Load 459(bv)
-             509:  427(bvec3) VectorShuffle 508 507 3 4 2
-                              Store 459(bv) 509
-             510:  193(ivec3) Load 358(u16v)
-             511:     36(int) Load 360(u16)
-             512:  193(ivec3) CompositeConstruct 511 511 511
-             513:  427(bvec3) INotEqual 510 512
-                              Store 459(bv) 513
-             514:   52(ivec2) Load 345(i16v)
-             515:     14(int) Load 348(i16)
-             516:   52(ivec2) CompositeConstruct 515 515
-             517:  174(bvec2) INotEqual 514 516
-             518:  427(bvec3) Load 459(bv)
-             519:  427(bvec3) VectorShuffle 518 517 3 4 2
-                              Store 459(bv) 519
+             419:     36(int) Select 405 418 416
+                              Store 358(u16) 419
+             420:     36(int) Load 358(u16)
+             421:  193(ivec3) CompositeConstruct 420 420 420
+             422:     36(int) Load 358(u16)
+             423:     36(int) SNegate 422
+             424:  193(ivec3) CompositeConstruct 423 423 423
+             427:  193(ivec3) Select 426 424 421
+                              Store 356(u16v) 427
+             429:   52(ivec2) Load 343(i16v)
+             430:     27(int) Bitcast 429
+                              Store 428(i32) 430
+             435:  432(ivec4) Load 434(i16v4)
+             436:     71(int) Bitcast 435
+                              Store 431(i64) 436
+             439:   57(ivec2) Load 438(u16v2)
+             440:     17(int) Bitcast 439
+                              Store 437(u32) 440
+             446:  443(ivec4) Load 445(u16v4)
+             447:     77(int) Bitcast 446
+                              Store 442(u64) 447
+             448:     27(int) Load 428(i32)
+             449:   52(ivec2) Bitcast 448
+                              Store 343(i16v) 449
+             450:     71(int) Load 431(i64)
+             451:  432(ivec4) Bitcast 450
+                              Store 434(i16v4) 451
+             452:     17(int) Load 437(u32)
+             453:   57(ivec2) Bitcast 452
+                              Store 438(u16v2) 453
+             454:     77(int) Load 442(u64)
+             455:  443(ivec4) Bitcast 454
+                              Store 445(u16v4) 455
+             458:  193(ivec3) Load 356(u16v)
+             459:     36(int) Load 358(u16)
+             460:  193(ivec3) CompositeConstruct 459 459 459
+             461:  425(bvec3) ULessThan 458 460
+                              Store 457(bv) 461
+             462:   52(ivec2) Load 343(i16v)
+             463:     14(int) Load 346(i16)
+             464:   52(ivec2) CompositeConstruct 463 463
+             465:  174(bvec2) SLessThan 462 464
+             466:  425(bvec3) Load 457(bv)
+             467:  425(bvec3) VectorShuffle 466 465 3 4 2
+                              Store 457(bv) 467
+             468:  193(ivec3) Load 356(u16v)
+             469:     36(int) Load 358(u16)
+             470:  193(ivec3) CompositeConstruct 469 469 469
+             471:  425(bvec3) ULessThanEqual 468 470
+                              Store 457(bv) 471
+             472:   52(ivec2) Load 343(i16v)
+             473:     14(int) Load 346(i16)
+             474:   52(ivec2) CompositeConstruct 473 473
+             475:  174(bvec2) SLessThanEqual 472 474
+             476:  425(bvec3) Load 457(bv)
+             477:  425(bvec3) VectorShuffle 476 475 3 4 2
+                              Store 457(bv) 477
+             478:  193(ivec3) Load 356(u16v)
+             479:     36(int) Load 358(u16)
+             480:  193(ivec3) CompositeConstruct 479 479 479
+             481:  425(bvec3) UGreaterThan 478 480
+                              Store 457(bv) 481
+             482:   52(ivec2) Load 343(i16v)
+             483:     14(int) Load 346(i16)
+             484:   52(ivec2) CompositeConstruct 483 483
+             485:  174(bvec2) SGreaterThan 482 484
+             486:  425(bvec3) Load 457(bv)
+             487:  425(bvec3) VectorShuffle 486 485 3 4 2
+                              Store 457(bv) 487
+             488:  193(ivec3) Load 356(u16v)
+             489:     36(int) Load 358(u16)
+             490:  193(ivec3) CompositeConstruct 489 489 489
+             491:  425(bvec3) UGreaterThanEqual 488 490
+                              Store 457(bv) 491
+             492:   52(ivec2) Load 343(i16v)
+             493:     14(int) Load 346(i16)
+             494:   52(ivec2) CompositeConstruct 493 493
+             495:  174(bvec2) SGreaterThanEqual 492 494
+             496:  425(bvec3) Load 457(bv)
+             497:  425(bvec3) VectorShuffle 496 495 3 4 2
+                              Store 457(bv) 497
+             498:  193(ivec3) Load 356(u16v)
+             499:     36(int) Load 358(u16)
+             500:  193(ivec3) CompositeConstruct 499 499 499
+             501:  425(bvec3) IEqual 498 500
+                              Store 457(bv) 501
+             502:   52(ivec2) Load 343(i16v)
+             503:     14(int) Load 346(i16)
+             504:   52(ivec2) CompositeConstruct 503 503
+             505:  174(bvec2) IEqual 502 504
+             506:  425(bvec3) Load 457(bv)
+             507:  425(bvec3) VectorShuffle 506 505 3 4 2
+                              Store 457(bv) 507
+             508:  193(ivec3) Load 356(u16v)
+             509:     36(int) Load 358(u16)
+             510:  193(ivec3) CompositeConstruct 509 509 509
+             511:  425(bvec3) INotEqual 508 510
+                              Store 457(bv) 511
+             512:   52(ivec2) Load 343(i16v)
+             513:     14(int) Load 346(i16)
+             514:   52(ivec2) CompositeConstruct 513 513
+             515:  174(bvec2) INotEqual 512 514
+             516:  425(bvec3) Load 457(bv)
+             517:  425(bvec3) VectorShuffle 516 515 3 4 2
+                              Store 457(bv) 517
                               Return
                               FunctionEnd
diff --git a/Test/cppBad.vert b/Test/cppBad.vert
index 49600f91670877c99df04423abd283b15aa10667..0044c44fce0149bb5a400157235be8a1e3e90153 100644
--- a/Test/cppBad.vert
+++ b/Test/cppBad.vert
@@ -1,5 +1,5 @@
 #define m#0#
 #if m
-
+#endif
 #define n()
 int n"
\ No newline at end of file
diff --git a/Test/cppRelaxSkipTokensErrors.vert b/Test/cppRelaxSkipTokensErrors.vert
new file mode 100644
index 0000000000000000000000000000000000000000..b30af0c9f96878f89f46a5d5625f0c9ca80935b6
--- /dev/null
+++ b/Test/cppRelaxSkipTokensErrors.vert
@@ -0,0 +1,14 @@
+#version 110
+
+#if 0
+3.5L
+3.5h
+2034h
+1.#INF
+0x1234567812345L
+12323394203923879234L
+0123s;
+123s;
+0123456712345671234L
+"string"
+#endif
diff --git a/Test/nvShaderNoperspectiveInterpolation.frag b/Test/nvShaderNoperspectiveInterpolation.frag
new file mode 100644
index 0000000000000000000000000000000000000000..15c191d039d8bee20e887b36c8c39addebbfa731
--- /dev/null
+++ b/Test/nvShaderNoperspectiveInterpolation.frag
@@ -0,0 +1,15 @@
+#version 300 es
+
+precision mediump float;
+
+noperspective in vec4 bad; // ERROR
+
+#extension GL_NV_shader_noperspective_interpolation : enable
+
+noperspective in vec4 color;
+
+out vec4 fragColor;
+
+void main() {
+    fragColor = color;
+}
\ No newline at end of file
diff --git a/Test/runtests b/Test/runtests
index 98d74660582ff74fbe5f9fe0df7969c7772c84c2..f8b4bc5bbd589cd1db555ff21f4c79d9dce25814 100755
--- a/Test/runtests
+++ b/Test/runtests
@@ -201,6 +201,13 @@ diff -b $BASEDIR/hlsl.y-negate-2.vert.out $TARGETDIR/hlsl.y-negate-2.vert.out ||
 $EXE -H -e main -V -D -Od -H -i --invert-y hlsl.y-negate-3.vert > $TARGETDIR/hlsl.y-negate-3.vert.out
 diff -b $BASEDIR/hlsl.y-negate-3.vert.out $TARGETDIR/hlsl.y-negate-3.vert.out || HASERROR=1
 
+#
+# Testing hlsl_functionality1
+#
+$EXE -H -e main -D -Od -fhlsl_functionality1 hlsl.structbuffer.incdec.frag > \
+    $TARGETDIR/hlsl.structbuffer.incdec.frag.hlslfun1.out
+diff -b $BASEDIR/hlsl.structbuffer.incdec.frag.hlslfun1.out $TARGETDIR/hlsl.structbuffer.incdec.frag.hlslfun1.out || HASERROR=1
+
 #
 # Final checking
 #
diff --git a/Test/spv.int64.frag b/Test/spv.int64.frag
index bcbb24b342ea132bc939e2de57f31650a8442055..8fda12b3aa2e7623d2bbf751096f1373a9f47d90 100644
--- a/Test/spv.int64.frag
+++ b/Test/spv.int64.frag
@@ -116,6 +116,8 @@ void operators()
     i64  = i64 % i;
 
     // Shift
+    u64v = u64v << i;
+    i64 = i64 >> uv.y;
     u64v <<= i;
     i64  >>= uv.y;
 
diff --git a/Test/spv.rankShift.comp b/Test/spv.rankShift.comp
new file mode 100644
index 0000000000000000000000000000000000000000..1761ad1f52a0bc2a00d9801383d630b59ae94cd0
--- /dev/null
+++ b/Test/spv.rankShift.comp
@@ -0,0 +1,15 @@
+#version 450
+#extension GL_ARB_gpu_shader_int64 : require
+
+layout(local_size_x = 54) in;
+
+layout(location=4) uniform int64_t arg0;
+layout(location=5) uniform uint arg1;
+
+void main()
+{
+    uint64_t result = arg0 << arg1;
+    result = arg0 >> arg1;
+    result <<= arg1;
+    result >>= arg1;
+}
\ No newline at end of file
diff --git a/glslang/Include/Common.h b/glslang/Include/Common.h
index f7448fa00c423b2ec7a32a72ea59a26c04104fa2..f2fb10bf33171c538a7bba7e14f7c430ee6937c7 100644
--- a/glslang/Include/Common.h
+++ b/glslang/Include/Common.h
@@ -37,9 +37,24 @@
 #ifndef _COMMON_INCLUDED_
 #define _COMMON_INCLUDED_
 
+
+#if defined(__ANDROID__) || _MSC_VER < 1700
+#include <sstream>
+namespace std {
+template<typename T>
+std::string to_string(const T& val) {
+  std::ostringstream os;
+  os << val;
+  return os.str();
+}
+}
+#endif
+
 #if (defined(_MSC_VER) && _MSC_VER < 1900 /*vs2015*/) || defined MINGW_HAS_SECURE_API
     #include <basetsd.h>
+    #ifndef snprintf
     #define snprintf sprintf_s
+    #endif
     #define safe_vsprintf(buf,max,format,args) vsnprintf_s((buf), (max), (max), (format), (args))
 #elif defined (solaris)
     #define safe_vsprintf(buf,max,format,args) vsnprintf((buf), (max), (format), (args))
@@ -51,18 +66,6 @@
     #define UINT_PTR uintptr_t
 #endif
 
-#if defined(__ANDROID__) || (defined(_MSC_VER) && _MSC_VER < 1700)
-#include <sstream>
-namespace std {
-template<typename T>
-std::string to_string(const T& val) {
-  std::ostringstream os;
-  os << val;
-  return os.str();
-}
-}
-#endif
-
 #if defined(_MSC_VER) && _MSC_VER < 1800
 inline long long int strtoll (const char* str, char** endptr, int base)
 {
diff --git a/glslang/Include/revision.h b/glslang/Include/revision.h
index 4b56547509d4a8bb07a2cf923121de8128686950..0a3b291720d14e5b2b3c28e4df6da44f85dc6019 100644
--- a/glslang/Include/revision.h
+++ b/glslang/Include/revision.h
@@ -1,3 +1,3 @@
 // This header is generated by the make-revision script.
 
-#define GLSLANG_PATCH_LEVEL 2604
+#define GLSLANG_PATCH_LEVEL 2637
diff --git a/glslang/MachineIndependent/Intermediate.cpp b/glslang/MachineIndependent/Intermediate.cpp
index cd5060e0bbad7c0e8e3ba9a5bbacc41dae1a6417..83d188e1a1f38c1e64ab917b4e875c05138bfd0d 100644
--- a/glslang/MachineIndependent/Intermediate.cpp
+++ b/glslang/MachineIndependent/Intermediate.cpp
@@ -475,7 +475,7 @@ bool TIntermediate::isConversionAllowed(TOperator op, TIntermTyped* node) const
 
 // This is 'mechanism' here, it does any conversion told.
 // It is about basic type, not about shape.
-// The policy comes from the shader or the above code.
+// The policy comes from the shader or the calling code.
 TIntermUnary* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped* node) const
 {
     //
@@ -488,44 +488,44 @@ TIntermUnary* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped
     switch (convertTo) {
     case EbtDouble:
         switch (node->getBasicType()) {
-        case EbtInt8:  newOp = EOpConvInt8ToDouble;  break;
-        case EbtUint8: newOp = EOpConvUint8ToDouble; break;
-        case EbtInt16: newOp = EOpConvInt16ToDouble; break;
-        case EbtUint16:newOp = EOpConvUint16ToDouble;break;
-        case EbtInt:   newOp = EOpConvIntToDouble;   break;
-        case EbtUint:  newOp = EOpConvUintToDouble;  break;
-        case EbtBool:  newOp = EOpConvBoolToDouble;  break;
-        case EbtFloat: newOp = EOpConvFloatToDouble; break;
+        case EbtInt8:    newOp = EOpConvInt8ToDouble;    break;
+        case EbtUint8:   newOp = EOpConvUint8ToDouble;   break;
+        case EbtInt16:   newOp = EOpConvInt16ToDouble;   break;
+        case EbtUint16:  newOp = EOpConvUint16ToDouble;  break;
+        case EbtInt:     newOp = EOpConvIntToDouble;     break;
+        case EbtUint:    newOp = EOpConvUintToDouble;    break;
+        case EbtBool:    newOp = EOpConvBoolToDouble;    break;
+        case EbtFloat:   newOp = EOpConvFloatToDouble;   break;
         case EbtFloat16: newOp = EOpConvFloat16ToDouble; break;
-        case EbtInt64: newOp = EOpConvInt64ToDouble; break;
-        case EbtUint64: newOp = EOpConvUint64ToDouble; break;
+        case EbtInt64:   newOp = EOpConvInt64ToDouble;   break;
+        case EbtUint64:  newOp = EOpConvUint64ToDouble;  break;
         default:
             return nullptr;
         }
         break;
     case EbtFloat:
         switch (node->getBasicType()) {
-        case EbtInt8:   newOp = EOpConvInt8ToFloat;    break;
-        case EbtUint8:  newOp = EOpConvUint8ToFloat;   break;
-        case EbtInt16:  newOp = EOpConvInt16ToFloat;    break;
-        case EbtUint16: newOp = EOpConvUint16ToFloat;   break;
-        case EbtInt:    newOp = EOpConvIntToFloat;    break;
-        case EbtUint:   newOp = EOpConvUintToFloat;   break;
-        case EbtBool:   newOp = EOpConvBoolToFloat;   break;
-        case EbtDouble: newOp = EOpConvDoubleToFloat; break;
+        case EbtInt8:    newOp = EOpConvInt8ToFloat;    break;
+        case EbtUint8:   newOp = EOpConvUint8ToFloat;   break;
+        case EbtInt16:   newOp = EOpConvInt16ToFloat;   break;
+        case EbtUint16:  newOp = EOpConvUint16ToFloat;  break;
+        case EbtInt:     newOp = EOpConvIntToFloat;     break;
+        case EbtUint:    newOp = EOpConvUintToFloat;    break;
+        case EbtBool:    newOp = EOpConvBoolToFloat;    break;
+        case EbtDouble:  newOp = EOpConvDoubleToFloat;  break;
         case EbtFloat16: newOp = EOpConvFloat16ToFloat; break;
-        case EbtInt64:  newOp = EOpConvInt64ToFloat;  break;
-        case EbtUint64: newOp = EOpConvUint64ToFloat; break;
+        case EbtInt64:   newOp = EOpConvInt64ToFloat;   break;
+        case EbtUint64:  newOp = EOpConvUint64ToFloat;  break;
         default:
             return nullptr;
         }
         break;
     case EbtFloat16:
         switch (node->getBasicType()) {
-        case EbtInt8:   newOp = EOpConvInt8ToFloat16;    break;
-        case EbtUint8:  newOp = EOpConvUint8ToFloat16;   break;
-        case EbtInt16:  newOp = EOpConvInt16ToFloat16;    break;
-        case EbtUint16: newOp = EOpConvUint16ToFloat16;   break;
+        case EbtInt8:   newOp = EOpConvInt8ToFloat16;   break;
+        case EbtUint8:  newOp = EOpConvUint8ToFloat16;  break;
+        case EbtInt16:  newOp = EOpConvInt16ToFloat16;  break;
+        case EbtUint16: newOp = EOpConvUint16ToFloat16; break;
         case EbtInt:    newOp = EOpConvIntToFloat16;    break;
         case EbtUint:   newOp = EOpConvUintToFloat16;   break;
         case EbtBool:   newOp = EOpConvBoolToFloat16;   break;
@@ -539,33 +539,33 @@ TIntermUnary* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped
         break;
     case EbtBool:
         switch (node->getBasicType()) {
-        case EbtInt8:   newOp = EOpConvInt8ToBool;   break;
-        case EbtUint8:  newOp = EOpConvUint8ToBool;  break;
-        case EbtInt16:  newOp = EOpConvInt16ToBool;  break;
-        case EbtUint16: newOp = EOpConvUint16ToBool; break;
-        case EbtInt:    newOp = EOpConvIntToBool;    break;
-        case EbtUint:   newOp = EOpConvUintToBool;   break;
-        case EbtFloat:  newOp = EOpConvFloatToBool;  break;
-        case EbtDouble: newOp = EOpConvDoubleToBool; break;
+        case EbtInt8:    newOp = EOpConvInt8ToBool;    break;
+        case EbtUint8:   newOp = EOpConvUint8ToBool;   break;
+        case EbtInt16:   newOp = EOpConvInt16ToBool;   break;
+        case EbtUint16:  newOp = EOpConvUint16ToBool;  break;
+        case EbtInt:     newOp = EOpConvIntToBool;     break;
+        case EbtUint:    newOp = EOpConvUintToBool;    break;
+        case EbtFloat:   newOp = EOpConvFloatToBool;   break;
+        case EbtDouble:  newOp = EOpConvDoubleToBool;  break;
         case EbtFloat16: newOp = EOpConvFloat16ToBool; break;
-        case EbtInt64:  newOp = EOpConvInt64ToBool;  break;
-        case EbtUint64: newOp = EOpConvUint64ToBool; break;
+        case EbtInt64:   newOp = EOpConvInt64ToBool;   break;
+        case EbtUint64:  newOp = EOpConvUint64ToBool;  break;
         default:
             return nullptr;
         }
         break;
     case EbtInt8:
         switch (node->getBasicType()) {
-        case EbtUint8:  newOp = EOpConvUint8ToInt8;   break;
-        case EbtInt16:  newOp = EOpConvInt16ToInt8;   break;
-        case EbtUint16: newOp = EOpConvUint16ToInt8;  break;
-        case EbtInt:    newOp = EOpConvIntToInt8;   break;
-        case EbtUint:   newOp = EOpConvUintToInt8;   break;
-        case EbtInt64:  newOp = EOpConvInt64ToInt8;  break;
-        case EbtUint64: newOp = EOpConvUint64ToInt8; break;
-        case EbtBool:   newOp = EOpConvBoolToInt8;   break;
-        case EbtFloat:  newOp = EOpConvFloatToInt8;  break;
-        case EbtDouble: newOp = EOpConvDoubleToInt8; break;
+        case EbtUint8:   newOp = EOpConvUint8ToInt8;   break;
+        case EbtInt16:   newOp = EOpConvInt16ToInt8;   break;
+        case EbtUint16:  newOp = EOpConvUint16ToInt8;  break;
+        case EbtInt:     newOp = EOpConvIntToInt8;     break;
+        case EbtUint:    newOp = EOpConvUintToInt8;    break;
+        case EbtInt64:   newOp = EOpConvInt64ToInt8;   break;
+        case EbtUint64:  newOp = EOpConvUint64ToInt8;  break;
+        case EbtBool:    newOp = EOpConvBoolToInt8;    break;
+        case EbtFloat:   newOp = EOpConvFloatToInt8;   break;
+        case EbtDouble:  newOp = EOpConvDoubleToInt8;  break;
         case EbtFloat16: newOp = EOpConvFloat16ToInt8; break;
         default:
             return nullptr;
@@ -573,16 +573,16 @@ TIntermUnary* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped
         break;
     case EbtUint8:
         switch (node->getBasicType()) {
-        case EbtInt8:   newOp = EOpConvInt8ToUint8;   break;
-        case EbtInt16:  newOp = EOpConvInt16ToUint8;  break;
-        case EbtUint16: newOp = EOpConvUint16ToUint8; break;
-        case EbtInt:    newOp = EOpConvIntToUint8;    break;
-        case EbtUint:   newOp = EOpConvUintToUint8;   break;
-        case EbtInt64:  newOp = EOpConvInt64ToUint8;  break;
-        case EbtUint64: newOp = EOpConvUint64ToUint8; break;
-        case EbtBool:   newOp = EOpConvBoolToUint8;   break;
-        case EbtFloat:  newOp = EOpConvFloatToUint8;  break;
-        case EbtDouble: newOp = EOpConvDoubleToUint8; break;
+        case EbtInt8:    newOp = EOpConvInt8ToUint8;    break;
+        case EbtInt16:   newOp = EOpConvInt16ToUint8;   break;
+        case EbtUint16:  newOp = EOpConvUint16ToUint8;  break;
+        case EbtInt:     newOp = EOpConvIntToUint8;     break;
+        case EbtUint:    newOp = EOpConvUintToUint8;    break;
+        case EbtInt64:   newOp = EOpConvInt64ToUint8;   break;
+        case EbtUint64:  newOp = EOpConvUint64ToUint8;  break;
+        case EbtBool:    newOp = EOpConvBoolToUint8;    break;
+        case EbtFloat:   newOp = EOpConvFloatToUint8;   break;
+        case EbtDouble:  newOp = EOpConvDoubleToUint8;  break;
         case EbtFloat16: newOp = EOpConvFloat16ToUint8; break;
         default:
             return nullptr;
@@ -591,16 +591,16 @@ TIntermUnary* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped
 
     case EbtInt16:
         switch (node->getBasicType()) {
-        case EbtUint8:  newOp = EOpConvUint8ToInt16;   break;
-        case EbtInt8:   newOp = EOpConvInt8ToInt16;   break;
-        case EbtUint16: newOp = EOpConvUint16ToInt16;  break;
-        case EbtInt:    newOp = EOpConvIntToInt16;   break;
-        case EbtUint:   newOp = EOpConvUintToInt16;   break;
-        case EbtInt64:  newOp = EOpConvInt64ToInt16;  break;
-        case EbtUint64: newOp = EOpConvUint64ToInt16; break;
-        case EbtBool:   newOp = EOpConvBoolToInt16;   break;
-        case EbtFloat:  newOp = EOpConvFloatToInt16;  break;
-        case EbtDouble: newOp = EOpConvDoubleToInt16; break;
+        case EbtUint8:   newOp = EOpConvUint8ToInt16;   break;
+        case EbtInt8:    newOp = EOpConvInt8ToInt16;    break;
+        case EbtUint16:  newOp = EOpConvUint16ToInt16;  break;
+        case EbtInt:     newOp = EOpConvIntToInt16;     break;
+        case EbtUint:    newOp = EOpConvUintToInt16;    break;
+        case EbtInt64:   newOp = EOpConvInt64ToInt16;   break;
+        case EbtUint64:  newOp = EOpConvUint64ToInt16;  break;
+        case EbtBool:    newOp = EOpConvBoolToInt16;    break;
+        case EbtFloat:   newOp = EOpConvFloatToInt16;   break;
+        case EbtDouble:  newOp = EOpConvDoubleToInt16;  break;
         case EbtFloat16: newOp = EOpConvFloat16ToInt16; break;
         default:
             return nullptr;
@@ -608,16 +608,16 @@ TIntermUnary* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped
         break;
     case EbtUint16:
         switch (node->getBasicType()) {
-        case EbtInt8:   newOp = EOpConvInt8ToUint16;   break;
-        case EbtUint8:  newOp = EOpConvUint8ToUint16;  break;
-        case EbtInt16:  newOp = EOpConvInt16ToUint16; break;
-        case EbtInt:    newOp = EOpConvIntToUint16;    break;
-        case EbtUint:   newOp = EOpConvUintToUint16;   break;
-        case EbtInt64:  newOp = EOpConvInt64ToUint16;  break;
-        case EbtUint64: newOp = EOpConvUint64ToUint16; break;
-        case EbtBool:   newOp = EOpConvBoolToUint16;   break;
-        case EbtFloat:  newOp = EOpConvFloatToUint16;  break;
-        case EbtDouble: newOp = EOpConvDoubleToUint16; break;
+        case EbtInt8:    newOp = EOpConvInt8ToUint16;    break;
+        case EbtUint8:   newOp = EOpConvUint8ToUint16;   break;
+        case EbtInt16:   newOp = EOpConvInt16ToUint16;   break;
+        case EbtInt:     newOp = EOpConvIntToUint16;     break;
+        case EbtUint:    newOp = EOpConvUintToUint16;    break;
+        case EbtInt64:   newOp = EOpConvInt64ToUint16;   break;
+        case EbtUint64:  newOp = EOpConvUint64ToUint16;  break;
+        case EbtBool:    newOp = EOpConvBoolToUint16;    break;
+        case EbtFloat:   newOp = EOpConvFloatToUint16;   break;
+        case EbtDouble:  newOp = EOpConvDoubleToUint16;  break;
         case EbtFloat16: newOp = EOpConvFloat16ToUint16; break;
         default:
             return nullptr;
@@ -626,68 +626,68 @@ TIntermUnary* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped
 
     case EbtInt:
         switch (node->getBasicType()) {
-        case EbtInt8:   newOp = EOpConvInt8ToInt;    break;
-        case EbtUint8:  newOp = EOpConvUint8ToInt;   break;
-        case EbtInt16:  newOp = EOpConvInt16ToInt;   break;
-        case EbtUint16: newOp = EOpConvUint16ToInt;  break;
-        case EbtUint:   newOp = EOpConvUintToInt;   break;
-        case EbtBool:   newOp = EOpConvBoolToInt;   break;
-        case EbtFloat:  newOp = EOpConvFloatToInt;  break;
-        case EbtDouble: newOp = EOpConvDoubleToInt; break;
+        case EbtInt8:    newOp = EOpConvInt8ToInt;    break;
+        case EbtUint8:   newOp = EOpConvUint8ToInt;   break;
+        case EbtInt16:   newOp = EOpConvInt16ToInt;   break;
+        case EbtUint16:  newOp = EOpConvUint16ToInt;  break;
+        case EbtUint:    newOp = EOpConvUintToInt;    break;
+        case EbtBool:    newOp = EOpConvBoolToInt;    break;
+        case EbtFloat:   newOp = EOpConvFloatToInt;   break;
+        case EbtDouble:  newOp = EOpConvDoubleToInt;  break;
         case EbtFloat16: newOp = EOpConvFloat16ToInt; break;
-        case EbtInt64:  newOp = EOpConvInt64ToInt;  break;
-        case EbtUint64: newOp = EOpConvUint64ToInt; break;
+        case EbtInt64:   newOp = EOpConvInt64ToInt;   break;
+        case EbtUint64:  newOp = EOpConvUint64ToInt;  break;
         default:
             return nullptr;
         }
         break;
     case EbtUint:
         switch (node->getBasicType()) {
-        case EbtInt8:   newOp = EOpConvInt8ToUint;   break;
-        case EbtUint8:  newOp = EOpConvUint8ToUint;  break;
-        case EbtInt16:  newOp = EOpConvInt16ToUint;  break;
-        case EbtUint16: newOp = EOpConvUint16ToUint; break;
-        case EbtInt:    newOp = EOpConvIntToUint;    break;
-        case EbtBool:   newOp = EOpConvBoolToUint;   break;
-        case EbtFloat:  newOp = EOpConvFloatToUint;  break;
-        case EbtDouble: newOp = EOpConvDoubleToUint; break;
+        case EbtInt8:    newOp = EOpConvInt8ToUint;    break;
+        case EbtUint8:   newOp = EOpConvUint8ToUint;   break;
+        case EbtInt16:   newOp = EOpConvInt16ToUint;   break;
+        case EbtUint16:  newOp = EOpConvUint16ToUint;  break;
+        case EbtInt:     newOp = EOpConvIntToUint;     break;
+        case EbtBool:    newOp = EOpConvBoolToUint;    break;
+        case EbtFloat:   newOp = EOpConvFloatToUint;   break;
+        case EbtDouble:  newOp = EOpConvDoubleToUint;  break;
         case EbtFloat16: newOp = EOpConvFloat16ToUint; break;
-        case EbtInt64:  newOp = EOpConvInt64ToUint;  break;
-        case EbtUint64: newOp = EOpConvUint64ToUint; break;
+        case EbtInt64:   newOp = EOpConvInt64ToUint;   break;
+        case EbtUint64:  newOp = EOpConvUint64ToUint;  break;
         default:
             return nullptr;
         }
         break;
     case EbtInt64:
         switch (node->getBasicType()) {
-        case EbtInt8:   newOp = EOpConvInt8ToInt64;   break;
-        case EbtUint8:  newOp = EOpConvUint8ToInt64;  break;
-        case EbtInt16:  newOp = EOpConvInt16ToInt64;  break;
-        case EbtUint16: newOp = EOpConvUint16ToInt64; break;
-        case EbtInt:    newOp = EOpConvIntToInt64;    break;
-        case EbtUint:   newOp = EOpConvUintToInt64;   break;
-        case EbtBool:   newOp = EOpConvBoolToInt64;   break;
-        case EbtFloat:  newOp = EOpConvFloatToInt64;  break;
-        case EbtDouble: newOp = EOpConvDoubleToInt64; break;
+        case EbtInt8:    newOp = EOpConvInt8ToInt64;    break;
+        case EbtUint8:   newOp = EOpConvUint8ToInt64;   break;
+        case EbtInt16:   newOp = EOpConvInt16ToInt64;   break;
+        case EbtUint16:  newOp = EOpConvUint16ToInt64;  break;
+        case EbtInt:     newOp = EOpConvIntToInt64;     break;
+        case EbtUint:    newOp = EOpConvUintToInt64;    break;
+        case EbtBool:    newOp = EOpConvBoolToInt64;    break;
+        case EbtFloat:   newOp = EOpConvFloatToInt64;   break;
+        case EbtDouble:  newOp = EOpConvDoubleToInt64;  break;
         case EbtFloat16: newOp = EOpConvFloat16ToInt64; break;
-        case EbtUint64: newOp = EOpConvUint64ToInt64; break;
+        case EbtUint64:  newOp = EOpConvUint64ToInt64;  break;
         default:
             return nullptr;
         }
         break;
     case EbtUint64:
         switch (node->getBasicType()) {
-        case EbtInt8:   newOp = EOpConvInt8ToUint64;   break;
-        case EbtUint8:  newOp = EOpConvUint8ToUint64;  break;
-        case EbtInt16:  newOp = EOpConvInt16ToUint64;  break;
-        case EbtUint16: newOp = EOpConvUint16ToUint64; break;
-        case EbtInt:    newOp = EOpConvIntToUint64;    break;
-        case EbtUint:   newOp = EOpConvUintToUint64;   break;
-        case EbtBool:   newOp = EOpConvBoolToUint64;   break;
-        case EbtFloat:  newOp = EOpConvFloatToUint64;  break;
-        case EbtDouble: newOp = EOpConvDoubleToUint64; break;
+        case EbtInt8:    newOp = EOpConvInt8ToUint64;    break;
+        case EbtUint8:   newOp = EOpConvUint8ToUint64;   break;
+        case EbtInt16:   newOp = EOpConvInt16ToUint64;   break;
+        case EbtUint16:  newOp = EOpConvUint16ToUint64;  break;
+        case EbtInt:     newOp = EOpConvIntToUint64;     break;
+        case EbtUint:    newOp = EOpConvUintToUint64;    break;
+        case EbtBool:    newOp = EOpConvBoolToUint64;    break;
+        case EbtFloat:   newOp = EOpConvFloatToUint64;   break;
+        case EbtDouble:  newOp = EOpConvDoubleToUint64;  break;
         case EbtFloat16: newOp = EOpConvFloat16ToUint64; break;
-        case EbtInt64:  newOp = EOpConvInt64ToUint64;  break;
+        case EbtInt64:   newOp = EOpConvInt64ToUint64;   break;
         default:
             return nullptr;
         }
@@ -714,30 +714,36 @@ TIntermUnary* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped
     return newNode;
 }
 
+// For converting a pair of operands to a binary operation to compatible
+// types with each other, relative to the operation in 'op'.
+// This does not cover assignment operations, which is asymmetric in that the
+// left type is not changeable.
+// See addConversion(op, type, node) for assignments and unary operation
+// conversions.
+//
+// Generally, this is focused on basic type conversion, not shape conversion.
+// See addShapeConversion() for shape conversions.
+//
+// Returns the converted pair of nodes.
+// Returns <nullptr, nullptr> when there is no conversion.
 std::tuple<TIntermTyped*, TIntermTyped*>
 TIntermediate::addConversion(TOperator op, TIntermTyped* node0, TIntermTyped* node1) const
 {
-    if (!isConversionAllowed(op, node0) || !isConversionAllowed(op, node1)) {
+    if (!isConversionAllowed(op, node0) || !isConversionAllowed(op, node1))
         return std::make_tuple(nullptr, nullptr);
-    }
-
-    // If types are identical, no problem
-    if (node0->getType() == node1->getType())
-        return std::make_tuple(node0, node1);
 
-    // If one's a structure, then no conversions.
-    if (node0->isStruct() || node1->isStruct())
-        return std::make_tuple(nullptr, nullptr);
+    if (node0->getType() != node1->getType()) {
+        // If differing structure, then no conversions.
+        if (node0->isStruct() || node1->isStruct())
+            return std::make_tuple(nullptr, nullptr);
 
-    // If one's an array, then no conversions.
-    if (node0->getType().isArray() || node1->getType().isArray())
-        return std::make_tuple(nullptr, nullptr);
+        // If differing arrays, then no conversions.
+        if (node0->getType().isArray() || node1->getType().isArray())
+            return std::make_tuple(nullptr, nullptr);
+    }
 
     auto promoteTo = std::make_tuple(EbtNumTypes, EbtNumTypes);
 
-    TBasicType type0 = node0->getType().getBasicType();
-    TBasicType type1 = node1->getType().getBasicType();
-
     switch (op) {
     //
     // List all the binary ops that can implicitly convert one operand to the other's type;
@@ -764,80 +770,52 @@ TIntermediate::addConversion(TOperator op, TIntermTyped* node0, TIntermTyped* no
     case EOpAnd:
     case EOpInclusiveOr:
     case EOpExclusiveOr:
-    case EOpAndAssign:
-    case EOpInclusiveOrAssign:
-    case EOpExclusiveOrAssign:
-    case EOpLogicalNot:
-    case EOpLogicalAnd:
-    case EOpLogicalOr:
-    case EOpLogicalXor:
-
-    case EOpFunctionCall:
-    case EOpReturn:
-    case EOpAssign:
-    case EOpAddAssign:
-    case EOpSubAssign:
-    case EOpMulAssign:
-    case EOpVectorTimesScalarAssign:
-    case EOpMatrixTimesScalarAssign:
-    case EOpDivAssign:
-    case EOpModAssign:
-
-    case EOpAtan:
-    case EOpClamp:
-    case EOpCross:
-    case EOpDistance:
-    case EOpDot:
-    case EOpDst:
-    case EOpFaceForward:
-    case EOpFma:
-    case EOpFrexp:
-    case EOpLdexp:
-    case EOpMix:
-    case EOpLit:
-    case EOpMax:
-    case EOpMin:
-    case EOpModf:
-    case EOpPow:
-    case EOpReflect:
-    case EOpRefract:
-    case EOpSmoothStep:
-    case EOpStep:
 
-    case EOpSequence:
-    case EOpConstructStruct:
+    case EOpSequence:          // used by ?:
 
-        if (type0 == type1)
+        if (node0->getBasicType() == node1->getBasicType())
             return std::make_tuple(node0, node1);
 
-        promoteTo = getConversionDestinatonType(type0, type1, op);
+        promoteTo = getConversionDestinatonType(node0->getBasicType(), node1->getBasicType(), op);
         if (std::get<0>(promoteTo) == EbtNumTypes || std::get<1>(promoteTo) == EbtNumTypes)
             return std::make_tuple(nullptr, nullptr);
 
         break;
 
-    // Shifts can have mixed types as long as they are integer and of the same rank,
-    // without converting.
-    // It's the left operand's type that determines the resulting type, so no issue
-    // with assign shift ops either.
+    case EOpLogicalAnd:
+    case EOpLogicalOr:
+    case EOpLogicalXor:
+        if (source == EShSourceHlsl)
+            promoteTo = std::make_tuple(EbtBool, EbtBool);
+        else
+            return std::make_tuple(node0, node1);
+        break;
+
+    // There are no conversions needed for GLSL; the shift amount just needs to be an
+    // integer type, as does the base.
+    // HLSL can promote bools to ints to make this work.
     case EOpLeftShift:
     case EOpRightShift:
-    case EOpLeftShiftAssign:
-    case EOpRightShiftAssign:
-
-        if (isTypeInt(type0) && isTypeInt(type1)) {
-            if (getTypeRank(type0) == getTypeRank(type1)) {
+        if (source == EShSourceHlsl) {
+            TBasicType node0BasicType = node0->getBasicType();
+            if (node0BasicType == EbtBool)
+                node0BasicType = EbtInt;
+            if (node1->getBasicType() == EbtBool)
+                promoteTo = std::make_tuple(node0BasicType, EbtInt);
+            else
+                promoteTo = std::make_tuple(node0BasicType, node1->getBasicType());
+        } else {
+            if (isTypeInt(node0->getBasicType()) && isTypeInt(node1->getBasicType()))
                 return std::make_tuple(node0, node1);
-            } else {
-                promoteTo = getConversionDestinatonType(type0, type1, op);
-                if (std::get<0>(promoteTo) == EbtNumTypes || std::get<1>(promoteTo) == EbtNumTypes)
-                    return std::make_tuple(nullptr, nullptr);
-            }
-        } else
-            return std::make_tuple(nullptr, nullptr);
+            else
+                return std::make_tuple(nullptr, nullptr);
+        }
         break;
 
     default:
+        if (node0->getType() == node1->getType())
+            return std::make_tuple(node0, node1);
+
         return std::make_tuple(nullptr, nullptr);
     }
 
@@ -868,11 +846,13 @@ TIntermediate::addConversion(TOperator op, TIntermTyped* node0, TIntermTyped* no
 // For implicit conversions, 'op' is not the requested conversion, it is the explicit
 // operation requiring the implicit conversion.
 //
+// Binary operation conversions should be handled by addConversion(op, node, node), not here.
+//
 // Returns a node representing the conversion, which could be the same
 // node passed in if no conversion was needed.
 //
 // Generally, this is focused on basic type conversion, not shape conversion.
-// See addShapeConversion().
+// See addShapeConversion() for shape conversions.
 //
 // Return nullptr if a conversion can't be done.
 //
@@ -939,40 +919,10 @@ TIntermTyped* TIntermediate::addConversion(TOperator op, const TType& type, TInt
         promoteTo = EbtUint64;
         break;
 
-    //
-    // List all the binary ops that can implicitly convert one operand to the other's type;
-    // This implements the 'policy' for implicit type conversion.
-    //
-    case EOpLessThan:
-    case EOpGreaterThan:
-    case EOpLessThanEqual:
-    case EOpGreaterThanEqual:
-    case EOpEqual:
-    case EOpNotEqual:
-
-    case EOpAdd:
-    case EOpSub:
-    case EOpMul:
-    case EOpDiv:
-    case EOpMod:
-
-    case EOpVectorTimesScalar:
-    case EOpVectorTimesMatrix:
-    case EOpMatrixTimesVector:
-    case EOpMatrixTimesScalar:
-
-    case EOpAnd:
-    case EOpInclusiveOr:
-    case EOpExclusiveOr:
-    case EOpAndAssign:
-    case EOpInclusiveOrAssign:
-    case EOpExclusiveOrAssign:
     case EOpLogicalNot:
-    case EOpLogicalAnd:
-    case EOpLogicalOr:
-    case EOpLogicalXor:
 
     case EOpFunctionCall:
+
     case EOpReturn:
     case EOpAssign:
     case EOpAddAssign:
@@ -982,6 +932,9 @@ TIntermTyped* TIntermediate::addConversion(TOperator op, const TType& type, TInt
     case EOpMatrixTimesScalarAssign:
     case EOpDivAssign:
     case EOpModAssign:
+    case EOpAndAssign:
+    case EOpInclusiveOrAssign:
+    case EOpExclusiveOrAssign:
 
     case EOpAtan:
     case EOpClamp:
@@ -1010,37 +963,24 @@ TIntermTyped* TIntermediate::addConversion(TOperator op, const TType& type, TInt
         if (type.getBasicType() == node->getType().getBasicType())
             return node;
 
-        if (canImplicitlyPromote(node->getType().getBasicType(), type.getBasicType(), op))
+        if (canImplicitlyPromote(node->getBasicType(), type.getBasicType(), op))
             promoteTo = type.getBasicType();
         else
            return nullptr;
         break;
 
-    // Shifts can have mixed types as long as they are integer and of the same rank,
-    // without converting.
-    // It's the left operand's type that determines the resulting type, so no issue
-    // with assign shift ops either.
-    case EOpLeftShift:
-    case EOpRightShift:
+    // For GLSL, there are no conversions needed; the shift amount just needs to be an
+    // integer type, as do the base/result.
+    // HLSL can convert the shift from a bool to an int.
     case EOpLeftShiftAssign:
     case EOpRightShiftAssign:
     {
-        TBasicType type0 = type.getBasicType();
-        TBasicType type1 = node->getType().getBasicType();
-
-        if (source == EShSourceHlsl && node->getType().getBasicType() == EbtBool) {
-            promoteTo = type0;            
-        } else {
-            if (isTypeInt(type0) && isTypeInt(type1)) {
-                if (getTypeRank(type0) == getTypeRank(type1)) {
-                    return node;
-                } else {
-                    if (canImplicitlyPromote(type1, type0, op))
-                        promoteTo = type0;
-                    else
-                        return nullptr;
-                }
-            } else
+        if (source == EShSourceHlsl && node->getType().getBasicType() == EbtBool)
+            promoteTo = type.getBasicType();
+        else {
+            if (isTypeInt(type.getBasicType()) && isTypeInt(node->getBasicType()))
+                return node;
+            else
                 return nullptr;
         }
         break;
@@ -1485,9 +1425,7 @@ bool TIntermediate::canImplicitlyPromote(TBasicType from, TBasicType to, TOperat
                                 extensionRequested(E_GL_KHX_shader_explicit_arithmetic_types_float32) ||
                                 extensionRequested(E_GL_KHX_shader_explicit_arithmetic_types_float64);
 
-    if(explicitTypesEnabled)
-    {
-
+    if(explicitTypesEnabled) {
         // integral promotions
         if (isIntegralPromotion(from, to)) {
             return true;
@@ -2952,7 +2890,7 @@ bool TIntermediate::promoteUnary(TIntermUnary& node)
         // Convert operand to a boolean type
         if (operand->getBasicType() != EbtBool) {
             // Add constructor to boolean type. If that fails, we can't do it, so return false.
-            TIntermTyped* converted = convertToBasicType(op, EbtBool, operand);
+            TIntermTyped* converted = addConversion(op, TType(EbtBool), operand);
             if (converted == nullptr)
                 return false;
 
@@ -2997,24 +2935,6 @@ void TIntermUnary::updatePrecision()
     }
 }
 
-// If it is not already, convert this node to the given basic type.
-TIntermTyped* TIntermediate::convertToBasicType(TOperator op, TBasicType basicType, TIntermTyped* node) const
-{
-    if (node == nullptr)
-        return nullptr;
-
-    // It's already this basic type: nothing needs to be done, so use the node directly.
-    if (node->getBasicType() == basicType)
-        return node;
-
-    const TType& type = node->getType();
-    const TType newType(basicType, type.getQualifier().storage,
-                        type.getVectorSize(), type.getMatrixCols(), type.getMatrixRows(), type.isVector());
-
-    // Add constructor to the right vectorness of the right type. If that fails, we can't do it, so return nullptr.
-    return addConversion(op, newType, node);
-}
-
 //
 // See TIntermediate::promote
 //
@@ -3087,8 +3007,10 @@ bool TIntermediate::promoteBinary(TIntermBinary& node)
         case EOpSub:
         case EOpDiv:
         case EOpMul:
-            left = addConversion(op, TType(EbtInt, EvqTemporary, left->getVectorSize()), left);
-            right = addConversion(op, TType(EbtInt, EvqTemporary, right->getVectorSize()), right);
+            if (left->getBasicType() == EbtBool)
+                left  = createConversion(EbtInt, left);
+            if (right->getBasicType() == EbtBool)
+                right = createConversion(EbtInt, right);
             if (left == nullptr || right == nullptr)
                 return false;
             node.setLeft(left);
@@ -3139,21 +3061,17 @@ bool TIntermediate::promoteBinary(TIntermBinary& node)
     case EOpLogicalAnd:
     case EOpLogicalOr:
     case EOpLogicalXor:
-        if (getSource() == EShSourceHlsl) {
-            TIntermTyped* convertedL = convertToBasicType(op, EbtBool, left);
-            TIntermTyped* convertedR = convertToBasicType(op, EbtBool, right);
-            if (convertedL == nullptr || convertedR == nullptr)
+        // logical ops operate only on Booleans or vectors of Booleans.
+        if (left->getBasicType() != EbtBool || left->isMatrix())
                 return false;
-            node.setLeft(left = convertedL);   // also updates stack variable
-            node.setRight(right = convertedR); // also updates stack variable
-        } else {
+
+        if (getSource() == EShSourceGlsl) {
             // logical ops operate only on scalar Booleans and will promote to scalar Boolean.
-            if (left->getBasicType() != EbtBool || left->isVector() || left->isMatrix())
+            if (left->isVector())
                 return false;
         }
 
         node.setType(TType(EbtBool, EvqTemporary, left->getVectorSize()));
-
         break;
 
     case EOpRightShift:
diff --git a/glslang/MachineIndependent/ParseContextBase.cpp b/glslang/MachineIndependent/ParseContextBase.cpp
index bbc3cac085f7233f8f7e9c6704a7e9ca62a6fb3b..525ed4e737cdcfd00922d4b71095d40b45f05950 100644
--- a/glslang/MachineIndependent/ParseContextBase.cpp
+++ b/glslang/MachineIndependent/ParseContextBase.cpp
@@ -228,6 +228,7 @@ void TParseContextBase::rValueErrorCheck(const TSourceLoc& loc, const char* op,
 // must still be valid.
 // It is okay if the symbol's type will be subsequently edited;
 // the modifications will be tracked.
+// Order is preserved, to avoid creating novel forward references.
 void TParseContextBase::trackLinkage(TSymbol& symbol)
 {
     if (!parsingBuiltins)
@@ -602,7 +603,7 @@ void TParseContextBase::finish()
     if (parsingBuiltins)
         return;
 
-    // Transfer the linkage symbols to AST nodes
+    // Transfer the linkage symbols to AST nodes, preserving order.
     TIntermAggregate* linkage = new TIntermAggregate;
     for (auto i = linkageSymbols.begin(); i != linkageSymbols.end(); ++i)
         intermediate.addSymbolLinkageNode(linkage, **i);
diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp
index f189558cb46352c4d0eaf73b395188cff7becc99..5ced1b0bffa80645bfe72ccb13f3b9a65794f60d 100644
--- a/glslang/MachineIndependent/ParseHelper.cpp
+++ b/glslang/MachineIndependent/ParseHelper.cpp
@@ -2778,8 +2778,8 @@ void TParseContext::globalQualifierTypeCheck(const TSourceLoc& loc, const TQuali
                 error(loc, "can't use auxiliary qualifier on a fragment output", "centroid/sample/patch", "");
             if (qualifier.isInterpolation())
                 error(loc, "can't use interpolation qualifier on a fragment output", "flat/smooth/noperspective", "");
-            if (publicType.basicType == EbtDouble)
-                error(loc, "cannot contain a double", GetStorageQualifierString(qualifier.storage), "");
+            if (publicType.basicType == EbtDouble || publicType.basicType == EbtInt64 || publicType.basicType == EbtUint64)
+                error(loc, "cannot contain a double, int64, or uint64", GetStorageQualifierString(qualifier.storage), "");
         break;
 
         case EShLangCompute:
diff --git a/glslang/MachineIndependent/ParseHelper.h b/glslang/MachineIndependent/ParseHelper.h
index c70afc24e9db46069c09cb34d2c5ed4e960f739d..4a0f03f587288a37d1c0b1b88a81fc002d39a0f4 100644
--- a/glslang/MachineIndependent/ParseHelper.h
+++ b/glslang/MachineIndependent/ParseHelper.h
@@ -187,7 +187,7 @@ protected:
     TParseContextBase& operator=(TParseContextBase&);
 
     const bool parsingBuiltins;       // true if parsing built-in symbols/functions
-    TVector<TSymbol*> linkageSymbols; // these need to be transferred to 'linkage', after all editing is done
+    TVector<TSymbol*> linkageSymbols; // will be transferred to 'linkage', after all editing is done, order preserving
     TScanContext* scanContext;
     TPpContext* ppContext;
     TBuiltInResource resources;
diff --git a/glslang/MachineIndependent/Scan.cpp b/glslang/MachineIndependent/Scan.cpp
index 92824efadb644c48a47a188969d88db5eb37f78f..feb9bed9fe17a4e0d7a9d30d2cbba9bfbfbe9634 100644
--- a/glslang/MachineIndependent/Scan.cpp
+++ b/glslang/MachineIndependent/Scan.cpp
@@ -962,7 +962,7 @@ int TScanContext::tokenizeIdentifier()
     case PATCH:
         if (parseContext.symbolTable.atBuiltInLevel() ||
             (parseContext.profile == EEsProfile &&
-             (parseContext.version >= 320 || 
+             (parseContext.version >= 320 ||
               parseContext.extensionsTurnedOn(Num_AEP_tessellation_shader, AEP_tessellation_shader))) ||
             (parseContext.profile != EEsProfile && parseContext.extensionTurnedOn(E_GL_ARB_tessellation_shader)))
             return keyword;
@@ -1450,6 +1450,11 @@ int TScanContext::tokenizeIdentifier()
 #endif
 
     case NOPERSPECTIVE:
+#ifdef NV_EXTENSIONS
+        if (parseContext.profile == EEsProfile && parseContext.version >= 300 &&
+            parseContext.extensionTurnedOn(E_GL_NV_shader_noperspective_interpolation))
+            return keyword;
+#endif
         return es30ReservedFromGLSL(130);
 
     case SMOOTH:
diff --git a/glslang/MachineIndependent/ShaderLang.cpp b/glslang/MachineIndependent/ShaderLang.cpp
index 446075230c33806fb1ca19a51ab6ada1fa3559bf..4cab258b1170d4654b1f463c666a4f55de358e2f 100644
--- a/glslang/MachineIndependent/ShaderLang.cpp
+++ b/glslang/MachineIndependent/ShaderLang.cpp
@@ -768,6 +768,8 @@ bool ProcessDeferred(
     SpvVersion spvVersion;
     EShLanguage stage = compiler->getLanguage();
     TranslateEnvironment(environment, messages, source, stage, spvVersion);
+    if (environment != nullptr && environment->target.hlslFunctionality1)
+        intermediate.setHlslFunctionality1();
 
     // First, without using the preprocessor or parser, find the #version, so we know what
     // symbol tables, processing rules, etc. to set up.  This does not need the extra strings
@@ -1629,6 +1631,7 @@ TShader::TShader(EShLanguage s)
     environment.input.dialect = EShClientNone;
     environment.client.client = EShClientNone;
     environment.target.language = EShTargetNone;
+    environment.target.hlslFunctionality1 = false;
 }
 
 TShader::~TShader()
diff --git a/glslang/MachineIndependent/Versions.cpp b/glslang/MachineIndependent/Versions.cpp
index 1f44cc3efea66733e02b5189b634649f6ae14277..a9e81a74540c39937a60e1f4057992c7371a66a3 100644
--- a/glslang/MachineIndependent/Versions.cpp
+++ b/glslang/MachineIndependent/Versions.cpp
@@ -225,6 +225,7 @@ void TParseVersions::initializeExtensionBehavior()
     extensionBehavior[E_GL_NVX_multiview_per_view_attributes]        = EBhDisable;
     extensionBehavior[E_GL_NV_shader_atomic_int64]                   = EBhDisable;
     extensionBehavior[E_GL_NV_conservative_raster_underestimation]   = EBhDisable;
+    extensionBehavior[E_GL_NV_shader_noperspective_interpolation]    = EBhDisable;
 #endif
 
     // AEP
@@ -319,6 +320,13 @@ void TParseVersions::getPreamble(std::string& preamble)
             "#define GL_OES_texture_cube_map_array 1\n"
             "#define GL_EXT_shader_non_constant_global_initializers 1\n"
             ;
+
+#ifdef NV_EXTENSIONS
+            if (profile == EEsProfile && version >= 300) {
+                preamble += "#define GL_NV_shader_noperspective_interpolation 1\n";
+            }
+#endif
+
     } else {
         preamble =
             "#define GL_FRAGMENT_PRECISION_HIGH 1\n"
diff --git a/glslang/MachineIndependent/Versions.h b/glslang/MachineIndependent/Versions.h
index c9f4e3e416334f980ed24c36413244ad264178ae..9a7d9ca2e99f27203392d7fb91fec3c289ab48cf 100644
--- a/glslang/MachineIndependent/Versions.h
+++ b/glslang/MachineIndependent/Versions.h
@@ -196,6 +196,7 @@ const char* const E_GL_NV_stereo_view_rendering                 = "GL_NV_stereo_
 const char* const E_GL_NVX_multiview_per_view_attributes        = "GL_NVX_multiview_per_view_attributes";
 const char* const E_GL_NV_shader_atomic_int64                   = "GL_NV_shader_atomic_int64";
 const char* const E_GL_NV_conservative_raster_underestimation   = "GL_NV_conservative_raster_underestimation";
+const char* const E_GL_NV_shader_noperspective_interpolation    = "GL_NV_shader_noperspective_interpolation";
 
 // Arrays of extensions for the above viewportEXTs duplications
 
diff --git a/glslang/MachineIndependent/attribute.cpp b/glslang/MachineIndependent/attribute.cpp
index acc17e9f28d05b9a64196d8530ef888b7bcb69a0..73b665d80820f1c80affa2212f83cf0a3880e0ec 100644
--- a/glslang/MachineIndependent/attribute.cpp
+++ b/glslang/MachineIndependent/attribute.cpp
@@ -82,7 +82,7 @@ const TConstUnion* TAttributeArgs::getConstUnion(TBasicType basicType, int argNu
     if (args == nullptr)
         return nullptr;
 
-    if (argNum >= args->getSequence().size())
+    if (argNum >= (int)args->getSequence().size())
         return nullptr;
 
     const TConstUnion* constVal = &args->getSequence()[argNum]->getAsConstantUnion()->getConstArray()[0];
diff --git a/glslang/MachineIndependent/glslang.y b/glslang/MachineIndependent/glslang.y
index 909871e220dfb069ace2c0f9bf314e03e43b634e..0e21398967b9da5764616b2f6ba63d05e874432b 100644
--- a/glslang/MachineIndependent/glslang.y
+++ b/glslang/MachineIndependent/glslang.y
@@ -1117,7 +1117,11 @@ interpolation_qualifier
     }
     | NOPERSPECTIVE {
         parseContext.globalCheck($1.loc, "noperspective");
+#ifdef NV_EXTENSIONS
+        parseContext.profileRequires($1.loc, EEsProfile, 0, E_GL_NV_shader_noperspective_interpolation, "noperspective");
+#else
         parseContext.requireProfile($1.loc, ~EEsProfile, "noperspective");
+#endif
         parseContext.profileRequires($1.loc, ENoProfile, 130, 0, "noperspective");
         $$.init($1.loc);
         $$.qualifier.nopersp = true;
diff --git a/glslang/MachineIndependent/glslang_tab.cpp b/glslang/MachineIndependent/glslang_tab.cpp
index db5b28e10ae0f8760e0142c39721c791b2e3e8a6..2d844c19ede9a6bb0e755621af48a53d2d94b5a3 100644
--- a/glslang/MachineIndependent/glslang_tab.cpp
+++ b/glslang/MachineIndependent/glslang_tab.cpp
@@ -1,8 +1,8 @@
-/* A Bison parser, made by GNU Bison 3.0.  */
+/* A Bison parser, made by GNU Bison 3.0.4.  */
 
 /* Bison implementation for Yacc-like parsers in C
 
-   Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc.
+   Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -44,7 +44,7 @@
 #define YYBISON 1
 
 /* Bison version.  */
-#define YYBISON_VERSION "3.0"
+#define YYBISON_VERSION "3.0.4"
 
 /* Skeleton name.  */
 #define YYSKELETON_NAME "yacc.c"
@@ -90,11 +90,11 @@ using namespace glslang;
 
 #line 92 "MachineIndependent/glslang_tab.cpp" /* yacc.c:339  */
 
-# ifndef YY_NULL
+# ifndef YY_NULLPTR
 #  if defined __cplusplus && 201103L <= __cplusplus
-#   define YY_NULL nullptr
+#   define YY_NULLPTR nullptr
 #  else
-#   define YY_NULL 0
+#   define YY_NULLPTR 0
 #  endif
 # endif
 
@@ -515,7 +515,7 @@ extern int yydebug;
 
 /* Value type.  */
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-typedef union YYSTYPE YYSTYPE;
+
 union YYSTYPE
 {
 #line 70 "MachineIndependent/glslang.y" /* yacc.c:355  */
@@ -555,6 +555,8 @@ union YYSTYPE
 
 #line 557 "MachineIndependent/glslang_tab.cpp" /* yacc.c:355  */
 };
+
+typedef union YYSTYPE YYSTYPE;
 # define YYSTYPE_IS_TRIVIAL 1
 # define YYSTYPE_IS_DECLARED 1
 #endif
@@ -582,7 +584,7 @@ int yyparse (glslang::TParseContext* pParseContext);
 extern int yylex(YYSTYPE*, TParseContext&);
 
 
-#line 586 "MachineIndependent/glslang_tab.cpp" /* yacc.c:358  */
+#line 588 "MachineIndependent/glslang_tab.cpp" /* yacc.c:358  */
 
 #ifdef short
 # undef short
@@ -639,11 +641,30 @@ typedef short int yytype_int16;
 # endif
 #endif
 
-#ifndef __attribute__
-/* This feature is available in gcc versions 2.5 and later.  */
-# if (! defined __GNUC__ || __GNUC__ < 2 \
-      || (__GNUC__ == 2 && __GNUC_MINOR__ < 5))
-#  define __attribute__(Spec) /* empty */
+#ifndef YY_ATTRIBUTE
+# if (defined __GNUC__                                               \
+      && (2 < __GNUC__ || (__GNUC__ == 2 && 96 <= __GNUC_MINOR__)))  \
+     || defined __SUNPRO_C && 0x5110 <= __SUNPRO_C
+#  define YY_ATTRIBUTE(Spec) __attribute__(Spec)
+# else
+#  define YY_ATTRIBUTE(Spec) /* empty */
+# endif
+#endif
+
+#ifndef YY_ATTRIBUTE_PURE
+# define YY_ATTRIBUTE_PURE   YY_ATTRIBUTE ((__pure__))
+#endif
+
+#ifndef YY_ATTRIBUTE_UNUSED
+# define YY_ATTRIBUTE_UNUSED YY_ATTRIBUTE ((__unused__))
+#endif
+
+#if !defined _Noreturn \
+     && (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112)
+# if defined _MSC_VER && 1200 <= _MSC_VER
+#  define _Noreturn __declspec (noreturn)
+# else
+#  define _Noreturn YY_ATTRIBUTE ((__noreturn__))
 # endif
 #endif
 
@@ -912,49 +933,49 @@ static const yytype_uint16 yyrline[] =
      817,   826,   826,   837,   841,   848,   855,   858,   865,   873,
      893,   916,   931,   954,   965,   975,   985,   995,  1004,  1007,
     1011,  1015,  1020,  1028,  1033,  1038,  1043,  1048,  1057,  1068,
-    1095,  1104,  1111,  1118,  1125,  1137,  1143,  1146,  1153,  1157,
-    1161,  1169,  1178,  1181,  1192,  1195,  1198,  1202,  1206,  1210,
-    1217,  1221,  1233,  1247,  1252,  1258,  1264,  1271,  1277,  1282,
-    1287,  1292,  1300,  1304,  1308,  1312,  1316,  1320,  1326,  1335,
-    1338,  1346,  1350,  1359,  1364,  1372,  1376,  1386,  1390,  1394,
-    1399,  1404,  1409,  1414,  1418,  1423,  1428,  1433,  1438,  1443,
-    1448,  1453,  1458,  1463,  1467,  1472,  1477,  1482,  1488,  1494,
-    1500,  1506,  1512,  1518,  1524,  1530,  1536,  1542,  1548,  1554,
-    1559,  1564,  1569,  1574,  1579,  1584,  1590,  1596,  1602,  1608,
-    1614,  1620,  1626,  1632,  1638,  1644,  1650,  1656,  1662,  1668,
-    1674,  1680,  1686,  1692,  1698,  1704,  1710,  1716,  1722,  1728,
-    1734,  1740,  1746,  1751,  1756,  1761,  1766,  1771,  1776,  1781,
-    1786,  1791,  1796,  1801,  1806,  1812,  1818,  1824,  1830,  1836,
-    1842,  1848,  1854,  1860,  1866,  1872,  1878,  1884,  1890,  1896,
-    1902,  1908,  1914,  1920,  1926,  1932,  1938,  1944,  1950,  1956,
-    1962,  1968,  1974,  1980,  1986,  1992,  1998,  2004,  2010,  2016,
-    2022,  2028,  2034,  2040,  2046,  2052,  2058,  2064,  2070,  2076,
-    2082,  2088,  2094,  2099,  2104,  2109,  2114,  2119,  2124,  2129,
-    2134,  2139,  2144,  2149,  2154,  2159,  2164,  2172,  2180,  2188,
-    2196,  2204,  2212,  2220,  2228,  2236,  2244,  2252,  2260,  2268,
-    2273,  2278,  2283,  2288,  2293,  2298,  2303,  2308,  2313,  2318,
-    2323,  2328,  2333,  2338,  2343,  2348,  2356,  2364,  2369,  2374,
-    2379,  2387,  2392,  2397,  2402,  2410,  2415,  2420,  2425,  2433,
-    2438,  2443,  2448,  2453,  2458,  2466,  2471,  2479,  2484,  2492,
-    2497,  2505,  2510,  2518,  2523,  2531,  2536,  2544,  2549,  2554,
-    2559,  2564,  2569,  2574,  2579,  2584,  2589,  2594,  2599,  2604,
-    2609,  2614,  2619,  2627,  2632,  2637,  2642,  2650,  2655,  2660,
-    2665,  2673,  2678,  2683,  2688,  2696,  2701,  2706,  2711,  2719,
-    2724,  2729,  2734,  2742,  2747,  2752,  2757,  2765,  2770,  2775,
-    2780,  2788,  2793,  2798,  2803,  2811,  2816,  2821,  2826,  2834,
-    2839,  2844,  2849,  2857,  2862,  2867,  2872,  2880,  2885,  2890,
-    2895,  2903,  2908,  2913,  2918,  2926,  2931,  2936,  2941,  2949,
-    2954,  2959,  2965,  2971,  2977,  2986,  2995,  3001,  3007,  3013,
-    3019,  3024,  3040,  3045,  3050,  3058,  3058,  3069,  3069,  3079,
-    3082,  3095,  3113,  3137,  3141,  3147,  3152,  3163,  3166,  3172,
-    3181,  3184,  3190,  3194,  3195,  3201,  3202,  3203,  3204,  3205,
-    3206,  3207,  3211,  3212,  3216,  3212,  3228,  3229,  3233,  3233,
-    3240,  3240,  3254,  3257,  3265,  3273,  3284,  3285,  3289,  3292,
-    3298,  3305,  3309,  3317,  3321,  3334,  3337,  3343,  3343,  3363,
-    3366,  3372,  3384,  3396,  3399,  3405,  3405,  3420,  3420,  3436,
-    3436,  3457,  3460,  3466,  3469,  3475,  3479,  3486,  3491,  3496,
-    3503,  3506,  3515,  3519,  3528,  3531,  3534,  3542,  3542,  3564,
-    3570,  3573,  3578,  3581
+    1095,  1104,  1111,  1118,  1129,  1141,  1147,  1150,  1157,  1161,
+    1165,  1173,  1182,  1185,  1196,  1199,  1202,  1206,  1210,  1214,
+    1221,  1225,  1237,  1251,  1256,  1262,  1268,  1275,  1281,  1286,
+    1291,  1296,  1304,  1308,  1312,  1316,  1320,  1324,  1330,  1339,
+    1342,  1350,  1354,  1363,  1368,  1376,  1380,  1390,  1394,  1398,
+    1403,  1408,  1413,  1418,  1422,  1427,  1432,  1437,  1442,  1447,
+    1452,  1457,  1462,  1467,  1471,  1476,  1481,  1486,  1492,  1498,
+    1504,  1510,  1516,  1522,  1528,  1534,  1540,  1546,  1552,  1558,
+    1563,  1568,  1573,  1578,  1583,  1588,  1594,  1600,  1606,  1612,
+    1618,  1624,  1630,  1636,  1642,  1648,  1654,  1660,  1666,  1672,
+    1678,  1684,  1690,  1696,  1702,  1708,  1714,  1720,  1726,  1732,
+    1738,  1744,  1750,  1755,  1760,  1765,  1770,  1775,  1780,  1785,
+    1790,  1795,  1800,  1805,  1810,  1816,  1822,  1828,  1834,  1840,
+    1846,  1852,  1858,  1864,  1870,  1876,  1882,  1888,  1894,  1900,
+    1906,  1912,  1918,  1924,  1930,  1936,  1942,  1948,  1954,  1960,
+    1966,  1972,  1978,  1984,  1990,  1996,  2002,  2008,  2014,  2020,
+    2026,  2032,  2038,  2044,  2050,  2056,  2062,  2068,  2074,  2080,
+    2086,  2092,  2098,  2103,  2108,  2113,  2118,  2123,  2128,  2133,
+    2138,  2143,  2148,  2153,  2158,  2163,  2168,  2176,  2184,  2192,
+    2200,  2208,  2216,  2224,  2232,  2240,  2248,  2256,  2264,  2272,
+    2277,  2282,  2287,  2292,  2297,  2302,  2307,  2312,  2317,  2322,
+    2327,  2332,  2337,  2342,  2347,  2352,  2360,  2368,  2373,  2378,
+    2383,  2391,  2396,  2401,  2406,  2414,  2419,  2424,  2429,  2437,
+    2442,  2447,  2452,  2457,  2462,  2470,  2475,  2483,  2488,  2496,
+    2501,  2509,  2514,  2522,  2527,  2535,  2540,  2548,  2553,  2558,
+    2563,  2568,  2573,  2578,  2583,  2588,  2593,  2598,  2603,  2608,
+    2613,  2618,  2623,  2631,  2636,  2641,  2646,  2654,  2659,  2664,
+    2669,  2677,  2682,  2687,  2692,  2700,  2705,  2710,  2715,  2723,
+    2728,  2733,  2738,  2746,  2751,  2756,  2761,  2769,  2774,  2779,
+    2784,  2792,  2797,  2802,  2807,  2815,  2820,  2825,  2830,  2838,
+    2843,  2848,  2853,  2861,  2866,  2871,  2876,  2884,  2889,  2894,
+    2899,  2907,  2912,  2917,  2922,  2930,  2935,  2940,  2945,  2953,
+    2958,  2963,  2969,  2975,  2981,  2990,  2999,  3005,  3011,  3017,
+    3023,  3028,  3044,  3049,  3054,  3062,  3062,  3073,  3073,  3083,
+    3086,  3099,  3117,  3141,  3145,  3151,  3156,  3167,  3170,  3176,
+    3185,  3188,  3194,  3198,  3199,  3205,  3206,  3207,  3208,  3209,
+    3210,  3211,  3215,  3216,  3220,  3216,  3232,  3233,  3237,  3237,
+    3244,  3244,  3258,  3261,  3269,  3277,  3288,  3289,  3293,  3296,
+    3302,  3309,  3313,  3321,  3325,  3338,  3341,  3347,  3347,  3367,
+    3370,  3376,  3388,  3400,  3403,  3409,  3409,  3424,  3424,  3440,
+    3440,  3461,  3464,  3470,  3473,  3479,  3483,  3490,  3495,  3500,
+    3507,  3510,  3519,  3523,  3532,  3535,  3538,  3546,  3546,  3568,
+    3574,  3577,  3582,  3585
 };
 #endif
 
@@ -1080,7 +1101,7 @@ static const char *const yytname[] =
   "for_init_statement", "conditionopt", "for_rest_statement",
   "jump_statement", "translation_unit", "external_declaration",
   "function_definition", "$@13", "attribute", "attribute_list",
-  "single_attribute", YY_NULL
+  "single_attribute", YY_NULLPTR
 };
 #endif
 
@@ -3581,11 +3602,11 @@ static int
 yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
                 yytype_int16 *yyssp, int yytoken)
 {
-  YYSIZE_T yysize0 = yytnamerr (YY_NULL, yytname[yytoken]);
+  YYSIZE_T yysize0 = yytnamerr (YY_NULLPTR, yytname[yytoken]);
   YYSIZE_T yysize = yysize0;
   enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
   /* Internationalized format string. */
-  const char *yyformat = YY_NULL;
+  const char *yyformat = YY_NULLPTR;
   /* Arguments of yyformat. */
   char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
   /* Number of reported tokens (one for the "unexpected", one per
@@ -3642,7 +3663,7 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
                   }
                 yyarg[yycount++] = yytname[yyx];
                 {
-                  YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULL, yytname[yyx]);
+                  YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULLPTR, yytname[yyx]);
                   if (! (yysize <= yysize1
                          && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
                     return 2;
@@ -3983,7 +4004,7 @@ yyreduce:
     {
         (yyval.interm.intermTypedNode) = parseContext.handleVariable((yyvsp[0].lex).loc, (yyvsp[0].lex).symbol, (yyvsp[0].lex).string);
     }
-#line 3987 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4008 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 3:
@@ -3991,7 +4012,7 @@ yyreduce:
     {
         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
     }
-#line 3995 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4016 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 4:
@@ -4000,7 +4021,7 @@ yyreduce:
         parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit signed literal");
         (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).i, (yyvsp[0].lex).loc, true);
     }
-#line 4004 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4025 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 5:
@@ -4009,7 +4030,7 @@ yyreduce:
         parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit signed literal");
         (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).u, (yyvsp[0].lex).loc, true);
     }
-#line 4013 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4034 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 6:
@@ -4017,7 +4038,7 @@ yyreduce:
     {
         (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).i, (yyvsp[0].lex).loc, true);
     }
-#line 4021 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4042 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 7:
@@ -4026,7 +4047,7 @@ yyreduce:
         parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "unsigned literal");
         (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).u, (yyvsp[0].lex).loc, true);
     }
-#line 4030 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4051 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 8:
@@ -4035,7 +4056,7 @@ yyreduce:
         parseContext.int64Check((yyvsp[0].lex).loc, "64-bit integer literal");
         (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).i64, (yyvsp[0].lex).loc, true);
     }
-#line 4039 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4060 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 9:
@@ -4044,7 +4065,7 @@ yyreduce:
         parseContext.int64Check((yyvsp[0].lex).loc, "64-bit unsigned integer literal");
         (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).u64, (yyvsp[0].lex).loc, true);
     }
-#line 4048 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4069 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 10:
@@ -4053,7 +4074,7 @@ yyreduce:
         parseContext.explicitInt16Check((yyvsp[0].lex).loc, "16-bit integer literal");
         (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((short)(yyvsp[0].lex).i, (yyvsp[0].lex).loc, true);
     }
-#line 4057 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4078 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 11:
@@ -4062,7 +4083,7 @@ yyreduce:
         parseContext.explicitInt16Check((yyvsp[0].lex).loc, "16-bit unsigned integer literal");
         (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((unsigned short)(yyvsp[0].lex).u, (yyvsp[0].lex).loc, true);
     }
-#line 4066 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4087 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 12:
@@ -4070,7 +4091,7 @@ yyreduce:
     {
         (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).d, EbtFloat, (yyvsp[0].lex).loc, true);
     }
-#line 4074 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4095 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 13:
@@ -4079,7 +4100,7 @@ yyreduce:
         parseContext.doubleCheck((yyvsp[0].lex).loc, "double literal");
         (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).d, EbtDouble, (yyvsp[0].lex).loc, true);
     }
-#line 4083 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4104 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 14:
@@ -4088,7 +4109,7 @@ yyreduce:
         parseContext.float16Check((yyvsp[0].lex).loc, "half float literal");
         (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).d, EbtFloat16, (yyvsp[0].lex).loc, true);
     }
-#line 4092 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4113 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 15:
@@ -4096,7 +4117,7 @@ yyreduce:
     {
         (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion((yyvsp[0].lex).b, (yyvsp[0].lex).loc, true);
     }
-#line 4100 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4121 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 16:
@@ -4106,7 +4127,7 @@ yyreduce:
         if ((yyval.interm.intermTypedNode)->getAsConstantUnion())
             (yyval.interm.intermTypedNode)->getAsConstantUnion()->setExpression();
     }
-#line 4110 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4131 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 17:
@@ -4114,7 +4135,7 @@ yyreduce:
     {
         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
     }
-#line 4118 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4139 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 18:
@@ -4122,7 +4143,7 @@ yyreduce:
     {
         (yyval.interm.intermTypedNode) = parseContext.handleBracketDereference((yyvsp[-2].lex).loc, (yyvsp[-3].interm.intermTypedNode), (yyvsp[-1].interm.intermTypedNode));
     }
-#line 4126 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4147 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 19:
@@ -4130,7 +4151,7 @@ yyreduce:
     {
         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
     }
-#line 4134 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4155 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 20:
@@ -4138,7 +4159,7 @@ yyreduce:
     {
         (yyval.interm.intermTypedNode) = parseContext.handleDotDereference((yyvsp[0].lex).loc, (yyvsp[-2].interm.intermTypedNode), *(yyvsp[0].lex).string);
     }
-#line 4142 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4163 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 21:
@@ -4148,7 +4169,7 @@ yyreduce:
         parseContext.lValueErrorCheck((yyvsp[0].lex).loc, "++", (yyvsp[-1].interm.intermTypedNode));
         (yyval.interm.intermTypedNode) = parseContext.handleUnaryMath((yyvsp[0].lex).loc, "++", EOpPostIncrement, (yyvsp[-1].interm.intermTypedNode));
     }
-#line 4152 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4173 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 22:
@@ -4158,7 +4179,7 @@ yyreduce:
         parseContext.lValueErrorCheck((yyvsp[0].lex).loc, "--", (yyvsp[-1].interm.intermTypedNode));
         (yyval.interm.intermTypedNode) = parseContext.handleUnaryMath((yyvsp[0].lex).loc, "--", EOpPostDecrement, (yyvsp[-1].interm.intermTypedNode));
     }
-#line 4162 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4183 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 23:
@@ -4167,7 +4188,7 @@ yyreduce:
         parseContext.integerCheck((yyvsp[0].interm.intermTypedNode), "[]");
         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
     }
-#line 4171 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4192 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 24:
@@ -4176,7 +4197,7 @@ yyreduce:
         (yyval.interm.intermTypedNode) = parseContext.handleFunctionCall((yyvsp[0].interm).loc, (yyvsp[0].interm).function, (yyvsp[0].interm).intermNode);
         delete (yyvsp[0].interm).function;
     }
-#line 4180 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4201 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 25:
@@ -4184,7 +4205,7 @@ yyreduce:
     {
         (yyval.interm) = (yyvsp[0].interm);
     }
-#line 4188 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4209 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 26:
@@ -4193,7 +4214,7 @@ yyreduce:
         (yyval.interm) = (yyvsp[-1].interm);
         (yyval.interm).loc = (yyvsp[0].lex).loc;
     }
-#line 4197 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4218 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 27:
@@ -4202,7 +4223,7 @@ yyreduce:
         (yyval.interm) = (yyvsp[-1].interm);
         (yyval.interm).loc = (yyvsp[0].lex).loc;
     }
-#line 4206 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4227 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 28:
@@ -4210,7 +4231,7 @@ yyreduce:
     {
         (yyval.interm) = (yyvsp[-1].interm);
     }
-#line 4214 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4235 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 29:
@@ -4218,7 +4239,7 @@ yyreduce:
     {
         (yyval.interm) = (yyvsp[0].interm);
     }
-#line 4222 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4243 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 30:
@@ -4230,7 +4251,7 @@ yyreduce:
         (yyval.interm).function = (yyvsp[-1].interm).function;
         (yyval.interm).intermNode = (yyvsp[0].interm.intermTypedNode);
     }
-#line 4234 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4255 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 31:
@@ -4242,7 +4263,7 @@ yyreduce:
         (yyval.interm).function = (yyvsp[-2].interm).function;
         (yyval.interm).intermNode = parseContext.intermediate.growAggregate((yyvsp[-2].interm).intermNode, (yyvsp[0].interm.intermTypedNode), (yyvsp[-1].lex).loc);
     }
-#line 4246 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4267 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 32:
@@ -4250,7 +4271,7 @@ yyreduce:
     {
         (yyval.interm) = (yyvsp[-1].interm);
     }
-#line 4254 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4275 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 33:
@@ -4260,7 +4281,7 @@ yyreduce:
         (yyval.interm).intermNode = 0;
         (yyval.interm).function = parseContext.handleConstructorCall((yyvsp[0].interm.type).loc, (yyvsp[0].interm.type));
     }
-#line 4264 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4285 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 34:
@@ -4292,7 +4313,7 @@ yyreduce:
             (yyval.interm).function = new TFunction(&empty, TType(EbtVoid), EOpNull);
         }
     }
-#line 4296 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4317 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 35:
@@ -4303,7 +4324,7 @@ yyreduce:
         if (TIntermMethod* method = (yyvsp[0].interm.intermTypedNode)->getAsMethodNode())
             parseContext.error((yyvsp[0].interm.intermTypedNode)->getLoc(), "incomplete method syntax", method->getMethodName().c_str(), "");
     }
-#line 4307 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4328 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 36:
@@ -4312,7 +4333,7 @@ yyreduce:
         parseContext.lValueErrorCheck((yyvsp[-1].lex).loc, "++", (yyvsp[0].interm.intermTypedNode));
         (yyval.interm.intermTypedNode) = parseContext.handleUnaryMath((yyvsp[-1].lex).loc, "++", EOpPreIncrement, (yyvsp[0].interm.intermTypedNode));
     }
-#line 4316 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4337 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 37:
@@ -4321,7 +4342,7 @@ yyreduce:
         parseContext.lValueErrorCheck((yyvsp[-1].lex).loc, "--", (yyvsp[0].interm.intermTypedNode));
         (yyval.interm.intermTypedNode) = parseContext.handleUnaryMath((yyvsp[-1].lex).loc, "--", EOpPreDecrement, (yyvsp[0].interm.intermTypedNode));
     }
-#line 4325 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4346 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 38:
@@ -4342,38 +4363,38 @@ yyreduce:
                 (yyval.interm.intermTypedNode)->getAsConstantUnion()->setExpression();
         }
     }
-#line 4346 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4367 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 39:
 #line 513 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpNull; }
-#line 4352 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4373 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 40:
 #line 514 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpNegative; }
-#line 4358 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4379 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 41:
 #line 515 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpLogicalNot; }
-#line 4364 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4385 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 42:
 #line 516 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpBitwiseNot;
               parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "bitwise not"); }
-#line 4371 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4392 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 43:
 #line 522 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 4377 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4398 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 44:
@@ -4383,7 +4404,7 @@ yyreduce:
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
     }
-#line 4387 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4408 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 45:
@@ -4393,7 +4414,7 @@ yyreduce:
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
     }
-#line 4397 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4418 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 46:
@@ -4404,13 +4425,13 @@ yyreduce:
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
     }
-#line 4408 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4429 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 47:
 #line 542 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 4414 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4435 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 48:
@@ -4420,7 +4441,7 @@ yyreduce:
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
     }
-#line 4424 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4445 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 49:
@@ -4430,13 +4451,13 @@ yyreduce:
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
     }
-#line 4434 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4455 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 50:
 #line 556 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 4440 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4461 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 51:
@@ -4447,7 +4468,7 @@ yyreduce:
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
     }
-#line 4451 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4472 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 52:
@@ -4458,13 +4479,13 @@ yyreduce:
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
     }
-#line 4462 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4483 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 53:
 #line 572 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 4468 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4489 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 54:
@@ -4474,7 +4495,7 @@ yyreduce:
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc);
     }
-#line 4478 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4499 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 55:
@@ -4484,7 +4505,7 @@ yyreduce:
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc);
     }
-#line 4488 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4509 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 56:
@@ -4494,7 +4515,7 @@ yyreduce:
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc);
     }
-#line 4498 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4519 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 57:
@@ -4504,13 +4525,13 @@ yyreduce:
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc);
     }
-#line 4508 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4529 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 58:
 #line 596 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 4514 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4535 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 59:
@@ -4523,7 +4544,7 @@ yyreduce:
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc);
     }
-#line 4527 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4548 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 60:
@@ -4536,13 +4557,13 @@ yyreduce:
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc);
     }
-#line 4540 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4561 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 61:
 #line 616 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 4546 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4567 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 62:
@@ -4553,13 +4574,13 @@ yyreduce:
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
     }
-#line 4557 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4578 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 63:
 #line 626 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 4563 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4584 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 64:
@@ -4570,13 +4591,13 @@ yyreduce:
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
     }
-#line 4574 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4595 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 65:
 #line 636 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 4580 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4601 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 66:
@@ -4587,13 +4608,13 @@ yyreduce:
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
     }
-#line 4591 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4612 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 67:
 #line 646 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 4597 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4618 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 68:
@@ -4603,13 +4624,13 @@ yyreduce:
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc);
     }
-#line 4607 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4628 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 69:
 #line 655 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 4613 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4634 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 70:
@@ -4619,13 +4640,13 @@ yyreduce:
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc);
     }
-#line 4623 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4644 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 71:
 #line 664 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 4629 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4650 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 72:
@@ -4635,13 +4656,13 @@ yyreduce:
         if ((yyval.interm.intermTypedNode) == 0)
             (yyval.interm.intermTypedNode) = parseContext.intermediate.addConstantUnion(false, (yyvsp[-1].lex).loc);
     }
-#line 4639 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4660 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 73:
 #line 673 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 4645 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4666 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 74:
@@ -4649,7 +4670,7 @@ yyreduce:
     {
         ++parseContext.controlFlowNestingLevel;
     }
-#line 4653 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4674 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 75:
@@ -4666,13 +4687,13 @@ yyreduce:
             (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
         }
     }
-#line 4670 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4691 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 76:
 #line 692 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode); }
-#line 4676 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4697 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 77:
@@ -4689,7 +4710,7 @@ yyreduce:
             (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
         }
     }
-#line 4693 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4714 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 78:
@@ -4698,7 +4719,7 @@ yyreduce:
         (yyval.interm).loc = (yyvsp[0].lex).loc;
         (yyval.interm).op = EOpAssign;
     }
-#line 4702 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4723 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 79:
@@ -4707,7 +4728,7 @@ yyreduce:
         (yyval.interm).loc = (yyvsp[0].lex).loc;
         (yyval.interm).op = EOpMulAssign;
     }
-#line 4711 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4732 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 80:
@@ -4716,7 +4737,7 @@ yyreduce:
         (yyval.interm).loc = (yyvsp[0].lex).loc;
         (yyval.interm).op = EOpDivAssign;
     }
-#line 4720 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4741 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 81:
@@ -4726,7 +4747,7 @@ yyreduce:
         (yyval.interm).loc = (yyvsp[0].lex).loc;
         (yyval.interm).op = EOpModAssign;
     }
-#line 4730 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4751 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 82:
@@ -4735,7 +4756,7 @@ yyreduce:
         (yyval.interm).loc = (yyvsp[0].lex).loc;
         (yyval.interm).op = EOpAddAssign;
     }
-#line 4739 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4760 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 83:
@@ -4744,7 +4765,7 @@ yyreduce:
         (yyval.interm).loc = (yyvsp[0].lex).loc;
         (yyval.interm).op = EOpSubAssign;
     }
-#line 4748 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4769 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 84:
@@ -4753,7 +4774,7 @@ yyreduce:
         parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "bit-shift left assign");
         (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpLeftShiftAssign;
     }
-#line 4757 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4778 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 85:
@@ -4762,7 +4783,7 @@ yyreduce:
         parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "bit-shift right assign");
         (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpRightShiftAssign;
     }
-#line 4766 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4787 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 86:
@@ -4771,7 +4792,7 @@ yyreduce:
         parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "bitwise-and assign");
         (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpAndAssign;
     }
-#line 4775 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4796 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 87:
@@ -4780,7 +4801,7 @@ yyreduce:
         parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "bitwise-xor assign");
         (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpExclusiveOrAssign;
     }
-#line 4784 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4805 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 88:
@@ -4789,7 +4810,7 @@ yyreduce:
         parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "bitwise-or assign");
         (yyval.interm).loc = (yyvsp[0].lex).loc; (yyval.interm).op = EOpInclusiveOrAssign;
     }
-#line 4793 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4814 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 89:
@@ -4797,7 +4818,7 @@ yyreduce:
     {
         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
     }
-#line 4801 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4822 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 90:
@@ -4810,7 +4831,7 @@ yyreduce:
             (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
         }
     }
-#line 4814 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4835 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 91:
@@ -4819,7 +4840,7 @@ yyreduce:
         parseContext.constantValueCheck((yyvsp[0].interm.intermTypedNode), "");
         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
     }
-#line 4823 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4844 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 92:
@@ -4829,7 +4850,7 @@ yyreduce:
         (yyval.interm.intermNode) = 0;
         // TODO: 4.0 functionality: subroutines: make the identifier a user type for this signature
     }
-#line 4833 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4854 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 93:
@@ -4839,7 +4860,7 @@ yyreduce:
             (yyvsp[-1].interm).intermNode->getAsAggregate()->setOperator(EOpSequence);
         (yyval.interm.intermNode) = (yyvsp[-1].interm).intermNode;
     }
-#line 4843 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4864 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 94:
@@ -4852,7 +4873,7 @@ yyreduce:
         parseContext.setDefaultPrecision((yyvsp[-3].lex).loc, (yyvsp[-1].interm.type), (yyvsp[-2].interm.type).qualifier.precision);
         (yyval.interm.intermNode) = 0;
     }
-#line 4856 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4877 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 95:
@@ -4861,7 +4882,7 @@ yyreduce:
         parseContext.declareBlock((yyvsp[-1].interm).loc, *(yyvsp[-1].interm).typeList);
         (yyval.interm.intermNode) = 0;
     }
-#line 4865 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4886 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 96:
@@ -4870,7 +4891,7 @@ yyreduce:
         parseContext.declareBlock((yyvsp[-2].interm).loc, *(yyvsp[-2].interm).typeList, (yyvsp[-1].lex).string);
         (yyval.interm.intermNode) = 0;
     }
-#line 4874 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4895 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 97:
@@ -4879,7 +4900,7 @@ yyreduce:
         parseContext.declareBlock((yyvsp[-3].interm).loc, *(yyvsp[-3].interm).typeList, (yyvsp[-2].lex).string, (yyvsp[-1].interm).arraySizes);
         (yyval.interm.intermNode) = 0;
     }
-#line 4883 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4904 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 98:
@@ -4889,7 +4910,7 @@ yyreduce:
         parseContext.updateStandaloneQualifierDefaults((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type));
         (yyval.interm.intermNode) = 0;
     }
-#line 4893 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4914 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 99:
@@ -4899,7 +4920,7 @@ yyreduce:
         parseContext.addQualifierToExisting((yyvsp[-2].interm.type).loc, (yyvsp[-2].interm.type).qualifier, *(yyvsp[-1].lex).string);
         (yyval.interm.intermNode) = 0;
     }
-#line 4903 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4924 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 100:
@@ -4910,13 +4931,13 @@ yyreduce:
         parseContext.addQualifierToExisting((yyvsp[-3].interm.type).loc, (yyvsp[-3].interm.type).qualifier, *(yyvsp[-1].interm.identifierList));
         (yyval.interm.intermNode) = 0;
     }
-#line 4914 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4935 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 101:
 #line 826 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { parseContext.nestedBlockCheck((yyvsp[-2].interm.type).loc); }
-#line 4920 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4941 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 102:
@@ -4930,7 +4951,7 @@ yyreduce:
         (yyval.interm).loc = (yyvsp[-5].interm.type).loc;
         (yyval.interm).typeList = (yyvsp[-1].interm.typeList);
     }
-#line 4934 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4955 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 103:
@@ -4939,7 +4960,7 @@ yyreduce:
         (yyval.interm.identifierList) = new TIdentifierList;
         (yyval.interm.identifierList)->push_back((yyvsp[0].lex).string);
     }
-#line 4943 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4964 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 104:
@@ -4948,7 +4969,7 @@ yyreduce:
         (yyval.interm.identifierList) = (yyvsp[-2].interm.identifierList);
         (yyval.interm.identifierList)->push_back((yyvsp[0].lex).string);
     }
-#line 4952 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4973 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 105:
@@ -4957,7 +4978,7 @@ yyreduce:
         (yyval.interm).function = (yyvsp[-1].interm.function);
         (yyval.interm).loc = (yyvsp[0].lex).loc;
     }
-#line 4961 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4982 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 106:
@@ -4965,7 +4986,7 @@ yyreduce:
     {
         (yyval.interm.function) = (yyvsp[0].interm.function);
     }
-#line 4969 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4990 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 107:
@@ -4973,7 +4994,7 @@ yyreduce:
     {
         (yyval.interm.function) = (yyvsp[0].interm.function);
     }
-#line 4977 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 4998 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 108:
@@ -4986,7 +5007,7 @@ yyreduce:
         else
             delete (yyvsp[0].interm).param.type;
     }
-#line 4990 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5011 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 109:
@@ -5008,7 +5029,7 @@ yyreduce:
             (yyvsp[-2].interm.function)->addParameter((yyvsp[0].interm).param);
         }
     }
-#line 5012 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5033 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 110:
@@ -5032,7 +5053,7 @@ yyreduce:
         function = new TFunction((yyvsp[-1].lex).string, type);
         (yyval.interm.function) = function;
     }
-#line 5036 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5057 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 111:
@@ -5052,7 +5073,7 @@ yyreduce:
         (yyval.interm).loc = (yyvsp[0].lex).loc;
         (yyval.interm).param = param;
     }
-#line 5056 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5077 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 112:
@@ -5074,7 +5095,7 @@ yyreduce:
         (yyval.interm).loc = (yyvsp[-1].lex).loc;
         (yyval.interm).param = param;
     }
-#line 5078 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5099 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 113:
@@ -5090,7 +5111,7 @@ yyreduce:
         parseContext.paramCheckFix((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).qualifier, *(yyval.interm).param.type);
 
     }
-#line 5094 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5115 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 114:
@@ -5102,7 +5123,7 @@ yyreduce:
         parseContext.paramCheckFix((yyvsp[0].interm).loc, EvqTemporary, *(yyval.interm).param.type);
         parseContext.precisionQualifierCheck((yyval.interm).loc, (yyval.interm).param.type->getBasicType(), (yyval.interm).param.type->getQualifier());
     }
-#line 5106 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5127 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 115:
@@ -5117,7 +5138,7 @@ yyreduce:
         parseContext.parameterTypeCheck((yyvsp[0].interm).loc, (yyvsp[-1].interm.type).qualifier.storage, *(yyval.interm).param.type);
         parseContext.paramCheckFix((yyvsp[-1].interm.type).loc, (yyvsp[-1].interm.type).qualifier, *(yyval.interm).param.type);
     }
-#line 5121 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5142 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 116:
@@ -5129,7 +5150,7 @@ yyreduce:
         parseContext.paramCheckFix((yyvsp[0].interm).loc, EvqTemporary, *(yyval.interm).param.type);
         parseContext.precisionQualifierCheck((yyval.interm).loc, (yyval.interm).param.type->getBasicType(), (yyval.interm).param.type->getQualifier());
     }
-#line 5133 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5154 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 117:
@@ -5140,7 +5161,7 @@ yyreduce:
         if ((yyvsp[0].interm.type).arraySizes)
             parseContext.arraySizeRequiredCheck((yyvsp[0].interm.type).loc, *(yyvsp[0].interm.type).arraySizes);
     }
-#line 5144 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5165 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 118:
@@ -5148,7 +5169,7 @@ yyreduce:
     {
         (yyval.interm) = (yyvsp[0].interm);
     }
-#line 5152 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5173 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 119:
@@ -5157,7 +5178,7 @@ yyreduce:
         (yyval.interm) = (yyvsp[-2].interm);
         parseContext.declareVariable((yyvsp[0].lex).loc, *(yyvsp[0].lex).string, (yyvsp[-2].interm).type);
     }
-#line 5161 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5182 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 120:
@@ -5166,7 +5187,7 @@ yyreduce:
         (yyval.interm) = (yyvsp[-3].interm);
         parseContext.declareVariable((yyvsp[-1].lex).loc, *(yyvsp[-1].lex).string, (yyvsp[-3].interm).type, (yyvsp[0].interm).arraySizes);
     }
-#line 5170 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5191 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 121:
@@ -5176,7 +5197,7 @@ yyreduce:
         TIntermNode* initNode = parseContext.declareVariable((yyvsp[-3].lex).loc, *(yyvsp[-3].lex).string, (yyvsp[-5].interm).type, (yyvsp[-2].interm).arraySizes, (yyvsp[0].interm.intermTypedNode));
         (yyval.interm).intermNode = parseContext.intermediate.growAggregate((yyvsp[-5].interm).intermNode, initNode, (yyvsp[-1].lex).loc);
     }
-#line 5180 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5201 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 122:
@@ -5186,7 +5207,7 @@ yyreduce:
         TIntermNode* initNode = parseContext.declareVariable((yyvsp[-2].lex).loc, *(yyvsp[-2].lex).string, (yyvsp[-4].interm).type, 0, (yyvsp[0].interm.intermTypedNode));
         (yyval.interm).intermNode = parseContext.intermediate.growAggregate((yyvsp[-4].interm).intermNode, initNode, (yyvsp[-1].lex).loc);
     }
-#line 5190 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5211 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 123:
@@ -5196,7 +5217,7 @@ yyreduce:
         (yyval.interm).intermNode = 0;
         parseContext.declareTypeDefaults((yyval.interm).loc, (yyval.interm).type);
     }
-#line 5200 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5221 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 124:
@@ -5206,7 +5227,7 @@ yyreduce:
         (yyval.interm).intermNode = 0;
         parseContext.declareVariable((yyvsp[0].lex).loc, *(yyvsp[0].lex).string, (yyvsp[-1].interm.type));
     }
-#line 5210 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5231 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 125:
@@ -5216,7 +5237,7 @@ yyreduce:
         (yyval.interm).intermNode = 0;
         parseContext.declareVariable((yyvsp[-1].lex).loc, *(yyvsp[-1].lex).string, (yyvsp[-2].interm.type), (yyvsp[0].interm).arraySizes);
     }
-#line 5220 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5241 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 126:
@@ -5226,7 +5247,7 @@ yyreduce:
         TIntermNode* initNode = parseContext.declareVariable((yyvsp[-3].lex).loc, *(yyvsp[-3].lex).string, (yyvsp[-4].interm.type), (yyvsp[-2].interm).arraySizes, (yyvsp[0].interm.intermTypedNode));
         (yyval.interm).intermNode = parseContext.intermediate.growAggregate(0, initNode, (yyvsp[-1].lex).loc);
     }
-#line 5230 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5251 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 127:
@@ -5236,7 +5257,7 @@ yyreduce:
         TIntermNode* initNode = parseContext.declareVariable((yyvsp[-2].lex).loc, *(yyvsp[-2].lex).string, (yyvsp[-3].interm.type), 0, (yyvsp[0].interm.intermTypedNode));
         (yyval.interm).intermNode = parseContext.intermediate.growAggregate(0, initNode, (yyvsp[-1].lex).loc);
     }
-#line 5240 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5261 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 128:
@@ -5252,7 +5273,7 @@ yyreduce:
 
         parseContext.precisionQualifierCheck((yyval.interm.type).loc, (yyval.interm.type).basicType, (yyval.interm.type).qualifier);
     }
-#line 5256 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5277 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 129:
@@ -5281,7 +5302,7 @@ yyreduce:
              (parseContext.language == EShLangFragment && (yyval.interm.type).qualifier.storage == EvqVaryingIn)))
             (yyval.interm.type).qualifier.smooth = true;
     }
-#line 5285 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5306 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 130:
@@ -5292,7 +5313,7 @@ yyreduce:
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.invariant = true;
     }
-#line 5296 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5317 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 131:
@@ -5304,7 +5325,7 @@ yyreduce:
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.smooth = true;
     }
-#line 5308 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5329 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 132:
@@ -5316,23 +5337,27 @@ yyreduce:
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.flat = true;
     }
-#line 5320 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5341 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 133:
 #line 1118 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.globalCheck((yyvsp[0].lex).loc, "noperspective");
+#ifdef NV_EXTENSIONS
+        parseContext.profileRequires((yyvsp[0].lex).loc, EEsProfile, 0, E_GL_NV_shader_noperspective_interpolation, "noperspective");
+#else
         parseContext.requireProfile((yyvsp[0].lex).loc, ~EEsProfile, "noperspective");
+#endif
         parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 130, 0, "noperspective");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.nopersp = true;
     }
-#line 5332 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5357 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 134:
-#line 1125 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1129 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
 #ifdef AMD_EXTENSIONS
         parseContext.globalCheck((yyvsp[0].lex).loc, "__explicitInterpAMD");
@@ -5342,84 +5367,84 @@ yyreduce:
         (yyval.interm.type).qualifier.explicitInterp = true;
 #endif
     }
-#line 5346 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5371 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 135:
-#line 1137 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1141 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type) = (yyvsp[-1].interm.type);
     }
-#line 5354 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5379 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 136:
-#line 1143 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1147 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type) = (yyvsp[0].interm.type);
     }
-#line 5362 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5387 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 137:
-#line 1146 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1150 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type) = (yyvsp[-2].interm.type);
         (yyval.interm.type).shaderQualifiers.merge((yyvsp[0].interm.type).shaderQualifiers);
         parseContext.mergeObjectLayoutQualifiers((yyval.interm.type).qualifier, (yyvsp[0].interm.type).qualifier, false);
     }
-#line 5372 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5397 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 138:
-#line 1153 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1157 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         parseContext.setLayoutQualifier((yyvsp[0].lex).loc, (yyval.interm.type), *(yyvsp[0].lex).string);
     }
-#line 5381 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5406 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 139:
-#line 1157 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1161 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[-2].lex).loc);
         parseContext.setLayoutQualifier((yyvsp[-2].lex).loc, (yyval.interm.type), *(yyvsp[-2].lex).string, (yyvsp[0].interm.intermTypedNode));
     }
-#line 5390 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5415 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 140:
-#line 1161 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1165 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { // because "shared" is both an identifier and a keyword
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         TString strShared("shared");
         parseContext.setLayoutQualifier((yyvsp[0].lex).loc, (yyval.interm.type), strShared);
     }
-#line 5400 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5425 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 141:
-#line 1169 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1173 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.profileRequires((yyval.interm.type).loc, ECoreProfile | ECompatibilityProfile, 400, E_GL_ARB_gpu_shader5, "precise");
         parseContext.profileRequires((yyvsp[0].lex).loc, EEsProfile, 320, Num_AEP_gpu_shader5, AEP_gpu_shader5, "precise");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.noContraction = true;
     }
-#line 5411 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5436 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 142:
-#line 1178 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1182 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type) = (yyvsp[0].interm.type);
     }
-#line 5419 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5444 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 143:
-#line 1181 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1185 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type) = (yyvsp[-1].interm.type);
         if ((yyval.interm.type).basicType == EbtVoid)
@@ -5428,72 +5453,72 @@ yyreduce:
         (yyval.interm.type).shaderQualifiers.merge((yyvsp[0].interm.type).shaderQualifiers);
         parseContext.mergeQualifiers((yyval.interm.type).loc, (yyval.interm.type).qualifier, (yyvsp[0].interm.type).qualifier, false);
     }
-#line 5432 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5457 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 144:
-#line 1192 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1196 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type) = (yyvsp[0].interm.type);
     }
-#line 5440 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5465 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 145:
-#line 1195 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1199 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type) = (yyvsp[0].interm.type);
     }
-#line 5448 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5473 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 146:
-#line 1198 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1202 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.checkPrecisionQualifier((yyvsp[0].interm.type).loc, (yyvsp[0].interm.type).qualifier.precision);
         (yyval.interm.type) = (yyvsp[0].interm.type);
     }
-#line 5457 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5482 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 147:
-#line 1202 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1206 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         // allow inheritance of storage qualifier from block declaration
         (yyval.interm.type) = (yyvsp[0].interm.type);
     }
-#line 5466 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5491 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 148:
-#line 1206 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1210 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         // allow inheritance of storage qualifier from block declaration
         (yyval.interm.type) = (yyvsp[0].interm.type);
     }
-#line 5475 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5500 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 149:
-#line 1210 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1214 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         // allow inheritance of storage qualifier from block declaration
         (yyval.interm.type) = (yyvsp[0].interm.type);
     }
-#line 5484 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5509 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 150:
-#line 1217 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1221 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqConst;  // will later turn into EvqConstReadOnly, if the initializer is not constant
     }
-#line 5493 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5518 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 151:
-#line 1221 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1225 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.requireStage((yyvsp[0].lex).loc, EShLangVertex, "attribute");
         parseContext.checkDeprecated((yyvsp[0].lex).loc, ECoreProfile, 130, "attribute");
@@ -5506,11 +5531,11 @@ yyreduce:
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqVaryingIn;
     }
-#line 5510 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5535 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 152:
-#line 1233 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1237 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.checkDeprecated((yyvsp[0].lex).loc, ENoProfile, 130, "varying");
         parseContext.checkDeprecated((yyvsp[0].lex).loc, ECoreProfile, 130, "varying");
@@ -5525,43 +5550,43 @@ yyreduce:
         else
             (yyval.interm.type).qualifier.storage = EvqVaryingIn;
     }
-#line 5529 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5554 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 153:
-#line 1247 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1251 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.globalCheck((yyvsp[0].lex).loc, "inout");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqInOut;
     }
-#line 5539 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5564 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 154:
-#line 1252 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1256 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.globalCheck((yyvsp[0].lex).loc, "in");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         // whether this is a parameter "in" or a pipeline "in" will get sorted out a bit later
         (yyval.interm.type).qualifier.storage = EvqIn;
     }
-#line 5550 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5575 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 155:
-#line 1258 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1262 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.globalCheck((yyvsp[0].lex).loc, "out");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         // whether this is a parameter "out" or a pipeline "out" will get sorted out a bit later
         (yyval.interm.type).qualifier.storage = EvqOut;
     }
-#line 5561 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5586 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 156:
-#line 1264 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1268 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 120, 0, "centroid");
         parseContext.profileRequires((yyvsp[0].lex).loc, EEsProfile, 300, 0, "centroid");
@@ -5569,52 +5594,52 @@ yyreduce:
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.centroid = true;
     }
-#line 5573 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5598 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 157:
-#line 1271 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1275 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.globalCheck((yyvsp[0].lex).loc, "patch");
         parseContext.requireStage((yyvsp[0].lex).loc, (EShLanguageMask)(EShLangTessControlMask | EShLangTessEvaluationMask), "patch");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.patch = true;
     }
-#line 5584 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5609 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 158:
-#line 1277 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1281 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.globalCheck((yyvsp[0].lex).loc, "sample");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.sample = true;
     }
-#line 5594 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5619 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 159:
-#line 1282 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1286 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.globalCheck((yyvsp[0].lex).loc, "uniform");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqUniform;
     }
-#line 5604 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5629 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 160:
-#line 1287 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1291 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.globalCheck((yyvsp[0].lex).loc, "buffer");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqBuffer;
     }
-#line 5614 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5639 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 161:
-#line 1292 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1296 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.globalCheck((yyvsp[0].lex).loc, "shared");
         parseContext.profileRequires((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, 430, E_GL_ARB_compute_shader, "shared");
@@ -5623,126 +5648,126 @@ yyreduce:
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.storage = EvqShared;
     }
-#line 5627 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5652 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 162:
-#line 1300 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1304 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.coherent = true;
     }
-#line 5636 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5661 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 163:
-#line 1304 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1308 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.volatil = true;
     }
-#line 5645 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5670 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 164:
-#line 1308 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1312 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.restrict = true;
     }
-#line 5654 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5679 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 165:
-#line 1312 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1316 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.readonly = true;
     }
-#line 5663 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5688 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 166:
-#line 1316 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1320 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc);
         (yyval.interm.type).qualifier.writeonly = true;
     }
-#line 5672 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5697 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 167:
-#line 1320 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1324 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.spvRemoved((yyvsp[0].lex).loc, "subroutine");
         parseContext.globalCheck((yyvsp[0].lex).loc, "subroutine");
         parseContext.unimplemented((yyvsp[0].lex).loc, "subroutine");
         (yyval.interm.type).init((yyvsp[0].lex).loc);
     }
-#line 5683 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5708 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 168:
-#line 1326 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1330 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.spvRemoved((yyvsp[-3].lex).loc, "subroutine");
         parseContext.globalCheck((yyvsp[-3].lex).loc, "subroutine");
         parseContext.unimplemented((yyvsp[-3].lex).loc, "subroutine");
         (yyval.interm.type).init((yyvsp[-3].lex).loc);
     }
-#line 5694 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5719 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 169:
-#line 1335 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1339 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         // TODO
     }
-#line 5702 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5727 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 170:
-#line 1338 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1342 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         // TODO: 4.0 semantics: subroutines
         // 1) make sure each identifier is a type declared earlier with SUBROUTINE
         // 2) save all of the identifiers for future comparison with the declared function
     }
-#line 5712 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5737 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 171:
-#line 1346 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1350 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type) = (yyvsp[0].interm.type);
         (yyval.interm.type).qualifier.precision = parseContext.getDefaultPrecision((yyval.interm.type));
     }
-#line 5721 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5746 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 172:
-#line 1350 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1354 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.arrayDimCheck((yyvsp[0].interm).loc, (yyvsp[0].interm).arraySizes, 0);
         (yyval.interm.type) = (yyvsp[-1].interm.type);
         (yyval.interm.type).qualifier.precision = parseContext.getDefaultPrecision((yyval.interm.type));
         (yyval.interm.type).arraySizes = (yyvsp[0].interm).arraySizes;
     }
-#line 5732 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5757 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 173:
-#line 1359 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1363 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm).loc = (yyvsp[-1].lex).loc;
         (yyval.interm).arraySizes = new TArraySizes;
         (yyval.interm).arraySizes->addInnerSize();
     }
-#line 5742 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5767 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 174:
-#line 1364 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1368 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm).loc = (yyvsp[-2].lex).loc;
         (yyval.interm).arraySizes = new TArraySizes;
@@ -5751,20 +5776,20 @@ yyreduce:
         parseContext.arraySizeCheck((yyvsp[-1].interm.intermTypedNode)->getLoc(), (yyvsp[-1].interm.intermTypedNode), size);
         (yyval.interm).arraySizes->addInnerSize(size);
     }
-#line 5755 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5780 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 175:
-#line 1372 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1376 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm) = (yyvsp[-2].interm);
         (yyval.interm).arraySizes->addInnerSize();
     }
-#line 5764 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5789 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 176:
-#line 1376 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1380 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm) = (yyvsp[-3].interm);
 
@@ -5772,1484 +5797,1484 @@ yyreduce:
         parseContext.arraySizeCheck((yyvsp[-1].interm.intermTypedNode)->getLoc(), (yyvsp[-1].interm.intermTypedNode), size);
         (yyval.interm).arraySizes->addInnerSize(size);
     }
-#line 5776 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5801 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 177:
-#line 1386 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1390 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtVoid;
     }
-#line 5785 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5810 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 178:
-#line 1390 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1394 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
     }
-#line 5794 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5819 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 179:
-#line 1394 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1398 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.doubleCheck((yyvsp[0].lex).loc, "double");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
     }
-#line 5804 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5829 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 180:
-#line 1399 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1403 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.float16Check((yyvsp[0].lex).loc, "float16_t", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
     }
-#line 5814 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5839 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 181:
-#line 1404 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1408 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
     }
-#line 5824 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5849 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 182:
-#line 1409 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1413 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
     }
-#line 5834 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5859 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 183:
-#line 1414 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1418 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt;
     }
-#line 5843 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5868 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 184:
-#line 1418 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1422 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "unsigned integer");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint;
     }
-#line 5853 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5878 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 185:
-#line 1423 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1427 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.explicitInt8Check((yyvsp[0].lex).loc, "8-bit signed integer", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt8;
     }
-#line 5863 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5888 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 186:
-#line 1428 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1432 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.explicitInt8Check((yyvsp[0].lex).loc, "8-bit unsigned integer", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint8;
     }
-#line 5873 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5898 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 187:
-#line 1433 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1437 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.explicitInt16Check((yyvsp[0].lex).loc, "16-bit signed integer", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt16;
     }
-#line 5883 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5908 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 188:
-#line 1438 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1442 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.explicitInt16Check((yyvsp[0].lex).loc, "16-bit unsigned integer", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint16;
     }
-#line 5893 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5918 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 189:
-#line 1443 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1447 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit signed integer", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt;
     }
-#line 5903 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5928 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 190:
-#line 1448 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1452 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit unsigned integer", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint;
     }
-#line 5913 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5938 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 191:
-#line 1453 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1457 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.int64Check((yyvsp[0].lex).loc, "64-bit integer", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt64;
     }
-#line 5923 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5948 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 192:
-#line 1458 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1462 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.int64Check((yyvsp[0].lex).loc, "64-bit unsigned integer", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint64;
     }
-#line 5933 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5958 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 193:
-#line 1463 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1467 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtBool;
     }
-#line 5942 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5967 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 194:
-#line 1467 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1471 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setVector(2);
     }
-#line 5952 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5977 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 195:
-#line 1472 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1476 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setVector(3);
     }
-#line 5962 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5987 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 196:
-#line 1477 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1481 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setVector(4);
     }
-#line 5972 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 5997 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 197:
-#line 1482 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1486 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.doubleCheck((yyvsp[0].lex).loc, "double vector");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setVector(2);
     }
-#line 5983 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6008 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 198:
-#line 1488 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1492 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.doubleCheck((yyvsp[0].lex).loc, "double vector");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setVector(3);
     }
-#line 5994 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6019 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 199:
-#line 1494 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1498 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.doubleCheck((yyvsp[0].lex).loc, "double vector");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setVector(4);
     }
-#line 6005 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6030 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 200:
-#line 1500 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1504 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.float16Check((yyvsp[0].lex).loc, "half float vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setVector(2);
     }
-#line 6016 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6041 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 201:
-#line 1506 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1510 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.float16Check((yyvsp[0].lex).loc, "half float vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setVector(3);
     }
-#line 6027 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6052 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 202:
-#line 1512 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1516 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.float16Check((yyvsp[0].lex).loc, "half float vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setVector(4);
     }
-#line 6038 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6063 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 203:
-#line 1518 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1522 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
     	parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t vector", parseContext.symbolTable.atBuiltInLevel());
     	(yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
     	(yyval.interm.type).basicType = EbtFloat;
     	(yyval.interm.type).setVector(2);
     }
-#line 6049 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6074 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 204:
-#line 1524 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1528 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
     	parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t vector", parseContext.symbolTable.atBuiltInLevel());
     	(yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
     	(yyval.interm.type).basicType = EbtFloat;
     	(yyval.interm.type).setVector(3);
     }
-#line 6060 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6085 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 205:
-#line 1530 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1534 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
     	parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t vector", parseContext.symbolTable.atBuiltInLevel());
     	(yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
     	(yyval.interm.type).basicType = EbtFloat;
     	(yyval.interm.type).setVector(4);
     }
-#line 6071 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6096 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 206:
-#line 1536 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1540 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
     	parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t vector", parseContext.symbolTable.atBuiltInLevel());
     	(yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
     	(yyval.interm.type).basicType = EbtDouble;
     	(yyval.interm.type).setVector(2);
     }
-#line 6082 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6107 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 207:
-#line 1542 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1546 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
     	parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t vector", parseContext.symbolTable.atBuiltInLevel());
     	(yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
     	(yyval.interm.type).basicType = EbtDouble;
     	(yyval.interm.type).setVector(3);
     }
-#line 6093 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6118 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 208:
-#line 1548 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1552 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
     	parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t vector", parseContext.symbolTable.atBuiltInLevel());
     	(yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
     	(yyval.interm.type).basicType = EbtDouble;
     	(yyval.interm.type).setVector(4);
     }
-#line 6104 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6129 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 209:
-#line 1554 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1558 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtBool;
         (yyval.interm.type).setVector(2);
     }
-#line 6114 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6139 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 210:
-#line 1559 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1563 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtBool;
         (yyval.interm.type).setVector(3);
     }
-#line 6124 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6149 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 211:
-#line 1564 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1568 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtBool;
         (yyval.interm.type).setVector(4);
     }
-#line 6134 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6159 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 212:
-#line 1569 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1573 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt;
         (yyval.interm.type).setVector(2);
     }
-#line 6144 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6169 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 213:
-#line 1574 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1578 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt;
         (yyval.interm.type).setVector(3);
     }
-#line 6154 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6179 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 214:
-#line 1579 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1583 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt;
         (yyval.interm.type).setVector(4);
     }
-#line 6164 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6189 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 215:
-#line 1584 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1588 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
  	   parseContext.explicitInt8Check((yyvsp[0].lex).loc, "8-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
  	   (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
  	   (yyval.interm.type).basicType = EbtInt8;
  	   (yyval.interm.type).setVector(2);
     }
-#line 6175 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6200 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 216:
-#line 1590 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1594 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
  	   parseContext.explicitInt8Check((yyvsp[0].lex).loc, "8-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
  	   (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
  	   (yyval.interm.type).basicType = EbtInt8;
  	   (yyval.interm.type).setVector(3);
     }
-#line 6186 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6211 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 217:
-#line 1596 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1600 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
  	   parseContext.explicitInt8Check((yyvsp[0].lex).loc, "8-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
  	   (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
  	   (yyval.interm.type).basicType = EbtInt8;
  	   (yyval.interm.type).setVector(4);
     }
-#line 6197 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6222 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 218:
-#line 1602 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1606 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
  	   parseContext.explicitInt16Check((yyvsp[0].lex).loc, "16-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
  	   (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
  	   (yyval.interm.type).basicType = EbtInt16;
  	   (yyval.interm.type).setVector(2);
     }
-#line 6208 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6233 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 219:
-#line 1608 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1612 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
  	   parseContext.explicitInt16Check((yyvsp[0].lex).loc, "16-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
  	   (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
  	   (yyval.interm.type).basicType = EbtInt16;
  	   (yyval.interm.type).setVector(3);
     }
-#line 6219 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6244 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 220:
-#line 1614 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1618 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
  	   parseContext.explicitInt16Check((yyvsp[0].lex).loc, "16-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
  	   (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
  	   (yyval.interm.type).basicType = EbtInt16;
  	   (yyval.interm.type).setVector(4);
     }
-#line 6230 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6255 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 221:
-#line 1620 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1624 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt;
         (yyval.interm.type).setVector(2);
     }
-#line 6241 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6266 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 222:
-#line 1626 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1630 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt;
         (yyval.interm.type).setVector(3);
     }
-#line 6252 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6277 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 223:
-#line 1632 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1636 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt;
         (yyval.interm.type).setVector(4);
     }
-#line 6263 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6288 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 224:
-#line 1638 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1642 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.int64Check((yyvsp[0].lex).loc, "64-bit integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt64;
         (yyval.interm.type).setVector(2);
     }
-#line 6274 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6299 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 225:
-#line 1644 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1648 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.int64Check((yyvsp[0].lex).loc, "64-bit integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt64;
         (yyval.interm.type).setVector(3);
     }
-#line 6285 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6310 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 226:
-#line 1650 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1654 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.int64Check((yyvsp[0].lex).loc, "64-bit integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt64;
         (yyval.interm.type).setVector(4);
     }
-#line 6296 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6321 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 227:
-#line 1656 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1660 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "unsigned integer vector");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint;
         (yyval.interm.type).setVector(2);
     }
-#line 6307 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6332 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 228:
-#line 1662 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1666 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "unsigned integer vector");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint;
         (yyval.interm.type).setVector(3);
     }
-#line 6318 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6343 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 229:
-#line 1668 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1672 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.fullIntegerCheck((yyvsp[0].lex).loc, "unsigned integer vector");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint;
         (yyval.interm.type).setVector(4);
     }
-#line 6329 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6354 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 230:
-#line 1674 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1678 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.explicitInt8Check((yyvsp[0].lex).loc, "8-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint8;
         (yyval.interm.type).setVector(2);
     }
-#line 6340 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6365 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 231:
-#line 1680 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1684 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.explicitInt8Check((yyvsp[0].lex).loc, "8-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtInt8;
         (yyval.interm.type).setVector(3);
     }
-#line 6351 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6376 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 232:
-#line 1686 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1690 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.explicitInt8Check((yyvsp[0].lex).loc, "8-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint8;
         (yyval.interm.type).setVector(4);
     }
-#line 6362 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6387 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 233:
-#line 1692 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1696 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.explicitInt16Check((yyvsp[0].lex).loc, "16-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint16;
         (yyval.interm.type).setVector(2);
     }
-#line 6373 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6398 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 234:
-#line 1698 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1702 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.explicitInt16Check((yyvsp[0].lex).loc, "16-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint16;
         (yyval.interm.type).setVector(3);
     }
-#line 6384 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6409 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 235:
-#line 1704 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1708 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.explicitInt16Check((yyvsp[0].lex).loc, "16-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint16;
         (yyval.interm.type).setVector(4);
     }
-#line 6395 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6420 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 236:
-#line 1710 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1714 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint;
         (yyval.interm.type).setVector(2);
     }
-#line 6406 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6431 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 237:
-#line 1716 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1720 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint;
         (yyval.interm.type).setVector(3);
     }
-#line 6417 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6442 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 238:
-#line 1722 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1726 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.explicitInt32Check((yyvsp[0].lex).loc, "32-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint;
         (yyval.interm.type).setVector(4);
     }
-#line 6428 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6453 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 239:
-#line 1728 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1732 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.int64Check((yyvsp[0].lex).loc, "64-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint64;
         (yyval.interm.type).setVector(2);
     }
-#line 6439 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6464 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 240:
-#line 1734 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1738 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.int64Check((yyvsp[0].lex).loc, "64-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint64;
         (yyval.interm.type).setVector(3);
     }
-#line 6450 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6475 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 241:
-#line 1740 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1744 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.int64Check((yyvsp[0].lex).loc, "64-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtUint64;
         (yyval.interm.type).setVector(4);
     }
-#line 6461 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6486 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 242:
-#line 1746 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1750 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(2, 2);
     }
-#line 6471 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6496 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 243:
-#line 1751 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1755 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(3, 3);
     }
-#line 6481 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6506 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 244:
-#line 1756 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1760 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(4, 4);
     }
-#line 6491 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6516 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 245:
-#line 1761 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1765 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(2, 2);
     }
-#line 6501 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6526 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 246:
-#line 1766 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1770 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(2, 3);
     }
-#line 6511 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6536 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 247:
-#line 1771 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1775 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(2, 4);
     }
-#line 6521 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6546 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 248:
-#line 1776 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1780 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(3, 2);
     }
-#line 6531 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6556 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 249:
-#line 1781 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1785 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(3, 3);
     }
-#line 6541 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6566 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 250:
-#line 1786 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1790 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(3, 4);
     }
-#line 6551 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6576 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 251:
-#line 1791 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1795 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(4, 2);
     }
-#line 6561 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6586 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 252:
-#line 1796 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1800 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(4, 3);
     }
-#line 6571 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6596 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 253:
-#line 1801 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1805 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat;
         (yyval.interm.type).setMatrix(4, 4);
     }
-#line 6581 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6606 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 254:
-#line 1806 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1810 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(2, 2);
     }
-#line 6592 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6617 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 255:
-#line 1812 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1816 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(3, 3);
     }
-#line 6603 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6628 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 256:
-#line 1818 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1822 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(4, 4);
     }
-#line 6614 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6639 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 257:
-#line 1824 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1828 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(2, 2);
     }
-#line 6625 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6650 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 258:
-#line 1830 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1834 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(2, 3);
     }
-#line 6636 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6661 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 259:
-#line 1836 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1840 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(2, 4);
     }
-#line 6647 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6672 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 260:
-#line 1842 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1846 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(3, 2);
     }
-#line 6658 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6683 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 261:
-#line 1848 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1852 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(3, 3);
     }
-#line 6669 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6694 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 262:
-#line 1854 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1858 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(3, 4);
     }
-#line 6680 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6705 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 263:
-#line 1860 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1864 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(4, 2);
     }
-#line 6691 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6716 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 264:
-#line 1866 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1870 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(4, 3);
     }
-#line 6702 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6727 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 265:
-#line 1872 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1876 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.doubleCheck((yyvsp[0].lex).loc, "double matrix");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtDouble;
         (yyval.interm.type).setMatrix(4, 4);
     }
-#line 6713 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6738 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 266:
-#line 1878 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1882 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setMatrix(2, 2);
     }
-#line 6724 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6749 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 267:
-#line 1884 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1888 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setMatrix(3, 3);
     }
-#line 6735 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6760 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 268:
-#line 1890 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1894 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setMatrix(4, 4);
     }
-#line 6746 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6771 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 269:
-#line 1896 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1900 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setMatrix(2, 2);
     }
-#line 6757 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6782 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 270:
-#line 1902 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1906 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setMatrix(2, 3);
     }
-#line 6768 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6793 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 271:
-#line 1908 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1912 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setMatrix(2, 4);
     }
-#line 6779 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6804 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 272:
-#line 1914 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1918 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setMatrix(3, 2);
     }
-#line 6790 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6815 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 273:
-#line 1920 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1924 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setMatrix(3, 3);
     }
-#line 6801 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6826 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 274:
-#line 1926 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1930 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setMatrix(3, 4);
     }
-#line 6812 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6837 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 275:
-#line 1932 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1936 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setMatrix(4, 2);
     }
-#line 6823 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6848 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 276:
-#line 1938 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1942 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setMatrix(4, 3);
     }
-#line 6834 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6859 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 277:
-#line 1944 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1948 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.float16Check((yyvsp[0].lex).loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtFloat16;
         (yyval.interm.type).setMatrix(4, 4);
     }
-#line 6845 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6870 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 278:
-#line 1950 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1954 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
     	parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
     	(yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
     	(yyval.interm.type).basicType = EbtFloat;
     	(yyval.interm.type).setMatrix(2, 2);
     }
-#line 6856 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6881 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 279:
-#line 1956 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1960 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
     	parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
     	(yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
     	(yyval.interm.type).basicType = EbtFloat;
     	(yyval.interm.type).setMatrix(3, 3);
     }
-#line 6867 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6892 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 280:
-#line 1962 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1966 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
     	parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
     	(yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
     	(yyval.interm.type).basicType = EbtFloat;
     	(yyval.interm.type).setMatrix(4, 4);
     }
-#line 6878 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6903 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 281:
-#line 1968 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1972 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
     	parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
     	(yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
     	(yyval.interm.type).basicType = EbtFloat;
     	(yyval.interm.type).setMatrix(2, 2);
     }
-#line 6889 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6914 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 282:
-#line 1974 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1978 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
     	parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
     	(yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
     	(yyval.interm.type).basicType = EbtFloat;
     	(yyval.interm.type).setMatrix(2, 3);
     }
-#line 6900 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6925 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 283:
-#line 1980 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1984 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
     	parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
     	(yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
     	(yyval.interm.type).basicType = EbtFloat;
     	(yyval.interm.type).setMatrix(2, 4);
     }
-#line 6911 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6936 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 284:
-#line 1986 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1990 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
     	parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
     	(yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
     	(yyval.interm.type).basicType = EbtFloat;
     	(yyval.interm.type).setMatrix(3, 2);
     }
-#line 6922 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6947 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 285:
-#line 1992 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 1996 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
     	parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
     	(yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
     	(yyval.interm.type).basicType = EbtFloat;
     	(yyval.interm.type).setMatrix(3, 3);
     }
-#line 6933 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6958 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 286:
-#line 1998 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2002 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
     	parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
     	(yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
     	(yyval.interm.type).basicType = EbtFloat;
     	(yyval.interm.type).setMatrix(3, 4);
     }
-#line 6944 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6969 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 287:
-#line 2004 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2008 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
     	parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
     	(yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
     	(yyval.interm.type).basicType = EbtFloat;
     	(yyval.interm.type).setMatrix(4, 2);
     }
-#line 6955 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6980 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 288:
-#line 2010 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2014 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
     	parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
     	(yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
     	(yyval.interm.type).basicType = EbtFloat;
     	(yyval.interm.type).setMatrix(4, 3);
     }
-#line 6966 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 6991 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 289:
-#line 2016 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2020 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
     	parseContext.explicitFloat32Check((yyvsp[0].lex).loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
     	(yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
     	(yyval.interm.type).basicType = EbtFloat;
     	(yyval.interm.type).setMatrix(4, 4);
     }
-#line 6977 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7002 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 290:
-#line 2022 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2026 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
     	parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
     	(yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
     	(yyval.interm.type).basicType = EbtDouble;
     	(yyval.interm.type).setMatrix(2, 2);
     }
-#line 6988 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7013 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 291:
-#line 2028 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2032 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
     	parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
     	(yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
     	(yyval.interm.type).basicType = EbtDouble;
     	(yyval.interm.type).setMatrix(3, 3);
     }
-#line 6999 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7024 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 292:
-#line 2034 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2038 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
     	parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
     	(yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
     	(yyval.interm.type).basicType = EbtDouble;
     	(yyval.interm.type).setMatrix(4, 4);
     }
-#line 7010 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7035 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 293:
-#line 2040 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2044 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
     	parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
     	(yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
     	(yyval.interm.type).basicType = EbtDouble;
     	(yyval.interm.type).setMatrix(2, 2);
     }
-#line 7021 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7046 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 294:
-#line 2046 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2050 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
     	parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
     	(yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
     	(yyval.interm.type).basicType = EbtDouble;
     	(yyval.interm.type).setMatrix(2, 3);
     }
-#line 7032 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7057 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 295:
-#line 2052 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2056 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
     	parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
     	(yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
     	(yyval.interm.type).basicType = EbtDouble;
     	(yyval.interm.type).setMatrix(2, 4);
     }
-#line 7043 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7068 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 296:
-#line 2058 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2062 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
     	parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
     	(yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
     	(yyval.interm.type).basicType = EbtDouble;
     	(yyval.interm.type).setMatrix(3, 2);
     }
-#line 7054 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7079 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 297:
-#line 2064 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2068 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
     	parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
     	(yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
     	(yyval.interm.type).basicType = EbtDouble;
     	(yyval.interm.type).setMatrix(3, 3);
     }
-#line 7065 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7090 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 298:
-#line 2070 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2074 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
     	parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
     	(yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
     	(yyval.interm.type).basicType = EbtDouble;
     	(yyval.interm.type).setMatrix(3, 4);
     }
-#line 7076 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7101 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 299:
-#line 2076 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2080 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
     	parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
     	(yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
     	(yyval.interm.type).basicType = EbtDouble;
     	(yyval.interm.type).setMatrix(4, 2);
     }
-#line 7087 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7112 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 300:
-#line 2082 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2086 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
     	parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
     	(yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
     	(yyval.interm.type).basicType = EbtDouble;
     	(yyval.interm.type).setMatrix(4, 3);
     }
-#line 7098 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7123 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 301:
-#line 2088 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2092 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
     	parseContext.explicitFloat64Check((yyvsp[0].lex).loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
     	(yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
     	(yyval.interm.type).basicType = EbtDouble;
     	(yyval.interm.type).setMatrix(4, 4);
     }
-#line 7109 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7134 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 302:
-#line 2094 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2098 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.vulkanRemoved((yyvsp[0].lex).loc, "atomic counter types");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtAtomicUint;
     }
-#line 7119 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7144 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 303:
-#line 2099 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2103 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd1D);
     }
-#line 7129 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7154 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 304:
-#line 2104 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2108 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd2D);
     }
-#line 7139 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7164 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 305:
-#line 2109 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2113 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd3D);
     }
-#line 7149 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7174 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 306:
-#line 2114 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2118 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, EsdCube);
     }
-#line 7159 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7184 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 307:
-#line 2119 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2123 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd1D, false, true);
     }
-#line 7169 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7194 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 308:
-#line 2124 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2128 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd2D, false, true);
     }
-#line 7179 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7204 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 309:
-#line 2129 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2133 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, EsdCube, false, true);
     }
-#line 7189 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7214 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 310:
-#line 2134 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2138 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd1D, true);
     }
-#line 7199 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7224 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 311:
-#line 2139 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2143 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd2D, true);
     }
-#line 7209 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7234 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 312:
-#line 2144 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2148 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd1D, true, true);
     }
-#line 7219 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7244 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 313:
-#line 2149 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2153 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd2D, true, true);
     }
-#line 7229 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7254 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 314:
-#line 2154 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2158 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, EsdCube, true);
     }
-#line 7239 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7264 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 315:
-#line 2159 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2163 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, EsdCube, true, true);
     }
-#line 7249 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7274 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 316:
-#line 2164 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2168 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
 #ifdef AMD_EXTENSIONS
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
@@ -7258,11 +7283,11 @@ yyreduce:
         (yyval.interm.type).sampler.set(EbtFloat16, Esd1D);
 #endif
     }
-#line 7262 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7287 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 317:
-#line 2172 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2176 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
 #ifdef AMD_EXTENSIONS
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
@@ -7271,11 +7296,11 @@ yyreduce:
         (yyval.interm.type).sampler.set(EbtFloat16, Esd2D);
 #endif
     }
-#line 7275 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7300 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 318:
-#line 2180 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2184 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
 #ifdef AMD_EXTENSIONS
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
@@ -7284,11 +7309,11 @@ yyreduce:
         (yyval.interm.type).sampler.set(EbtFloat16, Esd3D);
 #endif
     }
-#line 7288 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7313 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 319:
-#line 2188 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2192 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
 #ifdef AMD_EXTENSIONS
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
@@ -7297,11 +7322,11 @@ yyreduce:
         (yyval.interm.type).sampler.set(EbtFloat16, EsdCube);
 #endif
     }
-#line 7301 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7326 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 320:
-#line 2196 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2200 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
 #ifdef AMD_EXTENSIONS
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
@@ -7310,11 +7335,11 @@ yyreduce:
         (yyval.interm.type).sampler.set(EbtFloat16, Esd1D, false, true);
 #endif
     }
-#line 7314 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7339 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 321:
-#line 2204 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2208 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
 #ifdef AMD_EXTENSIONS
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
@@ -7323,11 +7348,11 @@ yyreduce:
         (yyval.interm.type).sampler.set(EbtFloat16, Esd2D, false, true);
 #endif
     }
-#line 7327 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7352 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 322:
-#line 2212 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2216 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
 #ifdef AMD_EXTENSIONS
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
@@ -7336,11 +7361,11 @@ yyreduce:
         (yyval.interm.type).sampler.set(EbtFloat16, EsdCube, false, true);
 #endif
     }
-#line 7340 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7365 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 323:
-#line 2220 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2224 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
 #ifdef AMD_EXTENSIONS
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
@@ -7349,11 +7374,11 @@ yyreduce:
         (yyval.interm.type).sampler.set(EbtFloat16, Esd1D, true);
 #endif
     }
-#line 7353 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7378 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 324:
-#line 2228 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2232 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
 #ifdef AMD_EXTENSIONS
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
@@ -7362,11 +7387,11 @@ yyreduce:
         (yyval.interm.type).sampler.set(EbtFloat16, Esd2D, true);
 #endif
     }
-#line 7366 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7391 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 325:
-#line 2236 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2240 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
 #ifdef AMD_EXTENSIONS
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
@@ -7375,11 +7400,11 @@ yyreduce:
         (yyval.interm.type).sampler.set(EbtFloat16, Esd1D, true, true);
 #endif
     }
-#line 7379 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7404 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 326:
-#line 2244 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2248 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
 #ifdef AMD_EXTENSIONS
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
@@ -7388,11 +7413,11 @@ yyreduce:
         (yyval.interm.type).sampler.set(EbtFloat16, Esd2D, true, true);
 #endif
     }
-#line 7392 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7417 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 327:
-#line 2252 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2256 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
 #ifdef AMD_EXTENSIONS
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
@@ -7401,11 +7426,11 @@ yyreduce:
         (yyval.interm.type).sampler.set(EbtFloat16, EsdCube, true);
 #endif
     }
-#line 7405 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7430 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 328:
-#line 2260 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2264 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
 #ifdef AMD_EXTENSIONS
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
@@ -7414,171 +7439,171 @@ yyreduce:
         (yyval.interm.type).sampler.set(EbtFloat16, EsdCube, true, true);
 #endif
     }
-#line 7418 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7443 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 329:
-#line 2268 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2272 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, Esd1D);
     }
-#line 7428 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7453 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 330:
-#line 2273 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2277 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, Esd2D);
     }
-#line 7438 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7463 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 331:
-#line 2278 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2282 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, Esd3D);
     }
-#line 7448 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7473 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 332:
-#line 2283 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2287 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, EsdCube);
     }
-#line 7458 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7483 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 333:
-#line 2288 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2292 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, Esd1D, true);
     }
-#line 7468 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7493 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 334:
-#line 2293 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2297 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, Esd2D, true);
     }
-#line 7478 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7503 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 335:
-#line 2298 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2302 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, EsdCube, true);
     }
-#line 7488 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7513 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 336:
-#line 2303 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2307 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, Esd1D);
     }
-#line 7498 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7523 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 337:
-#line 2308 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2312 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, Esd2D);
     }
-#line 7508 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7533 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 338:
-#line 2313 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2317 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, Esd3D);
     }
-#line 7518 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7543 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 339:
-#line 2318 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2322 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, EsdCube);
     }
-#line 7528 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7553 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 340:
-#line 2323 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2327 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, Esd1D, true);
     }
-#line 7538 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7563 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 341:
-#line 2328 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2332 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, Esd2D, true);
     }
-#line 7548 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7573 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 342:
-#line 2333 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2337 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, EsdCube, true);
     }
-#line 7558 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7583 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 343:
-#line 2338 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2342 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, EsdRect);
     }
-#line 7568 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7593 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 344:
-#line 2343 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2347 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, EsdRect, false, true);
     }
-#line 7578 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7603 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 345:
-#line 2348 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2352 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
 #ifdef AMD_EXTENSIONS
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
@@ -7587,11 +7612,11 @@ yyreduce:
         (yyval.interm.type).sampler.set(EbtFloat16, EsdRect);
 #endif
     }
-#line 7591 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7616 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 346:
-#line 2356 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2360 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
 #ifdef AMD_EXTENSIONS
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
@@ -7600,41 +7625,41 @@ yyreduce:
         (yyval.interm.type).sampler.set(EbtFloat16, EsdRect, false, true);
 #endif
     }
-#line 7604 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7629 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 347:
-#line 2364 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2368 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, EsdRect);
     }
-#line 7614 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7639 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 348:
-#line 2369 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2373 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, EsdRect);
     }
-#line 7624 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7649 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 349:
-#line 2374 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2378 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, EsdBuffer);
     }
-#line 7634 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7659 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 350:
-#line 2379 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2383 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
 #ifdef AMD_EXTENSIONS
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
@@ -7643,41 +7668,41 @@ yyreduce:
         (yyval.interm.type).sampler.set(EbtFloat16, EsdBuffer);
 #endif
     }
-#line 7647 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7672 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 351:
-#line 2387 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2391 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, EsdBuffer);
     }
-#line 7657 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7682 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 352:
-#line 2392 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2396 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, EsdBuffer);
     }
-#line 7667 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7692 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 353:
-#line 2397 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2401 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd2D, false, false, true);
     }
-#line 7677 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7702 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 354:
-#line 2402 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2406 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
 #ifdef AMD_EXTENSIONS
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
@@ -7686,41 +7711,41 @@ yyreduce:
         (yyval.interm.type).sampler.set(EbtFloat16, Esd2D, false, false, true);
 #endif
     }
-#line 7690 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7715 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 355:
-#line 2410 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2414 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, Esd2D, false, false, true);
     }
-#line 7700 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7725 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 356:
-#line 2415 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2419 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, Esd2D, false, false, true);
     }
-#line 7710 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7735 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 357:
-#line 2420 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2424 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd2D, true, false, true);
     }
-#line 7720 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7745 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 358:
-#line 2425 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2429 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
 #ifdef AMD_EXTENSIONS
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
@@ -7729,61 +7754,61 @@ yyreduce:
         (yyval.interm.type).sampler.set(EbtFloat16, Esd2D, true, false, true);
 #endif
     }
-#line 7733 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7758 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 359:
-#line 2433 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2437 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtInt, Esd2D, true, false, true);
     }
-#line 7743 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7768 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 360:
-#line 2438 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2442 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtUint, Esd2D, true, false, true);
     }
-#line 7753 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7778 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 361:
-#line 2443 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2447 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setPureSampler(false);
     }
-#line 7763 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7788 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 362:
-#line 2448 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2452 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setPureSampler(true);
     }
-#line 7773 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7798 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 363:
-#line 2453 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2457 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, Esd1D);
     }
-#line 7783 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7808 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 364:
-#line 2458 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2462 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
 #ifdef AMD_EXTENSIONS
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
@@ -7792,21 +7817,21 @@ yyreduce:
         (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd1D);
 #endif
     }
-#line 7796 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7821 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 365:
-#line 2466 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2470 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, Esd2D);
     }
-#line 7806 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7831 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 366:
-#line 2471 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2475 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
 #ifdef AMD_EXTENSIONS
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
@@ -7815,21 +7840,21 @@ yyreduce:
         (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd2D);
 #endif
     }
-#line 7819 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7844 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 367:
-#line 2479 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2483 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, Esd3D);
     }
-#line 7829 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7854 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 368:
-#line 2484 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2488 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
 #ifdef AMD_EXTENSIONS
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
@@ -7838,21 +7863,21 @@ yyreduce:
         (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd3D);
 #endif
     }
-#line 7842 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7867 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 369:
-#line 2492 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2496 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, EsdCube);
     }
-#line 7852 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7877 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 370:
-#line 2497 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2501 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
 #ifdef AMD_EXTENSIONS
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
@@ -7861,21 +7886,21 @@ yyreduce:
         (yyval.interm.type).sampler.setTexture(EbtFloat16, EsdCube);
 #endif
     }
-#line 7865 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7890 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 371:
-#line 2505 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2509 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, Esd1D, true);
     }
-#line 7875 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7900 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 372:
-#line 2510 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2514 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
 #ifdef AMD_EXTENSIONS
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
@@ -7884,21 +7909,21 @@ yyreduce:
         (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd1D, true);
 #endif
     }
-#line 7888 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7913 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 373:
-#line 2518 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2522 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, Esd2D, true);
     }
-#line 7898 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7923 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 374:
-#line 2523 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2527 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
 #ifdef AMD_EXTENSIONS
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
@@ -7907,21 +7932,21 @@ yyreduce:
         (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd2D, true);
 #endif
     }
-#line 7911 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7936 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 375:
-#line 2531 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2535 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, EsdCube, true);
     }
-#line 7921 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7946 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 376:
-#line 2536 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2540 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
 #ifdef AMD_EXTENSIONS
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
@@ -7930,161 +7955,161 @@ yyreduce:
         (yyval.interm.type).sampler.setTexture(EbtFloat16, EsdCube, true);
 #endif
     }
-#line 7934 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7959 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 377:
-#line 2544 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2548 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, Esd1D);
     }
-#line 7944 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7969 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 378:
-#line 2549 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2553 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, Esd2D);
     }
-#line 7954 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7979 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 379:
-#line 2554 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2558 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, Esd3D);
     }
-#line 7964 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7989 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 380:
-#line 2559 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2563 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, EsdCube);
     }
-#line 7974 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 7999 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 381:
-#line 2564 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2568 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, Esd1D, true);
     }
-#line 7984 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8009 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 382:
-#line 2569 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2573 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, Esd2D, true);
     }
-#line 7994 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8019 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 383:
-#line 2574 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2578 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, EsdCube, true);
     }
-#line 8004 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8029 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 384:
-#line 2579 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2583 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, Esd1D);
     }
-#line 8014 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8039 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 385:
-#line 2584 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2588 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, Esd2D);
     }
-#line 8024 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8049 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 386:
-#line 2589 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2593 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, Esd3D);
     }
-#line 8034 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8059 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 387:
-#line 2594 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2598 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, EsdCube);
     }
-#line 8044 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8069 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 388:
-#line 2599 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2603 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, Esd1D, true);
     }
-#line 8054 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8079 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 389:
-#line 2604 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2608 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, Esd2D, true);
     }
-#line 8064 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8089 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 390:
-#line 2609 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2613 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, EsdCube, true);
     }
-#line 8074 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8099 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 391:
-#line 2614 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2618 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, EsdRect);
     }
-#line 8084 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8109 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 392:
-#line 2619 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2623 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
 #ifdef AMD_EXTENSIONS
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
@@ -8093,41 +8118,41 @@ yyreduce:
         (yyval.interm.type).sampler.setTexture(EbtFloat16, EsdRect);
 #endif
     }
-#line 8097 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8122 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 393:
-#line 2627 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2631 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, EsdRect);
     }
-#line 8107 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8132 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 394:
-#line 2632 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2636 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, EsdRect);
     }
-#line 8117 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8142 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 395:
-#line 2637 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2641 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, EsdBuffer);
     }
-#line 8127 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8152 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 396:
-#line 2642 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2646 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
 #ifdef AMD_EXTENSIONS
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
@@ -8136,41 +8161,41 @@ yyreduce:
         (yyval.interm.type).sampler.setTexture(EbtFloat16, EsdBuffer);
 #endif
     }
-#line 8140 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8165 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 397:
-#line 2650 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2654 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, EsdBuffer);
     }
-#line 8150 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8175 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 398:
-#line 2655 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2659 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, EsdBuffer);
     }
-#line 8160 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8185 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 399:
-#line 2660 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2664 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, Esd2D, false, false, true);
     }
-#line 8170 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8195 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 400:
-#line 2665 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2669 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
 #ifdef AMD_EXTENSIONS
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
@@ -8179,41 +8204,41 @@ yyreduce:
         (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd2D, false, false, true);
 #endif
     }
-#line 8183 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8208 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 401:
-#line 2673 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2677 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, Esd2D, false, false, true);
     }
-#line 8193 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8218 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 402:
-#line 2678 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2682 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, Esd2D, false, false, true);
     }
-#line 8203 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8228 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 403:
-#line 2683 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2687 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtFloat, Esd2D, true, false, true);
     }
-#line 8213 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8238 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 404:
-#line 2688 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2692 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
 #ifdef AMD_EXTENSIONS
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
@@ -8222,41 +8247,41 @@ yyreduce:
         (yyval.interm.type).sampler.setTexture(EbtFloat16, Esd2D, true, false, true);
 #endif
     }
-#line 8226 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8251 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 405:
-#line 2696 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2700 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtInt, Esd2D, true, false, true);
     }
-#line 8236 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8261 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 406:
-#line 2701 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2705 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setTexture(EbtUint, Esd2D, true, false, true);
     }
-#line 8246 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8271 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 407:
-#line 2706 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2710 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, Esd1D);
     }
-#line 8256 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8281 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 408:
-#line 2711 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2715 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
 #ifdef AMD_EXTENSIONS
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
@@ -8265,41 +8290,41 @@ yyreduce:
         (yyval.interm.type).sampler.setImage(EbtFloat16, Esd1D);
 #endif
     }
-#line 8269 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8294 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 409:
-#line 2719 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2723 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, Esd1D);
     }
-#line 8279 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8304 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 410:
-#line 2724 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2728 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, Esd1D);
     }
-#line 8289 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8314 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 411:
-#line 2729 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2733 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, Esd2D);
     }
-#line 8299 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8324 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 412:
-#line 2734 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2738 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
 #ifdef AMD_EXTENSIONS
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
@@ -8308,41 +8333,41 @@ yyreduce:
         (yyval.interm.type).sampler.setImage(EbtFloat16, Esd2D);
 #endif
     }
-#line 8312 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8337 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 413:
-#line 2742 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2746 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, Esd2D);
     }
-#line 8322 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8347 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 414:
-#line 2747 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2751 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, Esd2D);
     }
-#line 8332 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8357 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 415:
-#line 2752 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2756 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, Esd3D);
     }
-#line 8342 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8367 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 416:
-#line 2757 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2761 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
 #ifdef AMD_EXTENSIONS
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
@@ -8351,41 +8376,41 @@ yyreduce:
         (yyval.interm.type).sampler.setImage(EbtFloat16, Esd3D);
 #endif
     }
-#line 8355 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8380 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 417:
-#line 2765 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2769 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, Esd3D);
     }
-#line 8365 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8390 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 418:
-#line 2770 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2774 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, Esd3D);
     }
-#line 8375 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8400 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 419:
-#line 2775 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2779 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, EsdRect);
     }
-#line 8385 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8410 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 420:
-#line 2780 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2784 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
 #ifdef AMD_EXTENSIONS
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
@@ -8394,41 +8419,41 @@ yyreduce:
         (yyval.interm.type).sampler.setImage(EbtFloat16, EsdRect);
 #endif
     }
-#line 8398 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8423 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 421:
-#line 2788 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2792 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, EsdRect);
     }
-#line 8408 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8433 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 422:
-#line 2793 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2797 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, EsdRect);
     }
-#line 8418 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8443 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 423:
-#line 2798 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2802 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, EsdCube);
     }
-#line 8428 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8453 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 424:
-#line 2803 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2807 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
 #ifdef AMD_EXTENSIONS
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
@@ -8437,41 +8462,41 @@ yyreduce:
         (yyval.interm.type).sampler.setImage(EbtFloat16, EsdCube);
 #endif
     }
-#line 8441 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8466 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 425:
-#line 2811 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2815 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, EsdCube);
     }
-#line 8451 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8476 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 426:
-#line 2816 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2820 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, EsdCube);
     }
-#line 8461 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8486 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 427:
-#line 2821 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2825 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, EsdBuffer);
     }
-#line 8471 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8496 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 428:
-#line 2826 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2830 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
 #ifdef AMD_EXTENSIONS
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
@@ -8480,41 +8505,41 @@ yyreduce:
         (yyval.interm.type).sampler.setImage(EbtFloat16, EsdBuffer);
 #endif
     }
-#line 8484 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8509 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 429:
-#line 2834 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2838 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, EsdBuffer);
     }
-#line 8494 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8519 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 430:
-#line 2839 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2843 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, EsdBuffer);
     }
-#line 8504 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8529 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 431:
-#line 2844 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2848 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, Esd1D, true);
     }
-#line 8514 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8539 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 432:
-#line 2849 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2853 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
 #ifdef AMD_EXTENSIONS
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
@@ -8523,41 +8548,41 @@ yyreduce:
         (yyval.interm.type).sampler.setImage(EbtFloat16, Esd1D, true);
 #endif
     }
-#line 8527 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8552 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 433:
-#line 2857 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2861 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, Esd1D, true);
     }
-#line 8537 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8562 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 434:
-#line 2862 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2866 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, Esd1D, true);
     }
-#line 8547 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8572 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 435:
-#line 2867 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2871 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, Esd2D, true);
     }
-#line 8557 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8582 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 436:
-#line 2872 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2876 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
 #ifdef AMD_EXTENSIONS
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
@@ -8566,41 +8591,41 @@ yyreduce:
         (yyval.interm.type).sampler.setImage(EbtFloat16, Esd2D, true);
 #endif
     }
-#line 8570 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8595 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 437:
-#line 2880 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2884 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, Esd2D, true);
     }
-#line 8580 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8605 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 438:
-#line 2885 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2889 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, Esd2D, true);
     }
-#line 8590 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8615 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 439:
-#line 2890 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2894 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, EsdCube, true);
     }
-#line 8600 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8625 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 440:
-#line 2895 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2899 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
 #ifdef AMD_EXTENSIONS
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
@@ -8609,41 +8634,41 @@ yyreduce:
         (yyval.interm.type).sampler.setImage(EbtFloat16, EsdCube, true);
 #endif
     }
-#line 8613 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8638 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 441:
-#line 2903 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2907 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, EsdCube, true);
     }
-#line 8623 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8648 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 442:
-#line 2908 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2912 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, EsdCube, true);
     }
-#line 8633 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8658 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 443:
-#line 2913 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2917 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, Esd2D, false, false, true);
     }
-#line 8643 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8668 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 444:
-#line 2918 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2922 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
 #ifdef AMD_EXTENSIONS
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
@@ -8652,41 +8677,41 @@ yyreduce:
         (yyval.interm.type).sampler.setImage(EbtFloat16, Esd2D, false, false, true);
 #endif
     }
-#line 8656 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8681 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 445:
-#line 2926 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2930 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, Esd2D, false, false, true);
     }
-#line 8666 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8691 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 446:
-#line 2931 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2935 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, Esd2D, false, false, true);
     }
-#line 8676 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8701 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 447:
-#line 2936 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2940 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtFloat, Esd2D, true, false, true);
     }
-#line 8686 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8711 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 448:
-#line 2941 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2945 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
 #ifdef AMD_EXTENSIONS
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
@@ -8695,64 +8720,64 @@ yyreduce:
         (yyval.interm.type).sampler.setImage(EbtFloat16, Esd2D, true, false, true);
 #endif
     }
-#line 8699 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8724 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 449:
-#line 2949 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2953 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtInt, Esd2D, true, false, true);
     }
-#line 8709 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8734 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 450:
-#line 2954 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2958 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setImage(EbtUint, Esd2D, true, false, true);
     }
-#line 8719 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8744 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 451:
-#line 2959 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2963 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {  // GL_OES_EGL_image_external
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.set(EbtFloat, Esd2D);
         (yyval.interm.type).sampler.external = true;
     }
-#line 8730 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8755 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 452:
-#line 2965 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2969 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setSubpass(EbtFloat);
     }
-#line 8741 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8766 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 453:
-#line 2971 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2975 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setSubpass(EbtFloat, true);
     }
-#line 8752 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8777 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 454:
-#line 2977 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2981 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
 #ifdef AMD_EXTENSIONS
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float subpass input", parseContext.symbolTable.atBuiltInLevel());
@@ -8762,11 +8787,11 @@ yyreduce:
         (yyval.interm.type).sampler.setSubpass(EbtFloat16);
 #endif
     }
-#line 8766 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8791 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 455:
-#line 2986 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2990 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
 #ifdef AMD_EXTENSIONS
         parseContext.float16OpaqueCheck((yyvsp[0].lex).loc, "half float subpass input", parseContext.symbolTable.atBuiltInLevel());
@@ -8776,65 +8801,65 @@ yyreduce:
         (yyval.interm.type).sampler.setSubpass(EbtFloat16, true);
 #endif
     }
-#line 8780 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8805 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 456:
-#line 2995 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 2999 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setSubpass(EbtInt);
     }
-#line 8791 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8816 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 457:
-#line 3001 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3005 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setSubpass(EbtInt, true);
     }
-#line 8802 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8827 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 458:
-#line 3007 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3011 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setSubpass(EbtUint);
     }
-#line 8813 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8838 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 459:
-#line 3013 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3017 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.requireStage((yyvsp[0].lex).loc, EShLangFragment, "subpass input");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         (yyval.interm.type).basicType = EbtSampler;
         (yyval.interm.type).sampler.setSubpass(EbtUint, true);
     }
-#line 8824 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8849 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 460:
-#line 3019 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3023 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.type) = (yyvsp[0].interm.type);
         (yyval.interm.type).qualifier.storage = parseContext.symbolTable.atGlobalLevel() ? EvqGlobal : EvqTemporary;
         parseContext.structTypeCheck((yyval.interm.type).loc, (yyval.interm.type));
     }
-#line 8834 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8859 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 461:
-#line 3024 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3028 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         //
         // This is for user defined type names.  The lexical phase looked up the
@@ -8848,47 +8873,47 @@ yyreduce:
         } else
             parseContext.error((yyvsp[0].lex).loc, "expected type name", (yyvsp[0].lex).string->c_str(), "");
     }
-#line 8852 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8877 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 462:
-#line 3040 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3044 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 130, 0, "highp precision qualifier");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         parseContext.handlePrecisionQualifier((yyvsp[0].lex).loc, (yyval.interm.type).qualifier, EpqHigh);
     }
-#line 8862 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8887 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 463:
-#line 3045 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3049 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 130, 0, "mediump precision qualifier");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         parseContext.handlePrecisionQualifier((yyvsp[0].lex).loc, (yyval.interm.type).qualifier, EpqMedium);
     }
-#line 8872 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8897 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 464:
-#line 3050 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3054 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.profileRequires((yyvsp[0].lex).loc, ENoProfile, 130, 0, "lowp precision qualifier");
         (yyval.interm.type).init((yyvsp[0].lex).loc, parseContext.symbolTable.atGlobalLevel());
         parseContext.handlePrecisionQualifier((yyvsp[0].lex).loc, (yyval.interm.type).qualifier, EpqLow);
     }
-#line 8882 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8907 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 465:
-#line 3058 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3062 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { parseContext.nestedStructCheck((yyvsp[-2].lex).loc); }
-#line 8888 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8913 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 466:
-#line 3058 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3062 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         TType* structure = new TType((yyvsp[-1].interm.typeList), *(yyvsp[-4].lex).string);
         parseContext.structArrayCheck((yyvsp[-4].lex).loc, *structure);
@@ -8900,17 +8925,17 @@ yyreduce:
         (yyval.interm.type).userDef = structure;
         --parseContext.structNestingLevel;
     }
-#line 8904 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8929 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 467:
-#line 3069 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3073 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { parseContext.nestedStructCheck((yyvsp[-1].lex).loc); }
-#line 8910 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8935 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 468:
-#line 3069 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3073 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         TType* structure = new TType((yyvsp[-1].interm.typeList), TString(""));
         (yyval.interm.type).init((yyvsp[-4].lex).loc);
@@ -8918,19 +8943,19 @@ yyreduce:
         (yyval.interm.type).userDef = structure;
         --parseContext.structNestingLevel;
     }
-#line 8922 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8947 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 469:
-#line 3079 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3083 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.typeList) = (yyvsp[0].interm.typeList);
     }
-#line 8930 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8955 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 470:
-#line 3082 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3086 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.typeList) = (yyvsp[-1].interm.typeList);
         for (unsigned int i = 0; i < (yyvsp[0].interm.typeList)->size(); ++i) {
@@ -8941,11 +8966,11 @@ yyreduce:
             (yyval.interm.typeList)->push_back((*(yyvsp[0].interm.typeList))[i]);
         }
     }
-#line 8945 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8970 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 471:
-#line 3095 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3099 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         if ((yyvsp[-2].interm.type).arraySizes) {
             parseContext.profileRequires((yyvsp[-2].interm.type).loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type");
@@ -8964,11 +8989,11 @@ yyreduce:
             (*(yyval.interm.typeList))[i].type->mergeType((yyvsp[-2].interm.type));
         }
     }
-#line 8968 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 8993 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 472:
-#line 3113 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3117 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.globalQualifierFixCheck((yyvsp[-3].interm.type).loc, (yyvsp[-3].interm.type).qualifier);
         if ((yyvsp[-2].interm.type).arraySizes) {
@@ -8990,38 +9015,38 @@ yyreduce:
             (*(yyval.interm.typeList))[i].type->mergeType((yyvsp[-2].interm.type));
         }
     }
-#line 8994 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9019 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 473:
-#line 3137 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3141 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.typeList) = new TTypeList;
         (yyval.interm.typeList)->push_back((yyvsp[0].interm.typeLine));
     }
-#line 9003 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9028 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 474:
-#line 3141 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3145 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.typeList)->push_back((yyvsp[0].interm.typeLine));
     }
-#line 9011 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9036 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 475:
-#line 3147 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3151 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.typeLine).type = new TType(EbtVoid);
         (yyval.interm.typeLine).loc = (yyvsp[0].lex).loc;
         (yyval.interm.typeLine).type->setFieldName(*(yyvsp[0].lex).string);
     }
-#line 9021 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9046 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 476:
-#line 3152 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3156 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.arrayDimCheck((yyvsp[-1].lex).loc, (yyvsp[0].interm).arraySizes, 0);
 
@@ -9030,219 +9055,219 @@ yyreduce:
         (yyval.interm.typeLine).type->setFieldName(*(yyvsp[-1].lex).string);
         (yyval.interm.typeLine).type->newArraySizes(*(yyvsp[0].interm).arraySizes);
     }
-#line 9034 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9059 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 477:
-#line 3163 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3167 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
     }
-#line 9042 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9067 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 478:
-#line 3166 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3170 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         const char* initFeature = "{ } style initializers";
         parseContext.requireProfile((yyvsp[-2].lex).loc, ~EEsProfile, initFeature);
         parseContext.profileRequires((yyvsp[-2].lex).loc, ~EEsProfile, 420, E_GL_ARB_shading_language_420pack, initFeature);
         (yyval.interm.intermTypedNode) = (yyvsp[-1].interm.intermTypedNode);
     }
-#line 9053 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9078 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 479:
-#line 3172 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3176 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         const char* initFeature = "{ } style initializers";
         parseContext.requireProfile((yyvsp[-3].lex).loc, ~EEsProfile, initFeature);
         parseContext.profileRequires((yyvsp[-3].lex).loc, ~EEsProfile, 420, E_GL_ARB_shading_language_420pack, initFeature);
         (yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
     }
-#line 9064 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9089 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 480:
-#line 3181 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3185 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermTypedNode) = parseContext.intermediate.growAggregate(0, (yyvsp[0].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode)->getLoc());
     }
-#line 9072 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9097 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 481:
-#line 3184 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3188 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermTypedNode) = parseContext.intermediate.growAggregate((yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode));
     }
-#line 9080 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9105 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 482:
-#line 3190 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3194 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 9086 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9111 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 483:
-#line 3194 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3198 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 9092 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9117 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 484:
-#line 3195 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3199 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 9098 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9123 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 485:
-#line 3201 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3205 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 9104 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9129 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 486:
-#line 3202 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3206 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 9110 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9135 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 487:
-#line 3203 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3207 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 9116 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9141 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 488:
-#line 3204 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3208 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 9122 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9147 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 489:
-#line 3205 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3209 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 9128 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9153 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 490:
-#line 3206 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3210 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 9134 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9159 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 491:
-#line 3207 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3211 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 9140 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9165 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 492:
-#line 3211 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3215 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermNode) = 0; }
-#line 9146 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9171 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 493:
-#line 3212 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3216 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.symbolTable.push();
         ++parseContext.statementNestingLevel;
     }
-#line 9155 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9180 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 494:
-#line 3216 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3220 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]);
         --parseContext.statementNestingLevel;
     }
-#line 9164 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9189 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 495:
-#line 3220 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3224 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         if ((yyvsp[-2].interm.intermNode) && (yyvsp[-2].interm.intermNode)->getAsAggregate())
             (yyvsp[-2].interm.intermNode)->getAsAggregate()->setOperator(EOpSequence);
         (yyval.interm.intermNode) = (yyvsp[-2].interm.intermNode);
     }
-#line 9174 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9199 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 496:
-#line 3228 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3232 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 9180 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9205 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 497:
-#line 3229 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3233 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode); }
-#line 9186 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9211 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 498:
-#line 3233 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3237 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         ++parseContext.controlFlowNestingLevel;
     }
-#line 9194 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9219 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 499:
-#line 3236 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3240 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         --parseContext.controlFlowNestingLevel;
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 9203 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9228 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 500:
-#line 3240 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3244 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.symbolTable.push();
         ++parseContext.statementNestingLevel;
         ++parseContext.controlFlowNestingLevel;
     }
-#line 9213 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9238 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 501:
-#line 3245 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3249 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]);
         --parseContext.statementNestingLevel;
         --parseContext.controlFlowNestingLevel;
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 9224 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9249 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 502:
-#line 3254 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3258 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermNode) = 0;
     }
-#line 9232 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9257 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 503:
-#line 3257 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3261 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         if ((yyvsp[-1].interm.intermNode) && (yyvsp[-1].interm.intermNode)->getAsAggregate())
             (yyvsp[-1].interm.intermNode)->getAsAggregate()->setOperator(EOpSequence);
         (yyval.interm.intermNode) = (yyvsp[-1].interm.intermNode);
     }
-#line 9242 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9267 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 504:
-#line 3265 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3269 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermNode) = parseContext.intermediate.makeAggregate((yyvsp[0].interm.intermNode));
         if ((yyvsp[0].interm.intermNode) && (yyvsp[0].interm.intermNode)->getAsBranchNode() && ((yyvsp[0].interm.intermNode)->getAsBranchNode()->getFlowOp() == EOpCase ||
@@ -9251,11 +9276,11 @@ yyreduce:
             (yyval.interm.intermNode) = 0;  // start a fresh subsequence for what's after this case
         }
     }
-#line 9255 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9280 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 505:
-#line 3273 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3277 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         if ((yyvsp[0].interm.intermNode) && (yyvsp[0].interm.intermNode)->getAsBranchNode() && ((yyvsp[0].interm.intermNode)->getAsBranchNode()->getFlowOp() == EOpCase ||
                                             (yyvsp[0].interm.intermNode)->getAsBranchNode()->getFlowOp() == EOpDefault)) {
@@ -9264,76 +9289,76 @@ yyreduce:
         } else
             (yyval.interm.intermNode) = parseContext.intermediate.growAggregate((yyvsp[-1].interm.intermNode), (yyvsp[0].interm.intermNode));
     }
-#line 9268 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9293 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 506:
-#line 3284 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3288 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermNode) = 0; }
-#line 9274 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9299 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 507:
-#line 3285 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3289 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     { (yyval.interm.intermNode) = static_cast<TIntermNode*>((yyvsp[-1].interm.intermTypedNode)); }
-#line 9280 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9305 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 508:
-#line 3289 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3293 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 9288 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9313 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 509:
-#line 3292 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3296 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.handleSelectionAttributes(*(yyvsp[-1].interm.attributes), (yyvsp[0].interm.intermNode));
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 9297 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9322 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 510:
-#line 3298 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3302 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.boolCheck((yyvsp[-4].lex).loc, (yyvsp[-2].interm.intermTypedNode));
         (yyval.interm.intermNode) = parseContext.intermediate.addSelection((yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.nodePair), (yyvsp[-4].lex).loc);
     }
-#line 9306 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9331 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 511:
-#line 3305 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3309 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.nodePair).node1 = (yyvsp[-2].interm.intermNode);
         (yyval.interm.nodePair).node2 = (yyvsp[0].interm.intermNode);
     }
-#line 9315 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9340 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 512:
-#line 3309 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3313 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.nodePair).node1 = (yyvsp[0].interm.intermNode);
         (yyval.interm.nodePair).node2 = 0;
     }
-#line 9324 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9349 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 513:
-#line 3317 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3321 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
         parseContext.boolCheck((yyvsp[0].interm.intermTypedNode)->getLoc(), (yyvsp[0].interm.intermTypedNode));
     }
-#line 9333 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9358 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 514:
-#line 3321 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3325 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.boolCheck((yyvsp[-2].lex).loc, (yyvsp[-3].interm.type));
 
@@ -9344,28 +9369,28 @@ yyreduce:
         else
             (yyval.interm.intermTypedNode) = 0;
     }
-#line 9348 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9373 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 515:
-#line 3334 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3338 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 9356 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9381 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 516:
-#line 3337 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3341 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.handleSwitchAttributes(*(yyvsp[-1].interm.attributes), (yyvsp[0].interm.intermNode));
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 9365 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9390 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 517:
-#line 3343 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3347 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         // start new switch sequence on the switch stack
         ++parseContext.controlFlowNestingLevel;
@@ -9374,11 +9399,11 @@ yyreduce:
         parseContext.switchLevel.push_back(parseContext.statementNestingLevel);
         parseContext.symbolTable.push();
     }
-#line 9378 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9403 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 518:
-#line 3351 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3355 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermNode) = parseContext.addSwitch((yyvsp[-7].lex).loc, (yyvsp[-5].interm.intermTypedNode), (yyvsp[-1].interm.intermNode) ? (yyvsp[-1].interm.intermNode)->getAsAggregate() : 0);
         delete parseContext.switchSequenceStack.back();
@@ -9388,27 +9413,27 @@ yyreduce:
         --parseContext.statementNestingLevel;
         --parseContext.controlFlowNestingLevel;
     }
-#line 9392 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9417 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 519:
-#line 3363 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3367 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermNode) = 0;
     }
-#line 9400 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9425 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 520:
-#line 3366 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3370 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 9408 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9433 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 521:
-#line 3372 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3376 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermNode) = 0;
         if (parseContext.switchLevel.size() == 0)
@@ -9421,11 +9446,11 @@ yyreduce:
             (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpCase, (yyvsp[-1].interm.intermTypedNode), (yyvsp[-2].lex).loc);
         }
     }
-#line 9425 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9450 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 522:
-#line 3384 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3388 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermNode) = 0;
         if (parseContext.switchLevel.size() == 0)
@@ -9435,28 +9460,28 @@ yyreduce:
         else
             (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpDefault, (yyvsp[-1].lex).loc);
     }
-#line 9439 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9464 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 523:
-#line 3396 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3400 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 9447 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9472 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 524:
-#line 3399 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3403 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.handleLoopAttributes(*(yyvsp[-1].interm.attributes), (yyvsp[0].interm.intermNode));
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 9456 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9481 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 525:
-#line 3405 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3409 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         if (! parseContext.limits.whileLoops)
             parseContext.error((yyvsp[-1].lex).loc, "while loops not available", "limitation", "");
@@ -9465,11 +9490,11 @@ yyreduce:
         ++parseContext.statementNestingLevel;
         ++parseContext.controlFlowNestingLevel;
     }
-#line 9469 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9494 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 526:
-#line 3413 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3417 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]);
         (yyval.interm.intermNode) = parseContext.intermediate.addLoop((yyvsp[0].interm.intermNode), (yyvsp[-2].interm.intermTypedNode), 0, true, (yyvsp[-5].lex).loc);
@@ -9477,21 +9502,21 @@ yyreduce:
         --parseContext.statementNestingLevel;
         --parseContext.controlFlowNestingLevel;
     }
-#line 9481 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9506 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 527:
-#line 3420 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3424 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         ++parseContext.loopNestingLevel;
         ++parseContext.statementNestingLevel;
         ++parseContext.controlFlowNestingLevel;
     }
-#line 9491 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9516 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 528:
-#line 3425 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3429 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         if (! parseContext.limits.whileLoops)
             parseContext.error((yyvsp[-7].lex).loc, "do-while loops not available", "limitation", "");
@@ -9503,22 +9528,22 @@ yyreduce:
         --parseContext.statementNestingLevel;
         --parseContext.controlFlowNestingLevel;
     }
-#line 9507 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9532 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 529:
-#line 3436 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3440 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.symbolTable.push();
         ++parseContext.loopNestingLevel;
         ++parseContext.statementNestingLevel;
         ++parseContext.controlFlowNestingLevel;
     }
-#line 9518 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9543 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 530:
-#line 3442 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3446 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.symbolTable.pop(&parseContext.defaultPrecision[0]);
         (yyval.interm.intermNode) = parseContext.intermediate.makeAggregate((yyvsp[-3].interm.intermNode), (yyvsp[-5].lex).loc);
@@ -9531,81 +9556,81 @@ yyreduce:
         --parseContext.statementNestingLevel;
         --parseContext.controlFlowNestingLevel;
     }
-#line 9535 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9560 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 531:
-#line 3457 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3461 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 9543 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9568 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 532:
-#line 3460 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3464 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 9551 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9576 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 533:
-#line 3466 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3470 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
     }
-#line 9559 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9584 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 534:
-#line 3469 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3473 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermTypedNode) = 0;
     }
-#line 9567 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9592 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 535:
-#line 3475 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3479 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.nodePair).node1 = (yyvsp[-1].interm.intermTypedNode);
         (yyval.interm.nodePair).node2 = 0;
     }
-#line 9576 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9601 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 536:
-#line 3479 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3483 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.nodePair).node1 = (yyvsp[-2].interm.intermTypedNode);
         (yyval.interm.nodePair).node2 = (yyvsp[0].interm.intermTypedNode);
     }
-#line 9585 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9610 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 537:
-#line 3486 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3490 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         if (parseContext.loopNestingLevel <= 0)
             parseContext.error((yyvsp[-1].lex).loc, "continue statement only allowed in loops", "", "");
         (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpContinue, (yyvsp[-1].lex).loc);
     }
-#line 9595 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9620 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 538:
-#line 3491 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3495 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         if (parseContext.loopNestingLevel + parseContext.switchSequenceStack.size() <= 0)
             parseContext.error((yyvsp[-1].lex).loc, "break statement only allowed in switch and loops", "", "");
         (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpBreak, (yyvsp[-1].lex).loc);
     }
-#line 9605 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9630 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 539:
-#line 3496 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3500 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpReturn, (yyvsp[-1].lex).loc);
         if (parseContext.currentFunctionType->getBasicType() != EbtVoid)
@@ -9613,83 +9638,83 @@ yyreduce:
         if (parseContext.inMain)
             parseContext.postEntryPointReturn = true;
     }
-#line 9617 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9642 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 540:
-#line 3503 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3507 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermNode) = parseContext.handleReturnValue((yyvsp[-2].lex).loc, (yyvsp[-1].interm.intermTypedNode));
     }
-#line 9625 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9650 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 541:
-#line 3506 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3510 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.requireStage((yyvsp[-1].lex).loc, EShLangFragment, "discard");
         (yyval.interm.intermNode) = parseContext.intermediate.addBranch(EOpKill, (yyvsp[-1].lex).loc);
     }
-#line 9634 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9659 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 542:
-#line 3515 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3519 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
         parseContext.intermediate.setTreeRoot((yyval.interm.intermNode));
     }
-#line 9643 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9668 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 543:
-#line 3519 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3523 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         if ((yyvsp[0].interm.intermNode) != nullptr) {
             (yyval.interm.intermNode) = parseContext.intermediate.growAggregate((yyvsp[-1].interm.intermNode), (yyvsp[0].interm.intermNode));
             parseContext.intermediate.setTreeRoot((yyval.interm.intermNode));
         }
     }
-#line 9654 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9679 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 544:
-#line 3528 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3532 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 9662 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9687 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 545:
-#line 3531 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3535 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.intermNode) = (yyvsp[0].interm.intermNode);
     }
-#line 9670 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9695 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 546:
-#line 3534 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3538 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         parseContext.requireProfile((yyvsp[0].lex).loc, ~EEsProfile, "extraneous semicolon");
         parseContext.profileRequires((yyvsp[0].lex).loc, ~EEsProfile, 460, nullptr, "extraneous semicolon");
         (yyval.interm.intermNode) = nullptr;
     }
-#line 9680 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9705 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 547:
-#line 3542 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3546 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyvsp[0].interm).function = parseContext.handleFunctionDeclarator((yyvsp[0].interm).loc, *(yyvsp[0].interm).function, false /* not prototype */);
         (yyvsp[0].interm).intermNode = parseContext.handleFunctionDefinition((yyvsp[0].interm).loc, *(yyvsp[0].interm).function);
     }
-#line 9689 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9714 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 548:
-#line 3546 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3550 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         //   May be best done as post process phase on intermediate code
         if (parseContext.currentFunctionType->getBasicType() != EbtVoid && ! parseContext.functionReturnsValue)
@@ -9705,52 +9730,52 @@ yyreduce:
         (yyval.interm.intermNode)->getAsAggregate()->setDebug(parseContext.contextPragma.debug);
         (yyval.interm.intermNode)->getAsAggregate()->setPragmaTable(parseContext.contextPragma.pragmaTable);
     }
-#line 9709 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9734 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 549:
-#line 3564 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3568 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.attributes) = (yyvsp[-2].interm.attributes);
         parseContext.requireExtensions((yyvsp[-4].lex).loc, 1, &E_GL_EXT_control_flow_attributes, "attribute");
     }
-#line 9718 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9743 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 550:
-#line 3570 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3574 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.attributes) = (yyvsp[0].interm.attributes);
     }
-#line 9726 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9751 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 551:
-#line 3573 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3577 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.attributes) = parseContext.mergeAttributes((yyvsp[-2].interm.attributes), (yyvsp[0].interm.attributes));
     }
-#line 9734 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9759 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 552:
-#line 3578 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3582 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.attributes) = parseContext.makeAttributes(*(yyvsp[0].lex).string);
     }
-#line 9742 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9767 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
   case 553:
-#line 3581 "MachineIndependent/glslang.y" /* yacc.c:1646  */
+#line 3585 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
         (yyval.interm.attributes) = parseContext.makeAttributes(*(yyvsp[-3].lex).string, (yyvsp[-1].interm.intermTypedNode));
     }
-#line 9750 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9775 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
     break;
 
 
-#line 9754 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
+#line 9779 "MachineIndependent/glslang_tab.cpp" /* yacc.c:1646  */
       default: break;
     }
   /* User semantic actions sometimes alter yychar, and that requires
@@ -9978,5 +10003,5 @@ yyreturn:
 #endif
   return yyresult;
 }
-#line 3585 "MachineIndependent/glslang.y" /* yacc.c:1906  */
+#line 3589 "MachineIndependent/glslang.y" /* yacc.c:1906  */
 
diff --git a/glslang/MachineIndependent/glslang_tab.cpp.h b/glslang/MachineIndependent/glslang_tab.cpp.h
index 6b07aedd8da4446be7f6b2a77f50581398813c4d..63eeab0460e68adf0a4ba7e0ae7737c12626c040 100644
--- a/glslang/MachineIndependent/glslang_tab.cpp.h
+++ b/glslang/MachineIndependent/glslang_tab.cpp.h
@@ -1,8 +1,8 @@
-/* A Bison parser, made by GNU Bison 3.0.  */
+/* A Bison parser, made by GNU Bison 3.0.4.  */
 
 /* Bison interface for Yacc-like parsers in C
 
-   Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc.
+   Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -437,7 +437,7 @@ extern int yydebug;
 
 /* Value type.  */
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-typedef union YYSTYPE YYSTYPE;
+
 union YYSTYPE
 {
 #line 70 "MachineIndependent/glslang.y" /* yacc.c:1909  */
@@ -477,6 +477,8 @@ union YYSTYPE
 
 #line 479 "MachineIndependent/glslang_tab.cpp.h" /* yacc.c:1909  */
 };
+
+typedef union YYSTYPE YYSTYPE;
 # define YYSTYPE_IS_TRIVIAL 1
 # define YYSTYPE_IS_DECLARED 1
 #endif
diff --git a/glslang/MachineIndependent/iomapper.cpp b/glslang/MachineIndependent/iomapper.cpp
index a0b5a7fbaf6063fb2235b3d65aa10571fdf61fba..68172538d323d2ead6c3b3e3ef965bf9538fed56 100644
--- a/glslang/MachineIndependent/iomapper.cpp
+++ b/glslang/MachineIndependent/iomapper.cpp
@@ -431,7 +431,8 @@ struct TDefaultIoResolverBase : public glslang::TIoMapResolver
 
         // no locations added if already present, a built-in variable, a block, or an opaque
         if (type.getQualifier().hasLocation() || type.isBuiltIn() ||
-            type.getBasicType() == EbtBlock || type.containsOpaque())
+            type.getBasicType() == EbtBlock ||
+            (type.containsOpaque() && intermediate.getSpv().openGl == 0))
             return -1;
 
         // no locations on blocks of built-in variables
@@ -442,7 +443,11 @@ struct TDefaultIoResolverBase : public glslang::TIoMapResolver
                 return -1;
         }
 
-        return nextUniformLocation++;
+        int location = nextUniformLocation;
+
+        nextUniformLocation += TIntermediate::computeTypeUniformLocationSize(type);
+
+        return location;
     }
     bool validateInOut(EShLanguage /*stage*/, const char* /*name*/, const TType& /*type*/, bool /*is_live*/) override
     {
@@ -598,7 +603,7 @@ protected:
 /********************************************************************************
 The following IO resolver maps types in HLSL register space, as follows:
 
-t – for shader resource views (SRV)
+t - for shader resource views (SRV)
    TEXTURE1D
    TEXTURE1DARRAY
    TEXTURE2D
@@ -613,7 +618,7 @@ t – for shader resource views (SRV)
    BUFFER
    TBUFFER
     
-s – for samplers
+s - for samplers
    SAMPLER
    SAMPLER1D
    SAMPLER2D
@@ -622,7 +627,7 @@ s – for samplers
    SAMPLERSTATE
    SAMPLERCOMPARISONSTATE
 
-u – for unordered access views (UAV)
+u - for unordered access views (UAV)
    RWBYTEADDRESSBUFFER
    RWSTRUCTUREDBUFFER
    APPENDSTRUCTUREDBUFFER
@@ -634,7 +639,7 @@ u – for unordered access views (UAV)
    RWTEXTURE2DARRAY
    RWTEXTURE3D
 
-b – for constant buffer views (CBV)
+b - for constant buffer views (CBV)
    CBUFFER
    CONSTANTBUFFER
  ********************************************************************************/
diff --git a/glslang/MachineIndependent/linkValidate.cpp b/glslang/MachineIndependent/linkValidate.cpp
index 9aba27922c93804040e0fd19d86bf048c0a95bdb..aa9c5121bc1332f28d5e098bb7ed8ed03a771ed8 100644
--- a/glslang/MachineIndependent/linkValidate.cpp
+++ b/glslang/MachineIndependent/linkValidate.cpp
@@ -962,6 +962,36 @@ int TIntermediate::computeTypeLocationSize(const TType& type, EShLanguage stage)
     return 1;
 }
 
+// Same as computeTypeLocationSize but for uniforms
+int TIntermediate::computeTypeUniformLocationSize(const TType& type)
+{
+    // "Individual elements of a uniform array are assigned
+    // consecutive locations with the first element taking location
+    // location."
+    if (type.isArray()) {
+        // TODO: perf: this can be flattened by using getCumulativeArraySize(), and a deref that discards all arrayness
+        TType elementType(type, 0);
+        if (type.isImplicitlySizedArray()) {
+            // TODO: are there valid cases of having an implicitly-sized array with a location?  If so, running this code too early.
+            return computeTypeUniformLocationSize(elementType);
+        } else
+            return type.getOuterArraySize() * computeTypeUniformLocationSize(elementType);
+    }
+
+    // "Each subsequent inner-most member or element gets incremental
+    // locations for the entire structure or array."
+    if (type.isStruct()) {
+        int size = 0;
+        for (int member = 0; member < (int)type.getStruct()->size(); ++member) {
+            TType memberType(type, member);
+            size += computeTypeUniformLocationSize(memberType);
+        }
+        return size;
+    }
+
+    return 1;
+}
+
 // Accumulate xfb buffer ranges and check for collisions as the accumulation is done.
 //
 // Returns < 0 if no collision, >= 0 if collision and the value returned is a colliding value.
diff --git a/glslang/MachineIndependent/localintermediate.h b/glslang/MachineIndependent/localintermediate.h
index 8458e9906959f584de1242f32668ab6c86d14a57..d6f13ae4ed49b4c2ad56997ff9149381e0c69c38 100644
--- a/glslang/MachineIndependent/localintermediate.h
+++ b/glslang/MachineIndependent/localintermediate.h
@@ -210,7 +210,7 @@ class TVariable;
 class TIntermediate {
 public:
     explicit TIntermediate(EShLanguage l, int v = 0, EProfile p = ENoProfile) :
-        implicitThisName("@this"),
+        implicitThisName("@this"), implicitCounterName("@count"),
         language(l), source(EShSourceNone), profile(p), version(v), treeRoot(0),
         numEntryPoints(0), numErrors(0), numPushConstants(0), recursive(false),
         invocations(TQualifier::layoutNotSet), vertices(TQualifier::layoutNotSet),
@@ -218,6 +218,7 @@ public:
         pixelCenterInteger(false), originUpperLeft(false),
         vertexSpacing(EvsNone), vertexOrder(EvoNone), pointMode(false), earlyFragmentTests(false),
         postDepthCoverage(false), depthLayout(EldNone), depthReplacing(false),
+        hlslFunctionality1(false),
         blendEquations(0), xfbMode(false), multiStream(false),
 #ifdef NV_EXTENSIONS
         layoutOverrideCoverage(false),
@@ -362,6 +363,13 @@ public:
     }
     bool usingHlslIoMapping() { return hlslIoMapping; }
 
+    template<class T> T addCounterBufferName(const T& name) const { return name + implicitCounterName; }
+    bool hasCounterBufferName(const TString& name) const {
+        size_t len = strlen(implicitCounterName);
+        return name.size() > len &&
+               name.compare(name.size() - len, len, implicitCounterName) == 0;
+    }
+
     void setTextureSamplerTransformMode(EShTextureSamplerTransformMode mode) { textureSamplerTransformMode = mode; }
 
     void setVersion(int v) { version = v; }
@@ -459,9 +467,6 @@ public:
     TIntermUnary* addUnaryNode(TOperator op, TIntermTyped* child, TSourceLoc) const;
     TIntermUnary* addUnaryNode(TOperator op, TIntermTyped* child, TSourceLoc, const TType&) const;
 
-    // Add conversion from node's type to given basic type.
-    TIntermTyped* convertToBasicType(TOperator op, TBasicType basicType, TIntermTyped* node) const;
-
     // Constant folding (in Constant.cpp)
     TIntermTyped* fold(TIntermAggregate* aggrNode);
     TIntermTyped* foldConstructor(TIntermAggregate* aggrNode);
@@ -567,6 +572,9 @@ public:
     void setDepthReplacing() { depthReplacing = true; }
     bool isDepthReplacing() const { return depthReplacing; }
 
+    void setHlslFunctionality1() { hlslFunctionality1 = true; }
+    bool getHlslFunctionality1() const { return hlslFunctionality1; }
+
     void addBlendEquation(TBlendEquationShift b) { blendEquations |= (1 << b); }
     unsigned int getBlendEquations() const { return blendEquations; }
 
@@ -582,6 +590,7 @@ public:
     int addUsedOffsets(int binding, int offset, int numOffsets);
     bool addUsedConstantId(int id);
     static int computeTypeLocationSize(const TType&, EShLanguage);
+    static int computeTypeUniformLocationSize(const TType&);
 
     bool setXfbBufferStride(int buffer, unsigned stride)
     {
@@ -626,6 +635,7 @@ public:
     bool needsLegalization() const { return needToLegalize; }
 
     const char* const implicitThisName;
+    const char* const implicitCounterName;
 
 protected:
     TIntermSymbol* addSymbol(int Id, const TString&, const TType&, const TConstUnionArray&, TIntermTyped* subtree, const TSourceLoc&);
@@ -685,6 +695,7 @@ protected:
     bool postDepthCoverage;
     TLayoutDepth depthLayout;
     bool depthReplacing;
+    bool hlslFunctionality1;
     int blendEquations;        // an 'or'ing of masks of shifts of TBlendEquationShift
     bool xfbMode;
     bool multiStream;
diff --git a/glslang/MachineIndependent/preprocessor/PpScanner.cpp b/glslang/MachineIndependent/preprocessor/PpScanner.cpp
index 13e9c1d825759585f1b3681fccdf090b9196514b..f4eaf57d3527043c5d2b871312c7cfa12aafdc90 100644
--- a/glslang/MachineIndependent/preprocessor/PpScanner.cpp
+++ b/glslang/MachineIndependent/preprocessor/PpScanner.cpp
@@ -118,7 +118,7 @@ int TPpContext::lFloatConst(int len, int ch, TPpToken* ppToken)
         ch = getChar();
 
         // 1.#INF or -1.#INF
-        if (parseContext.intermediate.getSource() == EShSourceHlsl && ch == '#') {
+        if (ch == '#' && (ifdepth > 0 || parseContext.intermediate.getSource() == EShSourceHlsl)) {
             if ((len <  2) ||
                 (len == 2 && ppToken->name[0] != '1') ||
                 (len == 3 && ppToken->name[1] != '1' && !(ppToken->name[0] == '-' || ppToken->name[0] == '+')) ||
@@ -174,22 +174,28 @@ int TPpContext::lFloatConst(int len, int ch, TPpToken* ppToken)
     // Suffix:
     bool isFloat16 = false;
     if (ch == 'l' || ch == 'L') {
-        parseContext.doubleCheck(ppToken->loc, "double floating-point suffix");
-        if (! HasDecimalOrExponent)
+        if (ifdepth == 0 && parseContext.intermediate.getSource() == EShSourceGlsl)
+            parseContext.doubleCheck(ppToken->loc, "double floating-point suffix");
+        if (ifdepth == 0 && !HasDecimalOrExponent)
             parseContext.ppError(ppToken->loc, "float literal needs a decimal point or exponent", "", "");
-        int ch2 = getChar();
-        if (ch2 != 'f' && ch2 != 'F') {
-            ungetChar();
-            ungetChar();
-        } else {
+        if (parseContext.intermediate.getSource() == EShSourceGlsl) {
+            int ch2 = getChar();
+            if (ch2 != 'f' && ch2 != 'F') {
+                ungetChar();
+                ungetChar();
+            } else {
+                saveName(ch);
+                saveName(ch2);
+                isDouble = 1;
+            }
+        } else if (parseContext.intermediate.getSource() == EShSourceHlsl) {
             saveName(ch);
-            saveName(ch2);
             isDouble = 1;
         }
     } else if (ch == 'h' || ch == 'H') {
-        if (parseContext.intermediate.getSource() == EShSourceGlsl)
+        if (ifdepth == 0 && parseContext.intermediate.getSource() == EShSourceGlsl)
             parseContext.float16Check(ppToken->loc, "half floating-point suffix");
-        if (!HasDecimalOrExponent)
+        if (ifdepth == 0 && !HasDecimalOrExponent)
             parseContext.ppError(ppToken->loc, "float literal needs a decimal point or exponent", "", "");
         if (parseContext.intermediate.getSource() == EShSourceGlsl) {
             int ch2 = getChar();
@@ -201,15 +207,16 @@ int TPpContext::lFloatConst(int len, int ch, TPpToken* ppToken)
                 saveName(ch2);
                 isFloat16 = true;
             }
-        } else {
+        } else if (parseContext.intermediate.getSource() == EShSourceHlsl) {
             saveName(ch);
-            isFloat16 = false;
+            isFloat16 = true;
         }
     } else if (ch == 'f' || ch == 'F') {
-        parseContext.profileRequires(ppToken->loc,  EEsProfile, 300, nullptr, "floating-point suffix");
-        if (! parseContext.relaxedErrors())
+        if (ifdepth == 0)
+            parseContext.profileRequires(ppToken->loc,  EEsProfile, 300, nullptr, "floating-point suffix");
+        if (ifdepth == 0 && !parseContext.relaxedErrors())
             parseContext.profileRequires(ppToken->loc, ~EEsProfile, 120, nullptr, "floating-point suffix");
-        if (! HasDecimalOrExponent)
+        if (ifdepth == 0 && !HasDecimalOrExponent)
             parseContext.ppError(ppToken->loc, "float literal needs a decimal point or exponent", "", "");
         saveName(ch);
     } else
@@ -477,18 +484,22 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken)
                 ppToken->name[len] = '\0';
 
                 if (isInt64 && pp->parseContext.intermediate.getSource() == EShSourceGlsl) {
-                    pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile,
+                    if (pp->ifdepth == 0) {
+                        pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile,
                                                         "64-bit hexadecimal literal");
-                    pp->parseContext.profileRequires(ppToken->loc, ~EEsProfile, 0,
-                        Num_Int64_Extensions, Int64_Extensions, "64-bit hexadecimal literal");
+                        pp->parseContext.profileRequires(ppToken->loc, ~EEsProfile, 0,
+                            Num_Int64_Extensions, Int64_Extensions, "64-bit hexadecimal literal");
+                    }
                     ppToken->i64val = ival;
                     return isUnsigned ? PpAtomConstUint64 : PpAtomConstInt64;
                 } else if (isInt16) {
-                    if (pp->parseContext.intermediate.getSource() == EShSourceGlsl) {
-                        pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile,
-                                                         "16-bit hexadecimal literal");
-                        pp->parseContext.profileRequires(ppToken->loc, ~EEsProfile, 0,
-                            Num_Int16_Extensions, Int16_Extensions, "16-bit hexadecimal literal");
+                    if (pp->ifdepth == 0) {
+                        if (pp->parseContext.intermediate.getSource() == EShSourceGlsl) {
+                            pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile,
+                                                             "16-bit hexadecimal literal");
+                            pp->parseContext.profileRequires(ppToken->loc, ~EEsProfile, 0,
+                                Num_Int16_Extensions, Int16_Extensions, "16-bit hexadecimal literal");
+                        }
                     }
                     ppToken->ival = (int)ival;
                     return isUnsigned ? PpAtomConstUint16 : PpAtomConstInt16;
@@ -589,18 +600,22 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken)
                     pp->parseContext.ppError(ppToken->loc, "octal literal too big", "", "");
 
                 if (isInt64 && pp->parseContext.intermediate.getSource() == EShSourceGlsl) {
-                    pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile,
+                    if (pp->ifdepth == 0) {
+                        pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile,
                                                         "64-bit octal literal");
-                    pp->parseContext.profileRequires(ppToken->loc, ~EEsProfile, 0,
-                        Num_Int64_Extensions, Int64_Extensions, "64-bit octal literal");
+                        pp->parseContext.profileRequires(ppToken->loc, ~EEsProfile, 0,
+                            Num_Int64_Extensions, Int64_Extensions, "64-bit octal literal");
+                    }
                     ppToken->i64val = ival;
                     return isUnsigned ? PpAtomConstUint64 : PpAtomConstInt64;
                 } else if (isInt16) {
-                    if (pp->parseContext.intermediate.getSource() == EShSourceGlsl) {
-                        pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile,
-                                                         "16-bit octal literal");
-                        pp->parseContext.profileRequires(ppToken->loc, ~EEsProfile, 0,
-                            Num_Int16_Extensions, Int16_Extensions, "16-bit octal literal");
+                    if (pp->ifdepth == 0) {
+                        if (pp->parseContext.intermediate.getSource() == EShSourceGlsl) {
+                            pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile,
+                                                            "16-bit octal literal");
+                            pp->parseContext.profileRequires(ppToken->loc, ~EEsProfile, 0,
+                                Num_Int16_Extensions, Int16_Extensions, "16-bit octal literal");
+                        }
                     }
                     ppToken->ival = (int)ival;
                     return isUnsigned ? PpAtomConstUint16 : PpAtomConstInt16;
@@ -694,16 +709,18 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken)
                 }
 
                 if (isInt64 && pp->parseContext.intermediate.getSource() == EShSourceGlsl) {
-                    pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile,
+                    if (pp->ifdepth == 0) {
+                        pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile,
                                                         "64-bit literal");
-                    pp->parseContext.profileRequires(ppToken->loc, ~EEsProfile, 0,
-                        Num_Int64_Extensions, Int64_Extensions, "64-bit literal");
+                        pp->parseContext.profileRequires(ppToken->loc, ~EEsProfile, 0,
+                            Num_Int64_Extensions, Int64_Extensions, "64-bit literal");
+                    }
                     ppToken->i64val = ival;
                     return isUnsigned ? PpAtomConstUint64 : PpAtomConstInt64;
                 } else if (isInt16) {
-                    if (pp->parseContext.intermediate.getSource() == EShSourceGlsl) {
+                    if (pp->ifdepth == 0 && pp->parseContext.intermediate.getSource() == EShSourceGlsl) {
                         pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile,
-                                                         "16-bit  literal");
+                                                        "16-bit  literal");
                         pp->parseContext.profileRequires(ppToken->loc, ~EEsProfile, 0,
                             Num_Int16_Extensions, Int16_Extensions, "16-bit literal");
                     }
@@ -966,7 +983,7 @@ int TPpContext::tokenize(TPpToken& ppToken)
                 continue;
             break;
         case PpAtomConstString:
-            if (parseContext.intermediate.getSource() != EShSourceHlsl) {
+            if (ifdepth == 0 && parseContext.intermediate.getSource() != EShSourceHlsl) {
                 // HLSL allows string literals.
                 parseContext.ppError(ppToken.loc, "string literals not supported", "\"\"", "");
                 continue;
diff --git a/glslang/MachineIndependent/reflection.cpp b/glslang/MachineIndependent/reflection.cpp
index 62506313cee62139d83a6d28a2166fcc3301e74a..4818b10832067005551414e3bba65356959ba4e4 100644
--- a/glslang/MachineIndependent/reflection.cpp
+++ b/glslang/MachineIndependent/reflection.cpp
@@ -766,11 +766,11 @@ void TReflection::buildAttributeReflection(EShLanguage stage, const TIntermediat
 }
 
 // build counter block index associations for buffers
-void TReflection::buildCounterIndices()
+void TReflection::buildCounterIndices(const TIntermediate& intermediate)
 {
     // search for ones that have counters
     for (int i = 0; i < int(indexToUniformBlock.size()); ++i) {
-        const TString counterName(indexToUniformBlock[i].name + "@count");
+        const TString counterName(intermediate.addCounterBufferName(indexToUniformBlock[i].name));
         const int index = getIndex(counterName);
 
         if (index >= 0)
@@ -802,7 +802,7 @@ bool TReflection::addStage(EShLanguage stage, const TIntermediate& intermediate)
         function->traverse(&it);
     }
 
-    buildCounterIndices();
+    buildCounterIndices(intermediate);
 
     return true;
 }
diff --git a/glslang/MachineIndependent/reflection.h b/glslang/MachineIndependent/reflection.h
index fedfbe8d4a0592d9a9f2f26c780ca0fb3d90620d..bf233e33eb662c4c257fe16925610594cf30506d 100644
--- a/glslang/MachineIndependent/reflection.h
+++ b/glslang/MachineIndependent/reflection.h
@@ -156,7 +156,7 @@ public:
 protected:
     friend class glslang::TReflectionTraverser;
 
-    void buildCounterIndices();
+    void buildCounterIndices(const TIntermediate&);
     void buildAttributeReflection(EShLanguage, const TIntermediate&);
 
     // Need a TString hash: typedef std::unordered_map<TString, int> TNameToIndex;
diff --git a/glslang/Public/ShaderLang.h b/glslang/Public/ShaderLang.h
index 67cb3baaad0bc0540386e960fd4efc43ce8608a7..ef6c07458d8f70c3de0efd251de017d097cf37b3 100644
--- a/glslang/Public/ShaderLang.h
+++ b/glslang/Public/ShaderLang.h
@@ -70,7 +70,7 @@
 // This should always increase, as some paths to do not consume
 // a more major number.
 // It should increment by one when new functionality is added.
-#define GLSLANG_MINOR_VERSION 3
+#define GLSLANG_MINOR_VERSION 5
 
 //
 // Call before doing any other compiler/linker operations.
@@ -132,7 +132,9 @@ typedef enum {
     EShTargetVulkan_1_0 = (1 << 22),
     EShTargetVulkan_1_1 = (1 << 22) | (1 << 12),
     EShTargetOpenGL_450 = 450,
-} EshTargetClientVersion;
+} EShTargetClientVersion;
+
+typedef EShTargetClientVersion EshTargetClientVersion;
 
 typedef enum {
     EShTargetSpv_1_0 = (1 << 16),
@@ -148,12 +150,13 @@ struct TInputLanguage {
 
 struct TClient {
     EShClient client;
-    EshTargetClientVersion version;   // version of client itself (not the client's input dialect)
+    EShTargetClientVersion version;   // version of client itself (not the client's input dialect)
 };
 
 struct TTarget {
     EShTargetLanguage language;
     EShTargetLanguageVersion version; // version to target, if SPIR-V, defined by "word 1" of the SPIR-V header
+    bool hlslFunctionality1;          // can target hlsl_functionality1 extension(s)
 };
 
 // All source/client/target versions and settings.
@@ -410,7 +413,7 @@ public:
         environment.input.dialect = client;
         environment.input.dialectVersion = version;
     }
-    void setEnvClient(EShClient client, EshTargetClientVersion version)
+    void setEnvClient(EShClient client, EShTargetClientVersion version)
     {
         environment.client.client = client;
         environment.client.version = version;
@@ -420,6 +423,8 @@ public:
         environment.target.language = lang;
         environment.target.version = version;
     }
+    void setEnvTargetHlslFunctionality1() { environment.target.hlslFunctionality1 = true; }
+    bool getEnvTargetHlslFunctionality1() const { return environment.target.hlslFunctionality1; }
 
     // Interface to #include handlers.
     //
diff --git a/gtests/AST.FromFile.cpp b/gtests/AST.FromFile.cpp
index 825e4dd272a50f64e9ee5863b95e5af3b734da60..061c86c305de8f0273f1cb8c9e16574e41ed8cb1 100644
--- a/gtests/AST.FromFile.cpp
+++ b/gtests/AST.FromFile.cpp
@@ -41,6 +41,10 @@ namespace {
 
 using CompileToAstTest = GlslangTest<::testing::TestWithParam<std::string>>;
 
+#ifdef NV_EXTENSIONS
+using CompileToAstTestNV = GlslangTest<::testing::TestWithParam<std::string>>;
+#endif
+
 TEST_P(CompileToAstTest, FromFile)
 {
     loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
@@ -48,6 +52,16 @@ TEST_P(CompileToAstTest, FromFile)
                             Target::AST);
 }
 
+#ifdef NV_EXTENSIONS
+// Compiling GLSL to SPIR-V under OpenGL semantics (NV extensions enabled).
+TEST_P(CompileToAstTestNV, FromFile)
+{
+    loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
+                            Source::GLSL, Semantics::OpenGL, glslang::EShTargetVulkan_1_0,
+                            Target::AST);
+}
+#endif
+
 // clang-format off
 INSTANTIATE_TEST_CASE_P(
     Glsl, CompileToAstTest,
@@ -85,6 +99,7 @@ INSTANTIATE_TEST_CASE_P(
         "cppComplexExpr.vert",
         "cppDeepNest.frag",
         "cppPassMacroName.frag",
+        "cppRelaxSkipTokensErrors.vert",
         "badChars.frag",
         "pointCoord.frag",
         "array.frag",
@@ -214,6 +229,16 @@ INSTANTIATE_TEST_CASE_P(
     })),
     FileNameAsCustomTestSuffix
 );
+
+#ifdef NV_EXTENSIONS
+INSTANTIATE_TEST_CASE_P(
+    Glsl, CompileToAstTestNV,
+    ::testing::ValuesIn(std::vector<std::string>({
+        "nvShaderNoperspectiveInterpolation.frag",
+    })),
+    FileNameAsCustomTestSuffix
+);
+#endif
 // clang-format on
 
 }  // anonymous namespace
diff --git a/gtests/Spv.FromFile.cpp b/gtests/Spv.FromFile.cpp
index 20ef2d72d0fb2cf60c8f34ae3230c5f8a3f6f3b3..5d4e620b855684e80125e79d1de26835924d5dcf 100644
--- a/gtests/Spv.FromFile.cpp
+++ b/gtests/Spv.FromFile.cpp
@@ -171,7 +171,7 @@ TEST_P(CompileVulkanToSpirvTestAMD, FromFile)
 #endif
 
 #ifdef NV_EXTENSIONS
-// Compiling GLSL to SPIR-V under Vulkan semantics (AMD extensions enabled).
+// Compiling GLSL to SPIR-V under Vulkan semantics (NV extensions enabled).
 // Expected to successfully generate SPIR-V.
 TEST_P(CompileVulkanToSpirvTestNV, FromFile)
 {
@@ -416,6 +416,7 @@ INSTANTIATE_TEST_CASE_P(
         "spv.460.comp",
         "spv.atomic.comp",
         "spv.glFragColor.frag",
+        "spv.rankShift.comp",
         "spv.specConst.vert",
         "spv.OVR_multiview.vert",
     })),
diff --git a/gtests/TestFixture.h b/gtests/TestFixture.h
index 5af96d97baad092b0526f0e7f6204abf608354c3..0e984d4e56f1100c6e64e10214a5b47c3a1f7935 100644
--- a/gtests/TestFixture.h
+++ b/gtests/TestFixture.h
@@ -197,7 +197,7 @@ public:
     GlslangResult compileAndLink(
             const std::string shaderName, const std::string& code,
             const std::string& entryPointName, EShMessages controls,
-            glslang::EshTargetClientVersion clientTargetVersion,
+            glslang::EShTargetClientVersion clientTargetVersion,
             bool flattenUniformArrays = false,
             EShTextureSamplerTransformMode texSampTransMode = EShTexSampTransKeep,
             bool disableOptimizer = true,
@@ -407,7 +407,7 @@ public:
                                  const std::string& testName,
                                  Source source,
                                  Semantics semantics,
-                                 glslang::EshTargetClientVersion clientTargetVersion,
+                                 glslang::EShTargetClientVersion clientTargetVersion,
                                  Target target,
                                  bool automap = true,
                                  const std::string& entryPointName="",
diff --git a/hlsl/hlslGrammar.cpp b/hlsl/hlslGrammar.cpp
index 38a6116620f7a8fdfbf0227772b5d7b5d0337114..24ba489817e3513601f7567950a0e256ffe68561 100755
--- a/hlsl/hlslGrammar.cpp
+++ b/hlsl/hlslGrammar.cpp
@@ -3283,6 +3283,9 @@ bool HlslGrammar::acceptLiteral(TIntermTyped*& node)
     case EHTokUintConstant:
         node = intermediate.addConstantUnion(token.u, token.loc, true);
         break;
+    case EHTokFloat16Constant:
+        node = intermediate.addConstantUnion(token.d, EbtFloat16, token.loc, true);
+        break;
     case EHTokFloatConstant:
         node = intermediate.addConstantUnion(token.d, EbtFloat, token.loc, true);
         break;
diff --git a/hlsl/hlslParseHelper.cpp b/hlsl/hlslParseHelper.cpp
index 73bda6d644f01e2df91a1f7ee208de9e387d2963..6fafbefa357bea178998909de61e80bd27114691 100755
--- a/hlsl/hlslParseHelper.cpp
+++ b/hlsl/hlslParseHelper.cpp
@@ -65,10 +65,10 @@ HlslParseContext::HlslParseContext(TSymbolTable& symbolTable, TIntermediate& int
     entryPointFunction(nullptr),
     entryPointFunctionBody(nullptr),
     gsStreamOutput(nullptr),
-    clipDistanceInput(nullptr),
-    cullDistanceInput(nullptr),
     clipDistanceOutput(nullptr),
-    cullDistanceOutput(nullptr)
+    cullDistanceOutput(nullptr),
+    clipDistanceInput(nullptr),
+    cullDistanceInput(nullptr)
 {
     globalUniformDefaults.clear();
     globalUniformDefaults.layoutMatrix = ElmRowMajor;
@@ -1608,7 +1608,7 @@ void HlslParseContext::addStructBufferHiddenCounterParam(const TSourceLoc& loc,
     if (! hasStructBuffCounter(*param.type))
         return;
 
-    const TString counterBlockName(getStructBuffCounterName(*param.name));
+    const TString counterBlockName(intermediate.addCounterBufferName(*param.name));
 
     TType counterType;
     counterBufferType(loc, counterType);
@@ -3163,7 +3163,7 @@ void HlslParseContext::counterBufferType(const TSourceLoc& loc, TType& type)
 {
     // Counter type
     TType* counterType = new TType(EbtInt, EvqBuffer);
-    counterType->setFieldName("@count");
+    counterType->setFieldName(intermediate.implicitCounterName);
 
     TTypeList* blockStruct = new TTypeList;
     TTypeLoc  member = { counterType, loc };
@@ -3176,12 +3176,6 @@ void HlslParseContext::counterBufferType(const TSourceLoc& loc, TType& type)
     shareStructBufferType(type);
 }
 
-// knowledge of how to construct block name, in one place instead of N places.
-TString HlslParseContext::getStructBuffCounterName(const TString& blockName) const
-{
-    return blockName + "@count";
-}
-
 // declare counter for a structured buffer type
 void HlslParseContext::declareStructBufferCounter(const TSourceLoc& loc, const TType& bufferType, const TString& name)
 {
@@ -3195,9 +3189,9 @@ void HlslParseContext::declareStructBufferCounter(const TSourceLoc& loc, const T
     TType blockType;
     counterBufferType(loc, blockType);
 
-    TString* blockName = new TString(getStructBuffCounterName(name));
+    TString* blockName = new TString(intermediate.addCounterBufferName(name));
 
-    // Counter buffer does not have its own counter buffer.  TODO: there should be a better way to track this.
+    // Counter buffer is not yet in use
     structBufferCounter[*blockName] = false;
 
     shareStructBufferType(blockType);
@@ -3211,7 +3205,7 @@ TIntermTyped* HlslParseContext::getStructBufferCounter(const TSourceLoc& loc, TI
     if (buffer == nullptr || ! isStructBufferType(buffer->getType()))
         return nullptr;
 
-    const TString counterBlockName(getStructBuffCounterName(buffer->getAsSymbolNode()->getName()));
+    const TString counterBlockName(intermediate.addCounterBufferName(buffer->getAsSymbolNode()->getName()));
 
     // Mark the counter as being used
     structBufferCounter[counterBlockName] = true;
@@ -3224,7 +3218,6 @@ TIntermTyped* HlslParseContext::getStructBufferCounter(const TSourceLoc& loc, TI
     return counterMember;
 }
 
-
 //
 // Decompose structure buffer methods into AST
 //
@@ -5743,12 +5736,11 @@ void HlslParseContext::addStructBuffArguments(const TSourceLoc& loc, TIntermAggr
                 TType counterType;
                 counterBufferType(loc, counterType);
 
-                const TString counterBlockName(getStructBuffCounterName(blockSym->getName()));
+                const TString counterBlockName(intermediate.addCounterBufferName(blockSym->getName()));
 
                 TVariable* variable = makeInternalVariable(counterBlockName, counterType);
 
-                // Mark this buffer as requiring a counter block.  TODO: there should be a better
-                // way to track it.
+                // Mark this buffer's counter block as being in use
                 structBufferCounter[counterBlockName] = true;
 
                 TIntermSymbol* sym = intermediate.addSymbol(*variable, loc);
@@ -8320,6 +8312,22 @@ TIntermTyped* HlslParseContext::constructBuiltIn(const TType& type, TOperator op
     // First, convert types as needed.
     //
     switch (op) {
+    case EOpConstructF16Vec2:
+    case EOpConstructF16Vec3:
+    case EOpConstructF16Vec4:
+    case EOpConstructF16Mat2x2:
+    case EOpConstructF16Mat2x3:
+    case EOpConstructF16Mat2x4:
+    case EOpConstructF16Mat3x2:
+    case EOpConstructF16Mat3x3:
+    case EOpConstructF16Mat3x4:
+    case EOpConstructF16Mat4x2:
+    case EOpConstructF16Mat4x3:
+    case EOpConstructF16Mat4x4:
+    case EOpConstructFloat16:
+        basicOp = EOpConstructFloat16;
+        break;
+
     case EOpConstructVec2:
     case EOpConstructVec3:
     case EOpConstructVec4:
@@ -8352,6 +8360,13 @@ TIntermTyped* HlslParseContext::constructBuiltIn(const TType& type, TOperator op
         basicOp = EOpConstructDouble;
         break;
 
+    case EOpConstructI16Vec2:
+    case EOpConstructI16Vec3:
+    case EOpConstructI16Vec4:
+    case EOpConstructInt16:
+        basicOp = EOpConstructInt16;
+        break;
+
     case EOpConstructIVec2:
     case EOpConstructIVec3:
     case EOpConstructIVec4:
@@ -8368,6 +8383,13 @@ TIntermTyped* HlslParseContext::constructBuiltIn(const TType& type, TOperator op
         basicOp = EOpConstructInt;
         break;
 
+    case EOpConstructU16Vec2:
+    case EOpConstructU16Vec3:
+    case EOpConstructU16Vec4:
+    case EOpConstructUint16:
+        basicOp = EOpConstructUint16;
+        break;
+
     case EOpConstructUVec2:
     case EOpConstructUVec3:
     case EOpConstructUVec4:
@@ -9914,7 +9936,8 @@ void HlslParseContext::addPatchConstantInvocation()
 }
 
 // Finalization step: remove unused buffer blocks from linkage (we don't know until the
-// shader is entirely compiled)
+// shader is entirely compiled).
+// Preserve order of remaining symbols.
 void HlslParseContext::removeUnusedStructBufferCounters()
 {
     const auto endIt = std::remove_if(linkageSymbols.begin(), linkageSymbols.end(),
diff --git a/hlsl/hlslParseHelper.h b/hlsl/hlslParseHelper.h
index d85bdfa22b71f1c74564a9939ac4a7ade24fd02a..c3efb5f507b18fffb7e3ec7af52e9dc85db9100b 100755
--- a/hlsl/hlslParseHelper.h
+++ b/hlsl/hlslParseHelper.h
@@ -405,7 +405,7 @@ protected:
     // may fit in TSampler::structReturnIndex.
     TVector<TTypeList*> textureReturnStruct;
     
-    TMap<TString, bool> structBufferCounter;
+    TMap<TString, bool> structBufferCounter;  // true if counter buffer is in use
 
     // The built-in interstage IO map considers e.g, EvqPosition on input and output separately, so that we
     // can build the linkage correctly if position appears on both sides.  Otherwise, multiple positions
diff --git a/hlsl/hlslScanContext.cpp b/hlsl/hlslScanContext.cpp
index 06f767564fea296043e664aa3f002b2b3834d145..28a66bb47d2a65f711373f1b07d53556d5c70fac 100755
--- a/hlsl/hlslScanContext.cpp
+++ b/hlsl/hlslScanContext.cpp
@@ -550,6 +550,7 @@ EHlslTokenClass HlslScanContext::tokenizeClass(HlslToken& token)
 
         case PpAtomConstInt:           parserToken->i = ppToken.ival;       return EHTokIntConstant;
         case PpAtomConstUint:          parserToken->i = ppToken.ival;       return EHTokUintConstant;
+        case PpAtomConstFloat16:       parserToken->d = ppToken.dval;       return EHTokFloat16Constant;
         case PpAtomConstFloat:         parserToken->d = ppToken.dval;       return EHTokFloatConstant;
         case PpAtomConstDouble:        parserToken->d = ppToken.dval;       return EHTokDoubleConstant;
         case PpAtomIdentifier:
diff --git a/hlsl/hlslTokens.h b/hlsl/hlslTokens.h
index 9354ad9250db6bf849f2d6bab348c7f21715767a..4426bccecb5c66302b946c391bd350a21baef023 100755
--- a/hlsl/hlslTokens.h
+++ b/hlsl/hlslTokens.h
@@ -298,6 +298,7 @@ enum EHlslTokenClass {
     EHTokConstantBuffer,
 
     // constant
+    EHTokFloat16Constant,
     EHTokFloatConstant,
     EHTokDoubleConstant,
     EHTokIntConstant,
diff --git a/known_good.json b/known_good.json
index 6ab996828742e3e935829d18b3e9cef3ba71d958..1e3bbde5e0b0e434e985987acd730c24636d7559 100644
--- a/known_good.json
+++ b/known_good.json
@@ -12,7 +12,7 @@
       "site" : "github",
       "subrepo" : "KhronosGroup/SPIRV-Headers",
       "subdir" : "External/spirv-tools/external/spirv-headers",
-      "commit" : "ce309203d7eceaf908bea8862c27f3e0749f7d00"
+      "commit" : "02ffc719aa9f9c1dce5ce05743fb1afe6cbf17ea"
     }
   ]
 }