Merge master branch from upstream
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2301362..ef8bf35 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,6 +1,6 @@
 cmake_minimum_required(VERSION 2.8)
 
-set(CMAKE_INSTALL_PREFIX "install" CACHE STRING "prefix" FORCE)
+set(CMAKE_INSTALL_PREFIX "install" CACHE STRING "prefix")
 
 project(glslang)
 
diff --git a/Install/Linux/README.txt b/Install/Linux/README.txt
deleted file mode 100644
index aefc9fd..0000000
--- a/Install/Linux/README.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-This directory contains a Linux binary for the glslang validator.
-
-Installation: The executable in this directory is self sufficient, and can be 
-placed where desired; in a test directory, or in a system path, etc.
-
-Usage:  Execute glslangValidator with no arguments to get a usage statement.
diff --git a/Install/Linux/glslangValidator b/Install/Linux/glslangValidator
deleted file mode 100755
index a7640f3..0000000
--- a/Install/Linux/glslangValidator
+++ /dev/null
Binary files differ
diff --git a/Install/Linux/install b/Install/Linux/install
deleted file mode 100755
index a2d0ea2..0000000
--- a/Install/Linux/install
+++ /dev/null
@@ -1 +0,0 @@
-sudo cp glslangValidator /usr/local/bin
diff --git a/Install/Windows/README.txt b/Install/Windows/README.txt
deleted file mode 100644
index bde97b9..0000000
--- a/Install/Windows/README.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-This directory contains a Windows binary for the glslang validator.
-
-Installation: The executable in this directory is self sufficient, and can be 
-placed where desired; in a test directory, or in a system path, etc.
-
-Usage:  Execute glslangValidator with no arguments to get a usage statement.
diff --git a/Install/Windows/glslangValidator.exe b/Install/Windows/glslangValidator.exe
deleted file mode 100755
index e6b4ac2..0000000
--- a/Install/Windows/glslangValidator.exe
+++ /dev/null
Binary files differ
diff --git a/README.md b/README.md
index ce00471..59dafa8 100644
--- a/README.md
+++ b/README.md
@@ -25,8 +25,6 @@
 Execution of Standalone Wrapper
 -------------------------------
 
-There are binaries in the `Install/Windows` and `Install/Linux` directories.
-
 To use the standalone binary form, execute `glslangValidator`, and it will print
 a usage statement.  Basic operation is to give it a file containing a shader,
 and it will print out warnings/errors and optionally an AST.
@@ -109,16 +107,24 @@
 Testing
 -------
 
+Test results should always be included with a pull request that modifies
+functionality. There is a simple process for doing this, described here:
+
 `Test` is an active test directory that contains test input and a
 subdirectory `baseResults` that contains the expected results of the
 tests.  Both the tests and `baseResults` are under source-code control.
 Executing the script `./runtests` will generate current results in
 the `localResults` directory and `diff` them against the `baseResults`.
-When you want to update the tracked test results, they need to be
-copied from `localResults` to `baseResults`.
 
-There are some tests borrowed from LunarGLASS.  If LunarGLASS is
-missing, those tests just won't run.
+When you want to update the tracked test results, they need to be
+copied from `localResults` to `baseResults`.  This can be done by
+the `bump` shell script.
+
+The list of files tested comes from `testlist`, and lists input shaders
+in this directory, which must all be public for this to work.  However,
+you can add your own private list of tests, not tracked here, by using
+`localtestlist` to list non-tracked tests.  This is automatically read
+by `runtests` and included in the `diff` and `bump` process.
 
 Basic Internal Operation
 ------------------------
diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp
index baa6dea..fe3134f 100755
--- a/SPIRV/GlslangToSpv.cpp
+++ b/SPIRV/GlslangToSpv.cpp
@@ -88,6 +88,10 @@
     spv::Id createSpvVariable(const glslang::TIntermSymbol*);
     spv::Id getSampledType(const glslang::TSampler&);
     spv::Id convertGlslangToSpvType(const glslang::TType& type);
+    spv::Id convertGlslangToSpvType(const glslang::TType& type, bool explicitLayout);
+    bool requiresExplicitLayout(const glslang::TType& type) const;
+    int getArrayStride(const glslang::TType& arrayType);
+    int getMatrixStride(const glslang::TType& matrixType);
     void updateMemberOffset(const glslang::TType& structType, const glslang::TType& memberType, int& currentOffset, int& nextOffset);
 
     bool isShaderEntrypoint(const glslang::TIntermAggregate* node);
@@ -578,12 +582,12 @@
             // evaluate the right
             builder.clearAccessChain();
             node->getRight()->traverse(this);
-            spv::Id rValue = builder.accessChainLoad(TranslatePrecisionDecoration(node->getRight()->getType()));
+            spv::Id rValue = builder.accessChainLoad(convertGlslangToSpvType(node->getRight()->getType()));
 
             if (node->getOp() != glslang::EOpAssign) {
                 // the left is also an r-value
                 builder.setAccessChain(lValue);
-                spv::Id leftRValue = builder.accessChainLoad(TranslatePrecisionDecoration(node->getLeft()->getType()));
+                spv::Id leftRValue = builder.accessChainLoad(convertGlslangToSpvType(node->getLeft()->getType()));
 
                 // do the operation
                 rValue = createBinaryOperation(node->getOp(), TranslatePrecisionDecoration(node->getType()), 
@@ -635,10 +639,10 @@
                 // so short circuit the access-chain stuff with a swizzle.
                 std::vector<unsigned> swizzle;
                 swizzle.push_back(node->getRight()->getAsConstantUnion()->getConstArray()[0].getIConst());
-                builder.accessChainPushSwizzle(swizzle);
+                builder.accessChainPushSwizzle(swizzle, convertGlslangToSpvType(node->getLeft()->getType()));
             } else {
                 // normal case for indexing array or structure or block
-                builder.accessChainPush(builder.makeIntConstant(index), convertGlslangToSpvType(node->getType()));
+                builder.accessChainPush(builder.makeIntConstant(index));
             }
         }
         return false;
@@ -659,15 +663,15 @@
             // compute the next index in the chain
             builder.clearAccessChain();
             node->getRight()->traverse(this);
-            spv::Id index = builder.accessChainLoad(TranslatePrecisionDecoration(node->getRight()->getType()));
+            spv::Id index = builder.accessChainLoad(convertGlslangToSpvType(node->getRight()->getType()));
 
             // restore the saved access chain
             builder.setAccessChain(partial);
 
             if (! node->getLeft()->getType().isArray() && node->getLeft()->getType().isVector())
-                builder.accessChainPushComponent(index);
+                builder.accessChainPushComponent(index, convertGlslangToSpvType(node->getLeft()->getType()));
             else
-                builder.accessChainPush(index, convertGlslangToSpvType(node->getType()));
+                builder.accessChainPush(index);
         }
         return false;
     case glslang::EOpVectorSwizzle:
@@ -677,7 +681,7 @@
             std::vector<unsigned> swizzle;
             for (int i = 0; i < (int)swizzleSequence.size(); ++i)
                 swizzle.push_back(swizzleSequence[i]->getAsConstantUnion()->getConstArray()[0].getIConst());
-            builder.accessChainPushSwizzle(swizzle);
+            builder.accessChainPushSwizzle(swizzle, convertGlslangToSpvType(node->getLeft()->getType()));
         }
         return false;
     default:
@@ -689,11 +693,11 @@
     // Get the operands
     builder.clearAccessChain();
     node->getLeft()->traverse(this);
-    spv::Id left = builder.accessChainLoad(TranslatePrecisionDecoration(node->getLeft()->getType()));
+    spv::Id left = builder.accessChainLoad(convertGlslangToSpvType(node->getLeft()->getType()));
 
     builder.clearAccessChain();
     node->getRight()->traverse(this);
-    spv::Id right = builder.accessChainLoad(TranslatePrecisionDecoration(node->getRight()->getType()));
+    spv::Id right = builder.accessChainLoad(convertGlslangToSpvType(node->getRight()->getType()));
 
     spv::Id result;
     spv::Decoration precision = TranslatePrecisionDecoration(node->getType());
@@ -728,10 +732,29 @@
     }
 
     // Non-texturing.
+
+    if (node->getOp() == glslang::EOpArrayLength) {
+        // Quite special; won't want to evaluate the operand.
+
+        // Normal .length() would have been constant folded by the front-end.
+        // So, this has to be block.lastMember.length().
+        // SPV wants "block" as the operand, go get it.
+        assert(node->getOperand()->getType().isRuntimeSizedArray());
+        glslang::TIntermTyped* block = node->getOperand()->getAsBinaryNode()->getLeft();
+        block->traverse(this);
+        spv::Id length = builder.createUnaryOp(spv::OpArrayLength, builder.makeIntType(32), builder.accessChainGetLValue());
+
+        builder.clearAccessChain();
+        builder.setAccessChainRValue(length);
+
+        return false;
+    }
+
     // Start by evaluating the operand
 
     builder.clearAccessChain();
     node->getOperand()->traverse(this);
+
     spv::Id operand = spv::NoResult;
 
     if (node->getOp() == glslang::EOpAtomicCounterIncrement ||
@@ -739,7 +762,7 @@
         node->getOp() == glslang::EOpAtomicCounter)
         operand = builder.accessChainGetLValue(); // Special case l-value operands
     else
-        operand = builder.accessChainLoad(TranslatePrecisionDecoration(node->getOperand()->getType()));
+        operand = builder.accessChainLoad(convertGlslangToSpvType(node->getOperand()->getType()));
 
     spv::Decoration precision = TranslatePrecisionDecoration(node->getType());
 
@@ -1027,17 +1050,6 @@
         // which can be emitted by the one in createBinaryOperation()
         binOp = glslang::EOpMod;
         break;
-    case glslang::EOpArrayLength:
-    {
-        glslang::TIntermTyped* typedNode = node->getSequence()[0]->getAsTyped();
-        assert(typedNode);
-        spv::Id length = builder.makeIntConstant(typedNode->getType().getOuterArraySize());
-
-        builder.clearAccessChain();
-        builder.setAccessChainRValue(length);
-
-        return false;
-    }
     case glslang::EOpEmitVertex:
     case glslang::EOpEndPrimitive:
     case glslang::EOpBarrier:
@@ -1091,11 +1103,11 @@
 
         builder.clearAccessChain();
         left->traverse(this);
-        spv::Id leftId = builder.accessChainLoad(TranslatePrecisionDecoration(left->getType()));
+        spv::Id leftId = builder.accessChainLoad(convertGlslangToSpvType(left->getType()));
 
         builder.clearAccessChain();
         right->traverse(this);
-        spv::Id rightId = builder.accessChainLoad(TranslatePrecisionDecoration(right->getType()));
+        spv::Id rightId = builder.accessChainLoad(convertGlslangToSpvType(right->getType()));
 
         result = createBinaryOperation(binOp, precision, 
                                        convertGlslangToSpvType(node->getType()), leftId, rightId, 
@@ -1148,7 +1160,7 @@
         if (lvalue)
             operands.push_back(builder.accessChainGetLValue());
         else
-            operands.push_back(builder.accessChainLoad(TranslatePrecisionDecoration(glslangOperands[arg]->getAsTyped()->getType())));
+            operands.push_back(builder.accessChainLoad(convertGlslangToSpvType(glslangOperands[arg]->getAsTyped()->getType())));
     }
 
     if (atomic) {
@@ -1198,13 +1210,13 @@
     node->getCondition()->traverse(this);
 
     // make an "if" based on the value created by the condition
-    spv::Builder::If ifBuilder(builder.accessChainLoad(spv::NoPrecision), builder);
+    spv::Builder::If ifBuilder(builder.accessChainLoad(convertGlslangToSpvType(node->getCondition()->getType())), builder);
 
     if (node->getTrueBlock()) {
         // emit the "then" statement
         node->getTrueBlock()->traverse(this);
         if (result)
-            builder.createStore(builder.accessChainLoad(TranslatePrecisionDecoration(node->getTrueBlock()->getAsTyped()->getType())), result);
+            builder.createStore(builder.accessChainLoad(convertGlslangToSpvType(node->getTrueBlock()->getAsTyped()->getType())), result);
     }
 
     if (node->getFalseBlock()) {
@@ -1212,7 +1224,7 @@
         // emit the "else" statement
         node->getFalseBlock()->traverse(this);
         if (result)
-            builder.createStore(builder.accessChainLoad(TranslatePrecisionDecoration(node->getFalseBlock()->getAsTyped()->getType())), result);
+            builder.createStore(builder.accessChainLoad(convertGlslangToSpvType(node->getFalseBlock()->getAsTyped()->getType())), result);
     }
 
     ifBuilder.makeEndIf();
@@ -1233,7 +1245,7 @@
 {
     // emit and get the condition before doing anything with switch
     node->getCondition()->traverse(this);
-    spv::Id selector = builder.accessChainLoad(TranslatePrecisionDecoration(node->getCondition()->getAsTyped()->getType()));
+    spv::Id selector = builder.accessChainLoad(convertGlslangToSpvType(node->getCondition()->getAsTyped()->getType()));
 
     // browse the children to sort out code segments
     int defaultSegment = -1;
@@ -1297,7 +1309,7 @@
     if (node->getTest()) {
         node->getTest()->traverse(this);
         // the AST only contained the test computation, not the branch, we have to add it
-        spv::Id condition = builder.accessChainLoad(TranslatePrecisionDecoration(node->getTest()->getType()));
+        spv::Id condition = builder.accessChainLoad(convertGlslangToSpvType(node->getTest()->getType()));
         builder.createLoopTestBranch(condition);
     } else {
         builder.createBranchToBody();
@@ -1343,7 +1355,7 @@
         if (inMain)
             builder.makeMainReturn();
         else if (node->getExpression())
-            builder.makeReturn(false, builder.accessChainLoad(TranslatePrecisionDecoration(node->getExpression()->getType())));
+            builder.makeReturn(false, builder.accessChainLoad(convertGlslangToSpvType(node->getExpression()->getType())));
         else
             builder.makeReturn();
 
@@ -1391,9 +1403,17 @@
     }
 }
 
-// Do full recursive conversion of an arbitrary glslang type to a SPIR-V Id.
+// Convert from a glslang type to an SPV type, by calling into
+// recursive version of this function.
 spv::Id TGlslangToSpvTraverser::convertGlslangToSpvType(const glslang::TType& type)
 {
+    return convertGlslangToSpvType(type, requiresExplicitLayout(type));
+}
+
+// Do full recursive conversion of an arbitrary glslang type to a SPIR-V Id.
+// explicitLayout can be kept the same throughout the heirarchical recursive walk.
+spv::Id TGlslangToSpvTraverser::convertGlslangToSpvType(const glslang::TType& type, bool explicitLayout)
+{
     spv::Id spvType = 0;
 
     switch (type.getBasicType()) {
@@ -1456,7 +1476,7 @@
                 } else {
                     if (type.getBasicType() == glslang::EbtBlock)
                         memberRemapper[glslangStruct][i] = i - memberDelta;
-                    structFields.push_back(convertGlslangToSpvType(glslangType));
+                    structFields.push_back(convertGlslangToSpvType(glslangType, explicitLayout));
                 }
             }
 
@@ -1484,15 +1504,19 @@
                         builder.addMemberDecoration(spvType, member, spv::DecorationComponent, glslangType.getQualifier().layoutComponent);
                     if (glslangType.getQualifier().hasXfbOffset())
                         builder.addMemberDecoration(spvType, member, spv::DecorationOffset, glslangType.getQualifier().layoutXfbOffset);
-                    else {
+                    else if (explicitLayout) {
                         // figure out what to do with offset, which is accumulating
                         int nextOffset;
                         updateMemberOffset(type, glslangType, offset, nextOffset);
                         if (offset >= 0)
-                            builder.addMemberDecoration(spvType, member, spv::DecorationOffset, glslangType.getQualifier().layoutOffset);
+                            builder.addMemberDecoration(spvType, member, spv::DecorationOffset, offset);
                         offset = nextOffset;
                     }
 
+                    if (glslangType.isMatrix() && explicitLayout) {
+                        builder.addMemberDecoration(spvType, member, spv::DecorationMatrixStride, getMatrixStride(glslangType));
+                    }
+
                     // built-in variable decorations
                     spv::BuiltIn builtIn = TranslateBuiltInDecoration(glslangType.getQualifier().builtIn);
                     if (builtIn != spv::BadValue)
@@ -1527,18 +1551,56 @@
     }
 
     if (type.isArray()) {
-        unsigned arraySize;
-        if (! type.isExplicitlySizedArray()) {
-            spv::MissingFunctionality("Unsized array");
-            arraySize = 8;
-        } else
-            arraySize = type.getOuterArraySize();
-        spvType = builder.makeArrayType(spvType, arraySize);
+        // Do all but the outer dimension
+        for (int dim = type.getArraySizes()->getNumDims() - 1; dim > 0; --dim) {
+            assert(type.getArraySizes()->getDimSize(dim) > 0);
+            spvType = builder.makeArrayType(spvType, type.getArraySizes()->getDimSize(dim));
+        }
+
+        // Do the outer dimension, which might not be known for a runtime-sized array
+        if (type.isRuntimeSizedArray()) {
+            spvType = builder.makeRuntimeArray(spvType);
+        } else {
+            assert(type.getOuterArraySize() > 0);
+            spvType = builder.makeArrayType(spvType, type.getOuterArraySize());
+        }
+
+        // TODO: layout still needs to be done hierarchically for arrays of arrays, which 
+        // may still require additional "link time" support from the front-end 
+        // for arrays of arrays
+        if (explicitLayout)
+            builder.addDecoration(spvType, spv::DecorationArrayStride, getArrayStride(type));
     }
 
     return spvType;
 }
 
+bool TGlslangToSpvTraverser::requiresExplicitLayout(const glslang::TType& type) const
+{
+    return type.getBasicType() == glslang::EbtBlock &&
+           type.getQualifier().layoutPacking != glslang::ElpShared &&
+           type.getQualifier().layoutPacking != glslang::ElpPacked &&
+           (type.getQualifier().storage == glslang::EvqUniform ||
+            type.getQualifier().storage == glslang::EvqBuffer);
+}
+
+// Given an array type, returns the integer stride required for that array
+int TGlslangToSpvTraverser::getArrayStride(const glslang::TType& arrayType)
+{
+    glslang::TType derefType(arrayType, 0);
+    int size;
+    glslangIntermediate->getBaseAlignment(derefType, size, true);
+    return size;
+}
+
+// Given a matrix type, returns the integer stride required for that matrix
+// when used as a member of an interface block
+int TGlslangToSpvTraverser::getMatrixStride(const glslang::TType& matrixType)
+{
+    int size;
+    return glslangIntermediate->getBaseAlignment(matrixType, size, true);
+}
+
 // Given a member type of a struct, realign the current offset for it, and compute
 // the next (not yet aligned) offset for the next member, which will get aligned
 // on the next call.
@@ -1700,9 +1762,8 @@
 
         if (lvalue) {
             arguments.push_back(builder.accessChainGetLValue());
-        }
-        else {
-            arguments.push_back(builder.accessChainLoad(TranslatePrecisionDecoration(glslangArguments[i]->getAsTyped()->getType())));
+        } else {
+            arguments.push_back(builder.accessChainLoad(convertGlslangToSpvType(glslangArguments[i]->getAsTyped()->getType())));
         }
     }
 }
@@ -1711,7 +1772,7 @@
 {
     builder.clearAccessChain();
     node.getOperand()->traverse(this);
-    arguments.push_back(builder.accessChainLoad(TranslatePrecisionDecoration(node.getAsTyped()->getType())));
+    arguments.push_back(builder.accessChainLoad(convertGlslangToSpvType(node.getOperand()->getType())));
 }
 
 spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermOperator* node)
@@ -1792,8 +1853,6 @@
     }
 
     // Check for texture functions other than queries
-    if (cracked.fetch)
-        spv::MissingFunctionality("texel fetch");
     if (cracked.gather)
         spv::MissingFunctionality("texture gather");
 
@@ -1849,7 +1908,7 @@
         ++extraArgs;
     }
 
-    return builder.createTextureCall(precision, convertGlslangToSpvType(node->getType()), cracked.proj, params);
+    return builder.createTextureCall(precision, convertGlslangToSpvType(node->getType()), cracked.fetch, cracked.proj, params);
 }
 
 spv::Id TGlslangToSpvTraverser::handleUserFunctionCall(const glslang::TIntermAggregate* node)
@@ -1873,17 +1932,19 @@
     // 1. Evaluate the arguments
     std::vector<spv::Builder::AccessChain> lValues;
     std::vector<spv::Id> rValues;
+    std::vector<spv::Id> argTypes;
     for (int a = 0; a < (int)glslangArgs.size(); ++a) {
         // build l-value
         builder.clearAccessChain();
         glslangArgs[a]->traverse(this);
+        argTypes.push_back(convertGlslangToSpvType(glslangArgs[a]->getAsTyped()->getType()));
         // keep outputs as l-values, evaluate input-only as r-values
         if (qualifiers[a] != glslang::EvqConstReadOnly) {
             // save l-value
             lValues.push_back(builder.getAccessChain());
         } else {
             // process r-value
-            rValues.push_back(builder.accessChainLoad(TranslatePrecisionDecoration(glslangArgs[a]->getAsTyped()->getType())));
+            rValues.push_back(builder.accessChainLoad(argTypes.back()));
         }
     }
 
@@ -1903,7 +1964,7 @@
             if (qualifiers[a] == glslang::EvqIn || qualifiers[a] == glslang::EvqInOut) {
                 // need to copy the input into output space
                 builder.setAccessChain(lValues[lValueCount]);
-                spv::Id copy = builder.accessChainLoad(spv::NoPrecision);  // TODO: get precision
+                spv::Id copy = builder.accessChainLoad(argTypes[a]);
                 builder.createStore(copy, arg);
             }
             ++lValueCount;
diff --git a/SPIRV/SpvBuilder.cpp b/SPIRV/SpvBuilder.cpp
index d780d19..9a9b055 100755
--- a/SPIRV/SpvBuilder.cpp
+++ b/SPIRV/SpvBuilder.cpp
@@ -264,6 +264,16 @@
     return type->getResultId();
 }
 
+Id Builder::makeRuntimeArray(Id element)
+{
+    Instruction* type = new Instruction(getUniqueId(), NoType, OpTypeRuntimeArray);
+    type->addIdOperand(element);
+    constantsTypesGlobals.push_back(type);
+    module.mapInstruction(type);
+
+    return type->getResultId();
+}
+
 Id Builder::makeFunctionType(Id returnType, std::vector<Id>& paramTypes)
 {
     // try to find it
@@ -280,7 +290,7 @@
             }
         }
         if (! mismatch)
-            return type->getResultId();            
+            return type->getResultId();
     }
 
     // not found, make it
@@ -1147,7 +1157,7 @@
 
 // Accept all parameters needed to create a texture instruction.
 // Create the correct instruction based on the inputs, and make the call.
-Id Builder::createTextureCall(Decoration precision, Id resultType, bool proj, const TextureParameters& parameters)
+Id Builder::createTextureCall(Decoration precision, Id resultType, bool fetch, bool proj, const TextureParameters& parameters)
 {
     static const int maxTextureArgs = 10;
     Id texArgs[maxTextureArgs] = {};
@@ -1206,7 +1216,9 @@
     //
     Op opCode;
     opCode = OpImageSampleImplicitLod;
-    if (xplicit) {
+    if (fetch) {
+        opCode = OpImageFetch;
+    } else if (xplicit) {
         if (parameters.Dref) {
             if (proj)
                 opCode = OpImageSampleProjDrefExplicitLod;
@@ -1955,18 +1967,23 @@
 
 void Builder::clearAccessChain()
 {
-    accessChain.base = 0;
+    accessChain.base = NoResult;
     accessChain.indexChain.clear();
-    accessChain.instr = 0;
+    accessChain.instr = NoResult;
     accessChain.swizzle.clear();
-    accessChain.component = 0;
-    accessChain.resultType = NoType;
+    accessChain.component = NoResult;
+    accessChain.preSwizzleBaseType = NoType;
     accessChain.isRValue = false;
 }
 
 // Comments in header
-void Builder::accessChainPushSwizzle(std::vector<unsigned>& swizzle)
+void Builder::accessChainPushSwizzle(std::vector<unsigned>& swizzle, Id preSwizzleBaseType)
 {
+    // swizzles can be stacked in GLSL, but simplified to a single
+    // one here; the base type doesn't change
+    if (accessChain.preSwizzleBaseType == NoType)
+        accessChain.preSwizzleBaseType = preSwizzleBaseType;
+
     // if needed, propagate the swizzle for the current access chain
     if (accessChain.swizzle.size()) {
         std::vector<unsigned> oldSwizzle = accessChain.swizzle;
@@ -1988,7 +2005,7 @@
 
     Id base = collapseAccessChain();
 
-    if (accessChain.swizzle.size() && accessChain.component)
+    if (accessChain.swizzle.size() && accessChain.component != NoResult)
         MissingFunctionality("simultaneous l-value swizzle and dynamic component selection");
 
     // If swizzle exists, it is out-of-order or not full, we must load the target vector,
@@ -2000,7 +2017,7 @@
     }
 
     // dynamic component selection
-    if (accessChain.component) {
+    if (accessChain.component != NoResult) {
         Id tempBaseId = (source == NoResult) ? createLoad(base) : source;
         source = createVectorInsertDynamic(tempBaseId, getTypeId(tempBaseId), rvalue, accessChain.component);
     }
@@ -2012,13 +2029,15 @@
 }
 
 // Comments in header
-Id Builder::accessChainLoad(Decoration /*precision*/)
+Id Builder::accessChainLoad(Id resultType)
 {
     Id id;
 
     if (accessChain.isRValue) {
         if (accessChain.indexChain.size() > 0) {
             mergeAccessChainSwizzle();  // TODO: optimization: look at applying this optimization more widely
+            Id swizzleBase = accessChain.preSwizzleBaseType != NoType ? accessChain.preSwizzleBaseType : resultType;
+        
             // if all the accesses are constants, we can use OpCompositeExtract
             std::vector<unsigned> indexes;
             bool constant = true;
@@ -2032,7 +2051,7 @@
             }
 
             if (constant)
-                id = createCompositeExtract(accessChain.base, accessChain.resultType, indexes);
+                id = createCompositeExtract(accessChain.base, swizzleBase, indexes);
             else {
                 // make a new function variable for this r-value
                 Id lValue = createVariable(StorageClassFunction, getTypeId(accessChain.base), "indexable");
@@ -2055,24 +2074,22 @@
     }
 
     // Done, unless there are swizzles to do
-    if (accessChain.swizzle.size() == 0 && accessChain.component == 0)
+    if (accessChain.swizzle.size() == 0 && accessChain.component == NoResult)
         return id;
 
-    Id componentType = getScalarTypeId(accessChain.resultType);
-
     // Do remaining swizzling
     // First, static swizzling
     if (accessChain.swizzle.size()) {
         // static swizzle
-        Id resultType = componentType;
+        Id swizzledType = getScalarTypeId(getTypeId(id));
         if (accessChain.swizzle.size() > 1)
-            resultType = makeVectorType(componentType, (int)accessChain.swizzle.size());
-        id = createRvalueSwizzle(resultType, id, accessChain.swizzle);
+            swizzledType = makeVectorType(swizzledType, (int)accessChain.swizzle.size());
+        id = createRvalueSwizzle(swizzledType, id, accessChain.swizzle);
     }
 
     // dynamic single-component selection
-    if (accessChain.component)
-        id = createVectorExtractDynamic(id, componentType, accessChain.component);
+    if (accessChain.component != NoResult)
+        id = createVectorExtractDynamic(id, resultType, accessChain.component);
 
     return id;
 }
@@ -2087,7 +2104,7 @@
     // extract and insert elements to perform writeMask and/or swizzle.  This does not
     // go with getting a direct l-value pointer.
     assert(accessChain.swizzle.size() == 0);
-    assert(accessChain.component == spv::NoResult);
+    assert(accessChain.component == NoResult);
 
     return lvalue;
 }
@@ -2168,7 +2185,7 @@
 {
     // If the swizzle has fewer components than the vector, it is subsetting, and must stay
     // to preserve that fact.
-    if (getNumTypeComponents(accessChain.resultType) > (int)accessChain.swizzle.size())
+    if (getNumTypeComponents(accessChain.preSwizzleBaseType) > (int)accessChain.swizzle.size())
         return;
 
     // if components are out of order, it is a swizzle
@@ -2179,6 +2196,8 @@
 
     // otherwise, there is no need to track this swizzle
     accessChain.swizzle.clear();
+    if (accessChain.component == NoResult)
+        accessChain.preSwizzleBaseType = NoType;
 }
 
 // clear out swizzle if it can become part of the indexes
@@ -2186,12 +2205,12 @@
 {
     // is there even a chance of doing something?  Need a single-component swizzle
     if ((accessChain.swizzle.size() > 1) ||
-        (accessChain.swizzle.size() == 0 && accessChain.component == 0))
+        (accessChain.swizzle.size() == 0 && accessChain.component == NoResult))
         return;
 
     // TODO: optimization: remove this, but for now confine this to non-dynamic accesses
     // (the above test is correct when this is removed.)
-    if (accessChain.component)
+    if (accessChain.component != NoResult)
         return;
 
     // move the swizzle over to the indexes
@@ -2199,10 +2218,10 @@
         accessChain.indexChain.push_back(makeUintConstant(accessChain.swizzle.front()));
     else
         accessChain.indexChain.push_back(accessChain.component);
-    accessChain.resultType = getScalarTypeId(accessChain.resultType);
 
     // now there is no need to track this swizzle
     accessChain.component = NoResult;
+    accessChain.preSwizzleBaseType = NoType;
     accessChain.swizzle.clear();
 }
 
diff --git a/SPIRV/SpvBuilder.h b/SPIRV/SpvBuilder.h
index 698201b..65d3966 100755
--- a/SPIRV/SpvBuilder.h
+++ b/SPIRV/SpvBuilder.h
@@ -102,6 +102,7 @@
     Id makeVectorType(Id component, int size);
     Id makeMatrixType(Id component, int cols, int rows);
     Id makeArrayType(Id element, unsigned size);
+    Id makeRuntimeArray(Id element);
     Id makeFunctionType(Id returnType, std::vector<Id>& paramTypes);
     Id makeImageType(Id sampledType, Dim, bool depth, bool arrayed, bool ms, unsigned sampled, ImageFormat format);
     Id makeSampledImageType(Id imageType);
@@ -304,7 +305,7 @@
     };
 
     // Select the correct texture operation based on all inputs, and emit the correct instruction
-    Id createTextureCall(Decoration precision, Id resultType, bool proj, const TextureParameters&);
+    Id createTextureCall(Decoration precision, Id resultType, bool fetch, bool proj, const TextureParameters&);
 
     // Emit the OpTextureQuery* instruction that was passed in.
     // Figure out the right return value and type, and return it.
@@ -436,7 +437,7 @@
         Id instr;                    // the instruction that generates this access chain
         std::vector<unsigned> swizzle;
         Id component;                // a dynamic component index, can coexist with a swizzle, done after the swizzle
-        Id resultType;               // dereferenced type, to be exclusive of swizzles
+        Id preSwizzleBaseType;       // dereferenced type, before swizzle or component is applied; NoType unless a swizzle or component is present
         bool isRValue;
     };
 
@@ -457,7 +458,6 @@
     {
         assert(isPointer(lValue));
         accessChain.base = lValue;
-        accessChain.resultType = getContainedTypeId(getTypeId(lValue));
     }
 
     // set new base value as an r-value
@@ -465,27 +465,30 @@
     {
         accessChain.isRValue = true;
         accessChain.base = rValue;
-        accessChain.resultType = getTypeId(rValue);
     }
 
     // push offset onto the end of the chain
-    void accessChainPush(Id offset, Id newType)
+    void accessChainPush(Id offset)
     {
         accessChain.indexChain.push_back(offset);
-        accessChain.resultType = newType;
     }
 
     // push new swizzle onto the end of any existing swizzle, merging into a single swizzle
-    void accessChainPushSwizzle(std::vector<unsigned>& swizzle);
+    void accessChainPushSwizzle(std::vector<unsigned>& swizzle, Id preSwizzleBaseType);
 
     // push a variable component selection onto the access chain; supporting only one, so unsided
-    void accessChainPushComponent(Id component) { accessChain.component = component; }
+    void accessChainPushComponent(Id component, Id preSwizzleBaseType)
+    {
+        accessChain.component = component;
+        if (accessChain.preSwizzleBaseType == NoType)
+            accessChain.preSwizzleBaseType = preSwizzleBaseType;
+    }
 
     // use accessChain and swizzle to store value
     void accessChainStore(Id rvalue);
 
     // use accessChain and swizzle to load an r-value
-    Id accessChainLoad(Decoration precision);
+    Id accessChainLoad(Id ResultType);
 
     // get the direct pointer for an l-value
     Id accessChainGetLValue();
diff --git a/Test/310.comp b/Test/310.comp
index 4c2cfd7..d6b2c97 100644
--- a/Test/310.comp
+++ b/Test/310.comp
@@ -236,3 +236,5 @@
 
     // ERROR, no __ until revision 310
 #define __D
+
+shared vec4 arr[2][3][4];
diff --git a/Test/310.frag b/Test/310.frag
index 116a0a7..78f13f6 100644
--- a/Test/310.frag
+++ b/Test/310.frag
@@ -427,3 +427,5 @@
 layout(blend_support_hsl_luminosity) void blendFoo() { }       // ERROR, only on standalone
 void blendFoo(layout(blend_support_hsl_luminosity) vec3 v) { } // ERROR, only on standalone
 layout(blend_support_flizbit) out;                             // ERROR, no flizbit
+
+out vec4 outAA[2][2];  // ERROR
diff --git a/Test/310AofA.vert b/Test/310AofA.vert
index eb68d89..a196388 100644
--- a/Test/310AofA.vert
+++ b/Test/310AofA.vert
@@ -12,3 +12,104 @@
   int[NY][NX] d;
   f(false, 12.1, uint[NZ](uint(0),uint(1),uint(1),uint(2)), d);
 }
+
+buffer b {

+    float u[];  // ERROR

+    vec4 v[];

+} name[3];
+

+uniform ub {

+    float u;

+    vec4 v[];   // ERROR

+} uname[3];
+
+buffer b2 {

+    float u;

+    vec4 v[][];  // ERROR

+} name2[3];
+
+buffer b3 {

+    float u; 

+    vec4 v[][7];

+} name3[3];
+
+// General arrays of arrays
+

+float[4][5][6] many[1][2][3];

+

+float gu[][7];     // ERROR, size required

+float g4[4][7];

+float g5[5][7];

+

+float[4][7] foo(float a[5][7])

+{

+    float r[7];

+    r = a[2];

+    float[](a[0], a[1], r, a[3]);              // ERROR, too few dims

+    float[4][7][4](a[0], a[1], r, a[3]);       // ERROR, too many dims

+    return float[4][7](a[0], a[1], r, a[3]);

+    return float[][](a[0], a[1], r, a[3]);

+    return float[][7](a[0], a[1], a[2], a[3]);

+}

+

+void bar(float[5][7]) {}

+

+void foo2()

+{

+    {

+        float gu[3][4][2];

+

+        gu[2][4][1] = 4.0;                     // ERROR, overflow

+    }

+    vec4 ca4[3][2] = vec4[][](vec4[2](vec4(0.0), vec4(1.0)),

+                              vec4[2](vec4(0.0), vec4(1.0)),

+                              vec4[2](vec4(0.0), vec4(1.0)));

+    vec4 caim[][2] = vec4[][](vec4[2](vec4(4.0), vec4(2.0)),

+                              vec4[2](vec4(4.0), vec4(2.0)),

+                              vec4[2](vec4(4.0), vec4(2.0)));

+    vec4 caim2[][] = vec4[][](vec4[2](vec4(4.0), vec4(2.0)),

+                              vec4[2](vec4(4.0), vec4(2.0)),

+                              vec4[2](vec4(4.0), vec4(2.0)));

+    vec4 caim3[3][] = vec4[][](vec4[2](vec4(4.0), vec4(2.0)),

+                               vec4[2](vec4(4.0), vec4(2.0)),

+                               vec4[2](vec4(4.0), vec4(2.0)));

+

+    g4 = foo(g5);

+    g5 = g4;           // ERROR, wrong types

+    gu = g4;           // ERROR, not yet sized

+

+    foo(gu);           // ERROR, not yet sized

+    bar(g5);

+

+    if (foo(g5) == g4)

+        ;

+    if (foo(g5) == g5)  // ERROR, different types

+        ;

+

+    float u[5][7];

+    u[5][2] = 5.0;      // ERROR

+    foo(u);

+

+    vec4 badAss[3];

+    name[1].v[-1];     // ERROR

+    name[1].v[1] = vec4(4.3);

+    name[1].v = badAss;  // ERROR, bad assignemnt

+

+    name3[0].v[1].length();  // 7

+    name3[0].v.length();     // run time

+}

+

+struct badS {

+    int sa[];     // ERROR

+    int a[][];    // ERROR

+    int b[][2];   // ERROR

+    int c[2][];   // ERROR

+    int d[][4];   // ERROR

+};

+

+in float inArray[2][3];    // ERROR

+out float outArray[2][3];  // ERROR

+

+uniform ubaa {

+    int a;

+} ubaaname[2][3];  // ERROR

diff --git a/Test/430.comp b/Test/430.comp
index 663fdde..0929432 100644
--- a/Test/430.comp
+++ b/Test/430.comp
@@ -20,7 +20,7 @@
 

 buffer InvalidShaderStorageBlock

 {

-    float values[];  // ERROR

+    float values[];

     int value;

 } invalid;

 

diff --git a/Test/baseResults/300.frag.out b/Test/baseResults/300.frag.out
index b175028..a21667e 100644
--- a/Test/baseResults/300.frag.out
+++ b/Test/baseResults/300.frag.out
@@ -26,6 +26,7 @@
 ERROR: 0:102: 'arrays of arrays' : not supported for this version or the enabled extensions 

 ERROR: 0:103: 'arrays of arrays' : not supported for this version or the enabled extensions 

 ERROR: 0:100: 'arrays of arrays' : not supported for this version or the enabled extensions 

+ERROR: 0:100: 'array-of-array of block' : not supported with this profile: es

 ERROR: 0:111: 'variable indexing fragment shader ouput array' : not supported with this profile: es

 ERROR: 0:119: '==' : can't use with samplers or structs containing samplers 

 ERROR: 0:120: '!=' : can't use with samplers or structs containing samplers 

@@ -42,7 +43,7 @@
 ERROR: 0:158: 'invariant' : can only apply to an output 

 ERROR: 0:160: 'imageBuffer' : Reserved word. 

 ERROR: 0:160: '' :  syntax error

-ERROR: 43 compilation errors.  No code generated.

+ERROR: 44 compilation errors.  No code generated.

 

 

 Shader version: 300

diff --git a/Test/baseResults/300.vert.out b/Test/baseResults/300.vert.out
index cb861f6..d3d7cba 100644
--- a/Test/baseResults/300.vert.out
+++ b/Test/baseResults/300.vert.out
@@ -17,7 +17,7 @@
 ERROR: 0:62: '' : array size required 

 ERROR: 0:63: '' : array size required 

 ERROR: 0:64: '' : array size required 

-ERROR: 0:65: 'implicitly-sized array in a block' : not supported with this profile: es

+ERROR: 0:65: '' : array size required 

 ERROR: 0:67: '' : array size required 

 ERROR: 0:76: 'invariant' : cannot change qualification after use 

 ERROR: 0:78: 'invariant' : can only apply to an output 

diff --git a/Test/baseResults/310.comp.out b/Test/baseResults/310.comp.out
index 645b2cc..f3775e3 100644
--- a/Test/baseResults/310.comp.out
+++ b/Test/baseResults/310.comp.out
@@ -2,7 +2,7 @@
 Warning, version 310 is not yet complete; most version-specific features are present, but some are missing.

 ERROR: 0:4: 'local_size' : cannot change previously set size 

 ERROR: 0:5: 'local_size' : too large; see gl_MaxComputeWorkGroupSize 

-ERROR: 0:23: 'values' : only the last member of a buffer block can be run-time sized 

+ERROR: 0:23: '' : array size required 

 ERROR: 0:39: 'in' : global storage input qualifier cannot be used in a compute shader 

 ERROR: 0:39: 'location qualifier on input' : not supported in this stage: compute

 ERROR: 0:40: 'in' : global storage input qualifier cannot be used in a compute shader 

@@ -502,6 +502,7 @@
 0:?     'inbi' (in block{in highp int a})

 0:?     'outbi' (out block{out highp int a})

 0:?     't__' (global highp float)

+0:?     'arr' (shared 2-element array of 3-element array of 4-element array of highp 4-component vector of float)

 

 

 Linked compute stage:

@@ -928,4 +929,5 @@
 0:?     'inbi' (in block{in highp int a})

 0:?     'outbi' (out block{out highp int a})

 0:?     't__' (global highp float)

+0:?     'arr' (shared 2-element array of 3-element array of 4-element array of highp 4-component vector of float)

 

diff --git a/Test/baseResults/310.frag.out b/Test/baseResults/310.frag.out
index 910cd9c..9769eb6 100644
--- a/Test/baseResults/310.frag.out
+++ b/Test/baseResults/310.frag.out
@@ -129,7 +129,8 @@
 ERROR: 0:427: 'blend equation' : can only apply to a standalone qualifier 

 ERROR: 0:428: 'blend equation' : can only apply to a standalone qualifier 

 ERROR: 0:429: 'blend_support' : unknown blend equation 

-ERROR: 121 compilation errors.  No code generated.

+ERROR: 0:431: 'fragment-shader array-of-array output' : not supported with this profile: es

+ERROR: 122 compilation errors.  No code generated.

 

 

 Shader version: 310

@@ -1006,6 +1007,7 @@
 0:?     'colorfsi' (flat sample in mediump 4-component vector of float)

 0:?     'sampInArray' (smooth sample in 4-element array of mediump 3-component vector of float)

 0:?     'badout' (out mediump 4-component vector of float)

+0:?     'outAA' (out 2-element array of 2-element array of mediump 4-component vector of float)

 

 

 Linked fragment stage:

@@ -1886,4 +1888,5 @@
 0:?     'colorfsi' (flat sample in mediump 4-component vector of float)

 0:?     'sampInArray' (smooth sample in 4-element array of mediump 3-component vector of float)

 0:?     'badout' (out mediump 4-component vector of float)

+0:?     'outAA' (out 2-element array of 2-element array of mediump 4-component vector of float)

 

diff --git a/Test/baseResults/310AofA.vert.out b/Test/baseResults/310AofA.vert.out
index 63598fc..476646c 100644
--- a/Test/baseResults/310AofA.vert.out
+++ b/Test/baseResults/310AofA.vert.out
@@ -1,8 +1,32 @@
 310AofA.vert

 Warning, version 310 is not yet complete; most version-specific features are present, but some are missing.

+ERROR: 0:17: '' : array size required 

+ERROR: 0:23: '' : array size required 

+ERROR: 0:28: '[]' : only outermost dimension of an array of arrays can be implicitly sized 

+ERROR: 0:40: '' : array size required 

+ERROR: 0:48: 'constructor' : constructing non-array constituent from array argument 

+ERROR: 0:49: 'constructior' : array constructor argument not correct type to construct array element 

+ERROR: 0:62: '[' :  array index out of range '4'

+ERROR: 0:78: 'assign' :  cannot convert from 'global 4-element array of 7-element array of highp float' to 'global 5-element array of 7-element array of highp float'

+ERROR: 0:79: 'assign' :  cannot convert from 'global 4-element array of 7-element array of highp float' to 'global implicitly-sized array of 7-element array of highp float'

+ERROR: 0:81: 'foo' : no matching overloaded function found 

+ERROR: 0:86: '==' :  wrong operand types: no operation '==' exists that takes a left-hand operand of type 'global 4-element array of 7-element array of highp float' and a right operand of type 'global 5-element array of 7-element array of highp float' (or there is no acceptable conversion)

+ERROR: 0:90: '[' :  array index out of range '5'

+ERROR: 0:94: '[' :  index out of range '-1'

+ERROR: 0:96: 'assign' :  cannot convert from 'temp 3-element array of highp 4-component vector of float' to 'layout(column_major shared ) buffer implicitly-sized array of highp 4-component vector of float'

+ERROR: 0:103: '' : array size required 

+ERROR: 0:104: '' : array size required 

+ERROR: 0:105: '' : array size required 

+ERROR: 0:106: '' : array size required 

+ERROR: 0:107: '' : array size required 

+ERROR: 0:110: 'vertex input arrays' : not supported with this profile: es

+ERROR: 0:111: 'vertex-shader array-of-array output' : not supported with this profile: es

+ERROR: 0:113: 'array-of-array of block' : not supported with this profile: es

+ERROR: 22 compilation errors.  No code generated.

+

 

 Shader version: 310

-0:? Sequence

+ERROR: node is still EOpNull!

 0:8  Function Definition: f(b1;f1;u1[4];i1[3][2]; (global void)

 0:8    Function Parameters: 

 0:8      'a' (in bool)

@@ -23,7 +47,289 @@
 0:13          1 (const uint)

 0:13          2 (const uint)

 0:13        'd' (temp 3-element array of 2-element array of highp int)

+0:44  Function Definition: foo(f1[5][7]; (global 4-element array of 7-element array of highp float)

+0:44    Function Parameters: 

+0:44      'a' (in 5-element array of 7-element array of highp float)

+0:?     Sequence

+0:47      move second child to first child (temp 7-element array of highp float)

+0:47        'r' (temp 7-element array of highp float)

+0:47        direct index (temp 7-element array of highp float)

+0:47          'a' (in 5-element array of 7-element array of highp float)

+0:47          Constant:

+0:47            2 (const int)

+0:48      Constant:

+0:48        0.000000

+0:49      Constant:

+0:49        0.000000

+0:50      Branch: Return with expression

+0:50        Construct float (temp 4-element array of 7-element array of float)

+0:50          direct index (temp 7-element array of highp float)

+0:50            'a' (in 5-element array of 7-element array of highp float)

+0:50            Constant:

+0:50              0 (const int)

+0:50          direct index (temp 7-element array of highp float)

+0:50            'a' (in 5-element array of 7-element array of highp float)

+0:50            Constant:

+0:50              1 (const int)

+0:50          'r' (temp 7-element array of highp float)

+0:50          direct index (temp 7-element array of highp float)

+0:50            'a' (in 5-element array of 7-element array of highp float)

+0:50            Constant:

+0:50              3 (const int)

+0:51      Branch: Return with expression

+0:51        Construct float (temp 4-element array of 7-element array of float)

+0:51          direct index (temp 7-element array of highp float)

+0:51            'a' (in 5-element array of 7-element array of highp float)

+0:51            Constant:

+0:51              0 (const int)

+0:51          direct index (temp 7-element array of highp float)

+0:51            'a' (in 5-element array of 7-element array of highp float)

+0:51            Constant:

+0:51              1 (const int)

+0:51          'r' (temp 7-element array of highp float)

+0:51          direct index (temp 7-element array of highp float)

+0:51            'a' (in 5-element array of 7-element array of highp float)

+0:51            Constant:

+0:51              3 (const int)

+0:52      Branch: Return with expression

+0:52        Construct float (temp 4-element array of 7-element array of float)

+0:52          direct index (temp 7-element array of highp float)

+0:52            'a' (in 5-element array of 7-element array of highp float)

+0:52            Constant:

+0:52              0 (const int)

+0:52          direct index (temp 7-element array of highp float)

+0:52            'a' (in 5-element array of 7-element array of highp float)

+0:52            Constant:

+0:52              1 (const int)

+0:52          direct index (temp 7-element array of highp float)

+0:52            'a' (in 5-element array of 7-element array of highp float)

+0:52            Constant:

+0:52              2 (const int)

+0:52          direct index (temp 7-element array of highp float)

+0:52            'a' (in 5-element array of 7-element array of highp float)

+0:52            Constant:

+0:52              3 (const int)

+0:55  Function Definition: bar(f1[5][7]; (global void)

+0:55    Function Parameters: 

+0:55      '' (in 5-element array of 7-element array of highp float)

+0:57  Function Definition: foo2( (global void)

+0:57    Function Parameters: 

+0:?     Sequence

+0:?       Sequence

+0:62        move second child to first child (temp highp float)

+0:62          direct index (temp highp float)

+0:62            direct index (temp 2-element array of highp float)

+0:62              direct index (temp 4-element array of 2-element array of highp float)

+0:62                'gu' (temp 3-element array of 4-element array of 2-element array of highp float)

+0:62                Constant:

+0:62                  2 (const int)

+0:62              Constant:

+0:62                4 (const int)

+0:62            Constant:

+0:62              1 (const int)

+0:62          Constant:

+0:62            4.000000

+0:64      Sequence

+0:64        move second child to first child (temp 3-element array of 2-element array of highp 4-component vector of float)

+0:64          'ca4' (temp 3-element array of 2-element array of highp 4-component vector of float)

+0:66          Constant:

+0:66            0.000000

+0:66            0.000000

+0:66            0.000000

+0:66            0.000000

+0:66            1.000000

+0:66            1.000000

+0:66            1.000000

+0:66            1.000000

+0:66            0.000000

+0:66            0.000000

+0:66            0.000000

+0:66            0.000000

+0:66            1.000000

+0:66            1.000000

+0:66            1.000000

+0:66            1.000000

+0:66            0.000000

+0:66            0.000000

+0:66            0.000000

+0:66            0.000000

+0:66            1.000000

+0:66            1.000000

+0:66            1.000000

+0:66            1.000000

+0:67      Sequence

+0:67        move second child to first child (temp 3-element array of 2-element array of highp 4-component vector of float)

+0:67          'caim' (temp 3-element array of 2-element array of highp 4-component vector of float)

+0:69          Constant:

+0:69            4.000000

+0:69            4.000000

+0:69            4.000000

+0:69            4.000000

+0:69            2.000000

+0:69            2.000000

+0:69            2.000000

+0:69            2.000000

+0:69            4.000000

+0:69            4.000000

+0:69            4.000000

+0:69            4.000000

+0:69            2.000000

+0:69            2.000000

+0:69            2.000000

+0:69            2.000000

+0:69            4.000000

+0:69            4.000000

+0:69            4.000000

+0:69            4.000000

+0:69            2.000000

+0:69            2.000000

+0:69            2.000000

+0:69            2.000000

+0:70      Sequence

+0:70        move second child to first child (temp 3-element array of 2-element array of highp 4-component vector of float)

+0:70          'caim2' (temp 3-element array of 2-element array of highp 4-component vector of float)

+0:72          Constant:

+0:72            4.000000

+0:72            4.000000

+0:72            4.000000

+0:72            4.000000

+0:72            2.000000

+0:72            2.000000

+0:72            2.000000

+0:72            2.000000

+0:72            4.000000

+0:72            4.000000

+0:72            4.000000

+0:72            4.000000

+0:72            2.000000

+0:72            2.000000

+0:72            2.000000

+0:72            2.000000

+0:72            4.000000

+0:72            4.000000

+0:72            4.000000

+0:72            4.000000

+0:72            2.000000

+0:72            2.000000

+0:72            2.000000

+0:72            2.000000

+0:73      Sequence

+0:73        move second child to first child (temp 3-element array of 2-element array of highp 4-component vector of float)

+0:73          'caim3' (temp 3-element array of 2-element array of highp 4-component vector of float)

+0:75          Constant:

+0:75            4.000000

+0:75            4.000000

+0:75            4.000000

+0:75            4.000000

+0:75            2.000000

+0:75            2.000000

+0:75            2.000000

+0:75            2.000000

+0:75            4.000000

+0:75            4.000000

+0:75            4.000000

+0:75            4.000000

+0:75            2.000000

+0:75            2.000000

+0:75            2.000000

+0:75            2.000000

+0:75            4.000000

+0:75            4.000000

+0:75            4.000000

+0:75            4.000000

+0:75            2.000000

+0:75            2.000000

+0:75            2.000000

+0:75            2.000000

+0:77      move second child to first child (temp 4-element array of 7-element array of highp float)

+0:77        'g4' (global 4-element array of 7-element array of highp float)

+0:77        Function Call: foo(f1[5][7]; (global 4-element array of 7-element array of highp float)

+0:77          'g5' (global 5-element array of 7-element array of highp float)

+0:78      'g5' (global 5-element array of 7-element array of highp float)

+0:79      'gu' (global implicitly-sized array of 7-element array of highp float)

+0:81      Constant:

+0:81        0.000000

+0:82      Function Call: bar(f1[5][7]; (global void)

+0:82        'g5' (global 5-element array of 7-element array of highp float)

+0:84      Test condition and select (temp void)

+0:84        Condition

+0:84        Compare Equal (temp bool)

+0:84          Function Call: foo(f1[5][7]; (global 4-element array of 7-element array of highp float)

+0:84            'g5' (global 5-element array of 7-element array of highp float)

+0:84          'g4' (global 4-element array of 7-element array of highp float)

+0:84        true case is null

+0:86      Test condition and select (temp void)

+0:86        Condition

+0:86        Constant:

+0:86          false (const bool)

+0:86        true case is null

+0:90      move second child to first child (temp highp float)

+0:90        direct index (temp highp float)

+0:90          direct index (temp 7-element array of highp float)

+0:90            'u' (temp 5-element array of 7-element array of highp float)

+0:90            Constant:

+0:90              5 (const int)

+0:90          Constant:

+0:90            2 (const int)

+0:90        Constant:

+0:90          5.000000

+0:91      Function Call: foo(f1[5][7]; (global 4-element array of 7-element array of highp float)

+0:91        'u' (temp 5-element array of 7-element array of highp float)

+0:94      direct index (layout(column_major shared ) temp highp 4-component vector of float)

+0:94        v: direct index for structure (layout(column_major shared ) buffer implicitly-sized array of highp 4-component vector of float)

+0:94          direct index (layout(column_major shared ) temp block{layout(column_major shared ) buffer implicitly-sized array of highp float u, layout(column_major shared ) buffer implicitly-sized array of highp 4-component vector of float v})

+0:94            'name' (layout(column_major shared ) buffer 3-element array of block{layout(column_major shared ) buffer implicitly-sized array of highp float u, layout(column_major shared ) buffer implicitly-sized array of highp 4-component vector of float v})

+0:94            Constant:

+0:94              1 (const int)

+0:94          Constant:

+0:94            1 (const int)

+0:94        Constant:

+0:94          -1 (const int)

+0:95      move second child to first child (temp highp 4-component vector of float)

+0:95        direct index (layout(column_major shared ) temp highp 4-component vector of float)

+0:95          v: direct index for structure (layout(column_major shared ) buffer implicitly-sized array of highp 4-component vector of float)

+0:95            direct index (layout(column_major shared ) temp block{layout(column_major shared ) buffer implicitly-sized array of highp float u, layout(column_major shared ) buffer implicitly-sized array of highp 4-component vector of float v})

+0:95              'name' (layout(column_major shared ) buffer 3-element array of block{layout(column_major shared ) buffer implicitly-sized array of highp float u, layout(column_major shared ) buffer implicitly-sized array of highp 4-component vector of float v})

+0:95              Constant:

+0:95                1 (const int)

+0:95            Constant:

+0:95              1 (const int)

+0:95          Constant:

+0:95            1 (const int)

+0:95        Constant:

+0:95          4.300000

+0:95          4.300000

+0:95          4.300000

+0:95          4.300000

+0:96      v: direct index for structure (layout(column_major shared ) buffer implicitly-sized array of highp 4-component vector of float)

+0:96        direct index (layout(column_major shared ) temp block{layout(column_major shared ) buffer implicitly-sized array of highp float u, layout(column_major shared ) buffer implicitly-sized array of highp 4-component vector of float v})

+0:96          'name' (layout(column_major shared ) buffer 3-element array of block{layout(column_major shared ) buffer implicitly-sized array of highp float u, layout(column_major shared ) buffer implicitly-sized array of highp 4-component vector of float v})

+0:96          Constant:

+0:96            1 (const int)

+0:96        Constant:

+0:96          1 (const int)

+0:98      Constant:

+0:98        7 (const int)

+0:99      array length (temp highp int)

+0:99        v: direct index for structure (layout(column_major shared ) buffer implicitly-sized array of 7-element array of highp 4-component vector of float)

+0:99          direct index (layout(column_major shared ) temp block{layout(column_major shared ) buffer highp float u, layout(column_major shared ) buffer implicitly-sized array of 7-element array of highp 4-component vector of float v})

+0:99            'name3' (layout(column_major shared ) buffer 3-element array of block{layout(column_major shared ) buffer highp float u, layout(column_major shared ) buffer implicitly-sized array of 7-element array of highp 4-component vector of float v})

+0:99            Constant:

+0:99              0 (const int)

+0:99          Constant:

+0:99            1 (const int)

 0:?   Linker Objects

+0:?     'name' (layout(column_major shared ) buffer 3-element array of block{layout(column_major shared ) buffer implicitly-sized array of highp float u, layout(column_major shared ) buffer implicitly-sized array of highp 4-component vector of float v})

+0:?     'uname' (layout(column_major shared ) uniform 3-element array of block{layout(column_major shared ) uniform highp float u, layout(column_major shared ) uniform implicitly-sized array of highp 4-component vector of float v})

+0:?     'name2' (layout(column_major shared ) buffer 3-element array of block{layout(column_major shared ) buffer highp float u, layout(column_major shared ) buffer implicitly-sized array of implicitly-sized array of highp 4-component vector of float v})

+0:?     'name3' (layout(column_major shared ) buffer 3-element array of block{layout(column_major shared ) buffer highp float u, layout(column_major shared ) buffer implicitly-sized array of 7-element array of highp 4-component vector of float v})

+0:?     'many' (global 1-element array of 2-element array of 3-element array of 4-element array of 5-element array of 6-element array of highp float)

+0:?     'gu' (global implicitly-sized array of 7-element array of highp float)

+0:?     'g4' (global 4-element array of 7-element array of highp float)

+0:?     'g5' (global 5-element array of 7-element array of highp float)

+0:?     'inArray' (in 2-element array of 3-element array of highp float)

+0:?     'outArray' (smooth out 2-element array of 3-element array of highp float)

+0:?     'ubaaname' (layout(column_major shared ) uniform 2-element array of 3-element array of block{layout(column_major shared ) uniform highp int a})

 0:?     'gl_VertexID' (gl_VertexId highp int VertexId)

 0:?     'gl_InstanceID' (gl_InstanceId highp int InstanceId)

 

@@ -32,7 +338,7 @@
 

 

 Shader version: 310

-0:? Sequence

+ERROR: node is still EOpNull!

 0:8  Function Definition: f(b1;f1;u1[4];i1[3][2]; (global void)

 0:8    Function Parameters: 

 0:8      'a' (in bool)

@@ -53,7 +359,289 @@
 0:13          1 (const uint)

 0:13          2 (const uint)

 0:13        'd' (temp 3-element array of 2-element array of highp int)

+0:44  Function Definition: foo(f1[5][7]; (global 4-element array of 7-element array of highp float)

+0:44    Function Parameters: 

+0:44      'a' (in 5-element array of 7-element array of highp float)

+0:?     Sequence

+0:47      move second child to first child (temp 7-element array of highp float)

+0:47        'r' (temp 7-element array of highp float)

+0:47        direct index (temp 7-element array of highp float)

+0:47          'a' (in 5-element array of 7-element array of highp float)

+0:47          Constant:

+0:47            2 (const int)

+0:48      Constant:

+0:48        0.000000

+0:49      Constant:

+0:49        0.000000

+0:50      Branch: Return with expression

+0:50        Construct float (temp 4-element array of 7-element array of float)

+0:50          direct index (temp 7-element array of highp float)

+0:50            'a' (in 5-element array of 7-element array of highp float)

+0:50            Constant:

+0:50              0 (const int)

+0:50          direct index (temp 7-element array of highp float)

+0:50            'a' (in 5-element array of 7-element array of highp float)

+0:50            Constant:

+0:50              1 (const int)

+0:50          'r' (temp 7-element array of highp float)

+0:50          direct index (temp 7-element array of highp float)

+0:50            'a' (in 5-element array of 7-element array of highp float)

+0:50            Constant:

+0:50              3 (const int)

+0:51      Branch: Return with expression

+0:51        Construct float (temp 4-element array of 7-element array of float)

+0:51          direct index (temp 7-element array of highp float)

+0:51            'a' (in 5-element array of 7-element array of highp float)

+0:51            Constant:

+0:51              0 (const int)

+0:51          direct index (temp 7-element array of highp float)

+0:51            'a' (in 5-element array of 7-element array of highp float)

+0:51            Constant:

+0:51              1 (const int)

+0:51          'r' (temp 7-element array of highp float)

+0:51          direct index (temp 7-element array of highp float)

+0:51            'a' (in 5-element array of 7-element array of highp float)

+0:51            Constant:

+0:51              3 (const int)

+0:52      Branch: Return with expression

+0:52        Construct float (temp 4-element array of 7-element array of float)

+0:52          direct index (temp 7-element array of highp float)

+0:52            'a' (in 5-element array of 7-element array of highp float)

+0:52            Constant:

+0:52              0 (const int)

+0:52          direct index (temp 7-element array of highp float)

+0:52            'a' (in 5-element array of 7-element array of highp float)

+0:52            Constant:

+0:52              1 (const int)

+0:52          direct index (temp 7-element array of highp float)

+0:52            'a' (in 5-element array of 7-element array of highp float)

+0:52            Constant:

+0:52              2 (const int)

+0:52          direct index (temp 7-element array of highp float)

+0:52            'a' (in 5-element array of 7-element array of highp float)

+0:52            Constant:

+0:52              3 (const int)

+0:55  Function Definition: bar(f1[5][7]; (global void)

+0:55    Function Parameters: 

+0:55      '' (in 5-element array of 7-element array of highp float)

+0:57  Function Definition: foo2( (global void)

+0:57    Function Parameters: 

+0:?     Sequence

+0:?       Sequence

+0:62        move second child to first child (temp highp float)

+0:62          direct index (temp highp float)

+0:62            direct index (temp 2-element array of highp float)

+0:62              direct index (temp 4-element array of 2-element array of highp float)

+0:62                'gu' (temp 3-element array of 4-element array of 2-element array of highp float)

+0:62                Constant:

+0:62                  2 (const int)

+0:62              Constant:

+0:62                4 (const int)

+0:62            Constant:

+0:62              1 (const int)

+0:62          Constant:

+0:62            4.000000

+0:64      Sequence

+0:64        move second child to first child (temp 3-element array of 2-element array of highp 4-component vector of float)

+0:64          'ca4' (temp 3-element array of 2-element array of highp 4-component vector of float)

+0:66          Constant:

+0:66            0.000000

+0:66            0.000000

+0:66            0.000000

+0:66            0.000000

+0:66            1.000000

+0:66            1.000000

+0:66            1.000000

+0:66            1.000000

+0:66            0.000000

+0:66            0.000000

+0:66            0.000000

+0:66            0.000000

+0:66            1.000000

+0:66            1.000000

+0:66            1.000000

+0:66            1.000000

+0:66            0.000000

+0:66            0.000000

+0:66            0.000000

+0:66            0.000000

+0:66            1.000000

+0:66            1.000000

+0:66            1.000000

+0:66            1.000000

+0:67      Sequence

+0:67        move second child to first child (temp 3-element array of 2-element array of highp 4-component vector of float)

+0:67          'caim' (temp 3-element array of 2-element array of highp 4-component vector of float)

+0:69          Constant:

+0:69            4.000000

+0:69            4.000000

+0:69            4.000000

+0:69            4.000000

+0:69            2.000000

+0:69            2.000000

+0:69            2.000000

+0:69            2.000000

+0:69            4.000000

+0:69            4.000000

+0:69            4.000000

+0:69            4.000000

+0:69            2.000000

+0:69            2.000000

+0:69            2.000000

+0:69            2.000000

+0:69            4.000000

+0:69            4.000000

+0:69            4.000000

+0:69            4.000000

+0:69            2.000000

+0:69            2.000000

+0:69            2.000000

+0:69            2.000000

+0:70      Sequence

+0:70        move second child to first child (temp 3-element array of 2-element array of highp 4-component vector of float)

+0:70          'caim2' (temp 3-element array of 2-element array of highp 4-component vector of float)

+0:72          Constant:

+0:72            4.000000

+0:72            4.000000

+0:72            4.000000

+0:72            4.000000

+0:72            2.000000

+0:72            2.000000

+0:72            2.000000

+0:72            2.000000

+0:72            4.000000

+0:72            4.000000

+0:72            4.000000

+0:72            4.000000

+0:72            2.000000

+0:72            2.000000

+0:72            2.000000

+0:72            2.000000

+0:72            4.000000

+0:72            4.000000

+0:72            4.000000

+0:72            4.000000

+0:72            2.000000

+0:72            2.000000

+0:72            2.000000

+0:72            2.000000

+0:73      Sequence

+0:73        move second child to first child (temp 3-element array of 2-element array of highp 4-component vector of float)

+0:73          'caim3' (temp 3-element array of 2-element array of highp 4-component vector of float)

+0:75          Constant:

+0:75            4.000000

+0:75            4.000000

+0:75            4.000000

+0:75            4.000000

+0:75            2.000000

+0:75            2.000000

+0:75            2.000000

+0:75            2.000000

+0:75            4.000000

+0:75            4.000000

+0:75            4.000000

+0:75            4.000000

+0:75            2.000000

+0:75            2.000000

+0:75            2.000000

+0:75            2.000000

+0:75            4.000000

+0:75            4.000000

+0:75            4.000000

+0:75            4.000000

+0:75            2.000000

+0:75            2.000000

+0:75            2.000000

+0:75            2.000000

+0:77      move second child to first child (temp 4-element array of 7-element array of highp float)

+0:77        'g4' (global 4-element array of 7-element array of highp float)

+0:77        Function Call: foo(f1[5][7]; (global 4-element array of 7-element array of highp float)

+0:77          'g5' (global 5-element array of 7-element array of highp float)

+0:78      'g5' (global 5-element array of 7-element array of highp float)

+0:79      'gu' (global 1-element array of 7-element array of highp float)

+0:81      Constant:

+0:81        0.000000

+0:82      Function Call: bar(f1[5][7]; (global void)

+0:82        'g5' (global 5-element array of 7-element array of highp float)

+0:84      Test condition and select (temp void)

+0:84        Condition

+0:84        Compare Equal (temp bool)

+0:84          Function Call: foo(f1[5][7]; (global 4-element array of 7-element array of highp float)

+0:84            'g5' (global 5-element array of 7-element array of highp float)

+0:84          'g4' (global 4-element array of 7-element array of highp float)

+0:84        true case is null

+0:86      Test condition and select (temp void)

+0:86        Condition

+0:86        Constant:

+0:86          false (const bool)

+0:86        true case is null

+0:90      move second child to first child (temp highp float)

+0:90        direct index (temp highp float)

+0:90          direct index (temp 7-element array of highp float)

+0:90            'u' (temp 5-element array of 7-element array of highp float)

+0:90            Constant:

+0:90              5 (const int)

+0:90          Constant:

+0:90            2 (const int)

+0:90        Constant:

+0:90          5.000000

+0:91      Function Call: foo(f1[5][7]; (global 4-element array of 7-element array of highp float)

+0:91        'u' (temp 5-element array of 7-element array of highp float)

+0:94      direct index (layout(column_major shared ) temp highp 4-component vector of float)

+0:94        v: direct index for structure (layout(column_major shared ) buffer implicitly-sized array of highp 4-component vector of float)

+0:94          direct index (layout(column_major shared ) temp block{layout(column_major shared ) buffer implicitly-sized array of highp float u, layout(column_major shared ) buffer implicitly-sized array of highp 4-component vector of float v})

+0:94            'name' (layout(column_major shared ) buffer 3-element array of block{layout(column_major shared ) buffer implicitly-sized array of highp float u, layout(column_major shared ) buffer implicitly-sized array of highp 4-component vector of float v})

+0:94            Constant:

+0:94              1 (const int)

+0:94          Constant:

+0:94            1 (const int)

+0:94        Constant:

+0:94          -1 (const int)

+0:95      move second child to first child (temp highp 4-component vector of float)

+0:95        direct index (layout(column_major shared ) temp highp 4-component vector of float)

+0:95          v: direct index for structure (layout(column_major shared ) buffer implicitly-sized array of highp 4-component vector of float)

+0:95            direct index (layout(column_major shared ) temp block{layout(column_major shared ) buffer implicitly-sized array of highp float u, layout(column_major shared ) buffer implicitly-sized array of highp 4-component vector of float v})

+0:95              'name' (layout(column_major shared ) buffer 3-element array of block{layout(column_major shared ) buffer implicitly-sized array of highp float u, layout(column_major shared ) buffer implicitly-sized array of highp 4-component vector of float v})

+0:95              Constant:

+0:95                1 (const int)

+0:95            Constant:

+0:95              1 (const int)

+0:95          Constant:

+0:95            1 (const int)

+0:95        Constant:

+0:95          4.300000

+0:95          4.300000

+0:95          4.300000

+0:95          4.300000

+0:96      v: direct index for structure (layout(column_major shared ) buffer implicitly-sized array of highp 4-component vector of float)

+0:96        direct index (layout(column_major shared ) temp block{layout(column_major shared ) buffer implicitly-sized array of highp float u, layout(column_major shared ) buffer implicitly-sized array of highp 4-component vector of float v})

+0:96          'name' (layout(column_major shared ) buffer 3-element array of block{layout(column_major shared ) buffer implicitly-sized array of highp float u, layout(column_major shared ) buffer implicitly-sized array of highp 4-component vector of float v})

+0:96          Constant:

+0:96            1 (const int)

+0:96        Constant:

+0:96          1 (const int)

+0:98      Constant:

+0:98        7 (const int)

+0:99      array length (temp highp int)

+0:99        v: direct index for structure (layout(column_major shared ) buffer implicitly-sized array of 7-element array of highp 4-component vector of float)

+0:99          direct index (layout(column_major shared ) temp block{layout(column_major shared ) buffer highp float u, layout(column_major shared ) buffer implicitly-sized array of 7-element array of highp 4-component vector of float v})

+0:99            'name3' (layout(column_major shared ) buffer 3-element array of block{layout(column_major shared ) buffer highp float u, layout(column_major shared ) buffer implicitly-sized array of 7-element array of highp 4-component vector of float v})

+0:99            Constant:

+0:99              0 (const int)

+0:99          Constant:

+0:99            1 (const int)

 0:?   Linker Objects

+0:?     'name' (layout(column_major shared ) buffer 3-element array of block{layout(column_major shared ) buffer implicitly-sized array of highp float u, layout(column_major shared ) buffer implicitly-sized array of highp 4-component vector of float v})

+0:?     'uname' (layout(column_major shared ) uniform 3-element array of block{layout(column_major shared ) uniform highp float u, layout(column_major shared ) uniform 1-element array of highp 4-component vector of float v})

+0:?     'name2' (layout(column_major shared ) buffer 3-element array of block{layout(column_major shared ) buffer highp float u, layout(column_major shared ) buffer implicitly-sized array of implicitly-sized array of highp 4-component vector of float v})

+0:?     'name3' (layout(column_major shared ) buffer 3-element array of block{layout(column_major shared ) buffer highp float u, layout(column_major shared ) buffer implicitly-sized array of 7-element array of highp 4-component vector of float v})

+0:?     'many' (global 1-element array of 2-element array of 3-element array of 4-element array of 5-element array of 6-element array of highp float)

+0:?     'gu' (global 1-element array of 7-element array of highp float)

+0:?     'g4' (global 4-element array of 7-element array of highp float)

+0:?     'g5' (global 5-element array of 7-element array of highp float)

+0:?     'inArray' (in 2-element array of 3-element array of highp float)

+0:?     'outArray' (smooth out 2-element array of 3-element array of highp float)

+0:?     'ubaaname' (layout(column_major shared ) uniform 2-element array of 3-element array of block{layout(column_major shared ) uniform highp int a})

 0:?     'gl_VertexID' (gl_VertexId highp int VertexId)

 0:?     'gl_InstanceID' (gl_InstanceId highp int InstanceId)

 

diff --git a/Test/baseResults/310implicitSizeArrayError.vert.out b/Test/baseResults/310implicitSizeArrayError.vert.out
index 958b668..a3b98f3 100644
--- a/Test/baseResults/310implicitSizeArrayError.vert.out
+++ b/Test/baseResults/310implicitSizeArrayError.vert.out
@@ -1,6 +1,6 @@
 310implicitSizeArrayError.vert

 Warning, version 310 is not yet complete; most version-specific features are present, but some are missing.

-ERROR: 0:3: 'implicitly-sized array in a block' : not supported with this profile: es

+ERROR: 0:3: '' : array size required 

 ERROR: 1 compilation errors.  No code generated.

 

 

diff --git a/Test/baseResults/430.comp.out b/Test/baseResults/430.comp.out
index 29f0f87..538caa0 100644
--- a/Test/baseResults/430.comp.out
+++ b/Test/baseResults/430.comp.out
@@ -2,7 +2,6 @@
 Warning, version 430 is not yet complete; most version-specific features are present, but some are missing.

 ERROR: 0:4: 'local_size' : cannot change previously set size 

 ERROR: 0:5: 'local_size' : too large; see gl_MaxComputeWorkGroupSize 

-ERROR: 0:23: 'values' : only the last member of a buffer block can be run-time sized 

 ERROR: 0:43: 'in' : global storage input qualifier cannot be used in a compute shader 

 ERROR: 0:43: 'location qualifier on input' : not supported in this stage: compute

 ERROR: 0:44: 'in' : global storage input qualifier cannot be used in a compute shader 

@@ -17,7 +16,7 @@
 ERROR: 0:77: '=' :  cannot convert from 'temp double' to 'temp int'

 ERROR: 0:81: 'input block' : not supported in this stage: compute

 ERROR: 0:85: 'output block' : not supported in this stage: compute

-ERROR: 17 compilation errors.  No code generated.

+ERROR: 16 compilation errors.  No code generated.

 

 

 Shader version: 430

diff --git a/Test/baseResults/preprocessor.defined.vert.err b/Test/baseResults/preprocessor.defined.vert.err
new file mode 100644
index 0000000..eae9912
--- /dev/null
+++ b/Test/baseResults/preprocessor.defined.vert.err
@@ -0,0 +1,4 @@
+ERROR: 0:2: '#define' : "defined" can't be (un)defined: defined

+ERROR: 1 compilation errors.  No code generated.

+

+

diff --git a/Test/baseResults/preprocessor.defined.vert.out b/Test/baseResults/preprocessor.defined.vert.out
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/Test/baseResults/preprocessor.defined.vert.out
diff --git a/Test/baseResults/spv.140.frag.out b/Test/baseResults/spv.140.frag.out
index e86e3f9..fae44fd 100755
--- a/Test/baseResults/spv.140.frag.out
+++ b/Test/baseResults/spv.140.frag.out
@@ -36,16 +36,23 @@
                               Decorate 34(gl_ClipDistance) BuiltIn ClipDistance

                               Decorate 43(k) Smooth

                               Decorate 86(samp2Da) NoStaticUse

+                              Decorate 89 ArrayStride 64

+                              Decorate 89 ArrayStride 64

                               MemberDecorate 90(bn) 0 RowMajor

                               MemberDecorate 90(bn) 0 Offset 0

+                              MemberDecorate 90(bn) 0 MatrixStride 16

                               MemberDecorate 90(bn) 1 ColMajor

                               MemberDecorate 90(bn) 1 Offset 256

+                              MemberDecorate 90(bn) 1 MatrixStride 16

                               MemberDecorate 90(bn) 2 RowMajor

                               MemberDecorate 90(bn) 2 Offset 512

+                              MemberDecorate 90(bn) 2 MatrixStride 16

                               MemberDecorate 90(bn) 3 ColMajor

                               MemberDecorate 90(bn) 3 Offset 576

+                              MemberDecorate 90(bn) 3 MatrixStride 16

                               MemberDecorate 90(bn) 4 RowMajor

                               MemberDecorate 90(bn) 4 Offset 640

+                              MemberDecorate 90(bn) 4 MatrixStride 16

                               Decorate 90(bn) Block

                               Decorate 92 NoStaticUse

                2:             TypeVoid

diff --git a/Test/baseResults/spv.300layoutp.vert.out b/Test/baseResults/spv.300layoutp.vert.out
index 1c78f6f..2f4104a 100755
--- a/Test/baseResults/spv.300layoutp.vert.out
+++ b/Test/baseResults/spv.300layoutp.vert.out
@@ -46,10 +46,13 @@
                               Decorate 12(p) Location 3

                               MemberDecorate 18(Transform) 0 RowMajor

                               MemberDecorate 18(Transform) 0 Offset 0

+                              MemberDecorate 18(Transform) 0 MatrixStride 16

                               MemberDecorate 18(Transform) 1 ColMajor

                               MemberDecorate 18(Transform) 1 Offset 64

+                              MemberDecorate 18(Transform) 1 MatrixStride 16

                               MemberDecorate 18(Transform) 2 RowMajor

                               MemberDecorate 18(Transform) 2 Offset 128

+                              MemberDecorate 18(Transform) 2 MatrixStride 16

                               MemberDecorate 18(Transform) 3 Offset 176

                               Decorate 18(Transform) Block

                               MemberDecorate 34(T3) 0 ColMajor

diff --git a/Test/baseResults/spv.310.comp.out b/Test/baseResults/spv.310.comp.out
index d1f8a9a..b8c7b88 100644
--- a/Test/baseResults/spv.310.comp.out
+++ b/Test/baseResults/spv.310.comp.out
@@ -5,4 +5,117 @@
 Linked compute stage:

 

 

-Missing functionality: Unsized array

+// Module Version 99

+// Generated by (magic number): 51a00bb

+// Id's are bound by 68

+

+                              Source ESSL 310

+                              Capability Shader

+               1:             ExtInstImport  "GLSL.std.450"

+                              MemoryModel Logical GLSL450

+                              EntryPoint GLCompute 4  "main"

+                              Name 4  "main"

+                              Name 14  "outb"

+                              MemberName 14(outb) 0  "f"

+                              MemberName 14(outb) 1  "g"

+                              MemberName 14(outb) 2  "h"

+                              MemberName 14(outb) 3  "uns"

+                              Name 16  "outbname"

+                              Name 20  "s"

+                              Name 25  "outbna"

+                              MemberName 25(outbna) 0  "k"

+                              MemberName 25(outbna) 1  "na"

+                              Name 27  "outbnamena"

+                              Name 44  "i"

+                              Name 50  "outs"

+                              MemberName 50(outs) 0  "s"

+                              MemberName 50(outs) 1  "va"

+                              Name 52  "outnames"

+                              Name 55  "gl_LocalInvocationID"

+                              Decorate 14(outb) GLSLShared

+                              Decorate 14(outb) BufferBlock

+                              Decorate 25(outbna) GLSLShared

+                              Decorate 25(outbna) BufferBlock

+                              Decorate 50(outs) GLSLShared

+                              Decorate 50(outs) BufferBlock

+                              Decorate 55(gl_LocalInvocationID) BuiltIn LocalInvocationId

+                              Decorate 67 BuiltIn WorkgroupSize

+                              Decorate 67 NoStaticUse

+               2:             TypeVoid

+               3:             TypeFunction 2

+               7:             TypeInt 32 0

+               8:      7(int) Constant 1

+               9:      7(int) Constant 1023

+              10:      7(int) Constant 0

+              11:             TypeFloat 32

+              12:             TypeVector 11(float) 3

+              13:             TypeRuntimeArray 12(fvec3)

+        14(outb):             TypeStruct 11(float) 11(float) 11(float) 13

+              15:             TypePointer Uniform 14(outb)

+    16(outbname):     15(ptr) Variable Uniform

+              17:             TypeInt 32 1

+              18:     17(int) Constant 0

+              19:             TypePointer WorkgroupLocal 11(float)

+           20(s):     19(ptr) Variable WorkgroupLocal

+              22:             TypePointer Uniform 11(float)

+              24:             TypeVector 11(float) 4

+      25(outbna):             TypeStruct 17(int) 24(fvec4)

+              26:             TypePointer Uniform 25(outbna)

+  27(outbnamena):     26(ptr) Variable Uniform

+              28:     17(int) Constant 1

+              31:             TypePointer Uniform 24(fvec4)

+              33:     17(int) Constant 3

+              34:     17(int) Constant 18

+              35:             TypePointer Uniform 12(fvec3)

+              39:     17(int) Constant 17

+              40:   11(float) Constant 1077936128

+              41:   12(fvec3) ConstantComposite 40 40 40

+              43:             TypePointer WorkgroupLocal 17(int)

+           44(i):     43(ptr) Variable WorkgroupLocal

+              49:             TypeRuntimeArray 24(fvec4)

+        50(outs):             TypeStruct 17(int) 49

+              51:             TypePointer Uniform 50(outs)

+    52(outnames):     51(ptr) Variable Uniform

+              53:             TypeVector 7(int) 3

+              54:             TypePointer Input 53(ivec3)

+55(gl_LocalInvocationID):     54(ptr) Variable Input

+              62:             TypePointer Uniform 17(int)

+              64:      7(int) Constant 16

+              65:      7(int) Constant 32

+              66:      7(int) Constant 4

+              67:   53(ivec3) ConstantComposite 64 65 66

+         4(main):           2 Function None 3

+               5:             Label

+                              MemoryBarrier 8 9

+                              ControlBarrier 8 8 10

+              21:   11(float) Load 20(s)

+              23:     22(ptr) AccessChain 16(outbname) 18

+                              Store 23 21

+              29:   11(float) Load 20(s)

+              30:   24(fvec4) CompositeConstruct 29 29 29 29

+              32:     31(ptr) AccessChain 27(outbnamena) 28

+                              Store 32 30

+              36:     35(ptr) AccessChain 16(outbname) 33 34

+              37:   12(fvec3) Load 36

+              38:   11(float) CompositeExtract 37 0

+                              Store 20(s) 38

+              42:     35(ptr) AccessChain 16(outbname) 33 39

+                              Store 42 41

+              45:     17(int) Load 44(i)

+              46:   11(float) Load 20(s)

+              47:   12(fvec3) CompositeConstruct 46 46 46

+              48:     35(ptr) AccessChain 16(outbname) 33 45

+                              Store 48 47

+              56:   53(ivec3) Load 55(gl_LocalInvocationID)

+              57:      7(int) CompositeExtract 56 0

+              58:   11(float) Load 20(s)

+              59:   24(fvec4) CompositeConstruct 58 58 58 58

+              60:     31(ptr) AccessChain 52(outnames) 28 57

+                              Store 60 59

+              61:     17(int) ArrayLength 16(outbname)

+              63:     62(ptr) AccessChain 52(outnames) 18

+                              Store 63 61

+                              Branch 6

+               6:             Label

+                              Return

+                              FunctionEnd

diff --git a/Test/baseResults/spv.AofA.frag.out b/Test/baseResults/spv.AofA.frag.out
new file mode 100644
index 0000000..bda0df3
--- /dev/null
+++ b/Test/baseResults/spv.AofA.frag.out
@@ -0,0 +1,154 @@
+spv.AofA.frag

+Warning, version 430 is not yet complete; most version-specific features are present, but some are missing.

+

+

+Linked fragment stage:

+

+

+// Module Version 99

+// Generated by (magic number): 51a00bb

+// Id's are bound by 104

+

+                              Source GLSL 430

+                              Capability Shader

+               1:             ExtInstImport  "GLSL.std.450"

+                              MemoryModel Logical GLSL450

+                              EntryPoint Fragment 4  "main"

+                              ExecutionMode 4 OriginLowerLeft

+                              Name 4  "main"

+                              Name 18  "foo(f1[5][7];"

+                              Name 17  "a"

+                              Name 21  "r"

+                              Name 39  "outfloat"

+                              Name 42  "g4"

+                              Name 44  "g5"

+                              Name 45  "param"

+                              Name 48  "u"

+                              Name 52  "param"

+                              Name 66  "many"

+                              Name 68  "i"

+                              Name 70  "j"

+                              Name 72  "k"

+                              Name 78  "infloat"

+                              Name 94  "uAofA"

+                              MemberName 94(uAofA) 0  "f"

+                              Name 98  "nameAofA"

+                              Decorate 44(g5) Smooth

+                              Decorate 78(infloat) Smooth

+                              Decorate 94(uAofA) GLSLShared

+                              Decorate 94(uAofA) Block

+               2:             TypeVoid

+               3:             TypeFunction 2

+               7:             TypeFloat 32

+               8:             TypeInt 32 0

+               9:      8(int) Constant 7

+              10:             TypeArray 7(float) 9

+              11:      8(int) Constant 5

+              12:             TypeArray 10 11

+              13:             TypePointer Function 12

+              14:      8(int) Constant 4

+              15:             TypeArray 10 14

+              16:             TypeFunction 15 13(ptr)

+              20:             TypePointer Function 10

+              22:             TypeInt 32 1

+              23:     22(int) Constant 2

+              26:     22(int) Constant 0

+              29:     22(int) Constant 1

+              33:     22(int) Constant 3

+              38:             TypePointer Output 7(float)

+    39(outfloat):     38(ptr) Variable Output

+              40:    7(float) Constant 0

+              41:             TypePointer PrivateGlobal 15

+          42(g4):     41(ptr) Variable PrivateGlobal

+              43:             TypePointer Input 12

+          44(g5):     43(ptr) Variable Input

+              49:    7(float) Constant 1077936128

+              50:             TypePointer Function 7(float)

+              55:      8(int) Constant 6

+              56:             TypeArray 7(float) 55

+              57:             TypeArray 56 11

+              58:             TypeArray 57 14

+              59:      8(int) Constant 3

+              60:             TypeArray 58 59

+              61:      8(int) Constant 2

+              62:             TypeArray 60 61

+              63:      8(int) Constant 1

+              64:             TypeArray 62 63

+              65:             TypePointer PrivateGlobal 64

+        66(many):     65(ptr) Variable PrivateGlobal

+              67:             TypePointer UniformConstant 22(int)

+           68(i):     67(ptr) Variable UniformConstant

+           70(j):     67(ptr) Variable UniformConstant

+           72(k):     67(ptr) Variable UniformConstant

+              77:             TypePointer Input 7(float)

+     78(infloat):     77(ptr) Variable Input

+              80:             TypePointer PrivateGlobal 7(float)

+              92:             TypeArray 7(float) 14

+              93:             TypeArray 92 61

+       94(uAofA):             TypeStruct 93

+              95:             TypeArray 94(uAofA) 11

+              96:             TypeArray 95 59

+              97:             TypePointer Uniform 96

+    98(nameAofA):     97(ptr) Variable Uniform

+              99:             TypePointer Uniform 7(float)

+         4(main):           2 Function None 3

+               5:             Label

+       45(param):     13(ptr) Variable Function

+           48(u):     13(ptr) Variable Function

+       52(param):     13(ptr) Variable Function

+                              Store 39(outfloat) 40

+              46:          12 Load 44(g5)

+                              Store 45(param) 46

+              47:          15 FunctionCall 18(foo(f1[5][7];) 45(param)

+                              Store 42(g4) 47

+              51:     50(ptr) AccessChain 48(u) 23 23

+                              Store 51 49

+              53:          12 Load 48(u)

+                              Store 52(param) 53

+              54:          15 FunctionCall 18(foo(f1[5][7];) 52(param)

+              69:     22(int) Load 68(i)

+              71:     22(int) Load 70(j)

+              73:     22(int) Load 72(k)

+              74:     22(int) Load 68(i)

+              75:     22(int) Load 70(j)

+              76:     22(int) Load 72(k)

+              79:    7(float) Load 78(infloat)

+              81:     80(ptr) AccessChain 66(many) 69 71 73 74 75 76

+                              Store 81 79

+              82:     22(int) Load 70(j)

+              83:     22(int) Load 70(j)

+              84:     22(int) Load 70(j)

+              85:     22(int) Load 70(j)

+              86:     22(int) Load 70(j)

+              87:     22(int) Load 70(j)

+              88:     80(ptr) AccessChain 66(many) 82 83 84 85 86 87

+              89:    7(float) Load 88

+              90:    7(float) Load 39(outfloat)

+              91:    7(float) FAdd 90 89

+                              Store 39(outfloat) 91

+             100:     99(ptr) AccessChain 98(nameAofA) 29 23 26 26 33

+             101:    7(float) Load 100

+             102:    7(float) Load 39(outfloat)

+             103:    7(float) FAdd 102 101

+                              Store 39(outfloat) 103

+                              Branch 6

+               6:             Label

+                              Return

+                              FunctionEnd

+18(foo(f1[5][7];):          15 Function None 16

+           17(a):     13(ptr) FunctionParameter

+              19:             Label

+           21(r):     20(ptr) Variable Function

+              24:     20(ptr) AccessChain 17(a) 23

+              25:          10 Load 24

+                              Store 21(r) 25

+              27:     20(ptr) AccessChain 17(a) 26

+              28:          10 Load 27

+              30:     20(ptr) AccessChain 17(a) 29

+              31:          10 Load 30

+              32:          10 Load 21(r)

+              34:     20(ptr) AccessChain 17(a) 33

+              35:          10 Load 34

+              36:          15 CompositeConstruct 28 31 32 35

+                              ReturnValue 36

+                              FunctionEnd

diff --git a/Test/baseResults/spv.Operations.frag.out b/Test/baseResults/spv.Operations.frag.out
index 9858f85..909bb23 100755
--- a/Test/baseResults/spv.Operations.frag.out
+++ b/Test/baseResults/spv.Operations.frag.out
@@ -51,7 +51,7 @@
              292:     19(int) Constant 2

              299:     19(int) Constant 1

              301:             TypePointer Function 7(float)

-             332:             TypeVector 7(float) 3

+             331:             TypeVector 7(float) 3

              347:    7(float) Constant 1073741824

              354:    7(float) Constant 1065353216

              359:     19(int) Constant 66

@@ -434,11 +434,11 @@
              329:    7(float) Load 302(f)

              330:    7(float) FAdd 329 328

                               Store 302(f) 330

-             331:    8(fvec4) Load 10(v)

-             333:  332(fvec3) VectorShuffle 331 331 0 1 2

+             332:    8(fvec4) Load 10(v)

+             333:  331(fvec3) VectorShuffle 332 332 0 1 2

              334:    8(fvec4) Load 10(v)

-             335:  332(fvec3) VectorShuffle 334 334 0 1 2

-             336:  332(fvec3) ExtInst 1(GLSL.std.450) 67(Cross) 333 335

+             335:  331(fvec3) VectorShuffle 334 334 0 1 2

+             336:  331(fvec3) ExtInst 1(GLSL.std.450) 67(Cross) 333 335

              337:    7(float) CompositeExtract 336 0

              338:    7(float) Load 302(f)

              339:    7(float) FAdd 338 337

diff --git a/Test/baseResults/spv.accessChain.frag.out b/Test/baseResults/spv.accessChain.frag.out
index f45cc34..c280bff 100755
--- a/Test/baseResults/spv.accessChain.frag.out
+++ b/Test/baseResults/spv.accessChain.frag.out
@@ -86,7 +86,7 @@
               67:     14(int) Constant 0

               68:             TypeInt 32 0

               69:     68(int) Constant 0

-              97:             TypeVector 7(float) 2

+              96:             TypeVector 7(float) 2

              110:     68(int) Constant 2

              142:    7(float) Constant 0

              143:    8(fvec3) ConstantComposite 142 142 142

@@ -227,8 +227,8 @@
         34(comp):     15(ptr) FunctionParameter

               36:             Label

               95:     14(int) Load 34(comp)

-              96:    8(fvec3) CompositeExtract 33(i) 0

-              98:   97(fvec2) VectorShuffle 96 96 1 0

+              97:    8(fvec3) CompositeExtract 33(i) 0

+              98:   96(fvec2) VectorShuffle 97 97 1 0

               99:    7(float) VectorExtractDynamic 98 95

              100:    8(fvec3) Load 66(OutColor)

              101:    8(fvec3) CompositeConstruct 99 99 99

@@ -241,10 +241,10 @@
         38(comp):     15(ptr) FunctionParameter

               40:             Label

              103:    8(fvec3) CompositeExtract 37(i) 0

-             104:   97(fvec2) VectorShuffle 103 103 0 1

+             104:   96(fvec2) VectorShuffle 103 103 0 1

              105:    8(fvec3) Load 66(OutColor)

-             106:   97(fvec2) VectorShuffle 105 105 0 1

-             107:   97(fvec2) FAdd 106 104

+             106:   96(fvec2) VectorShuffle 105 105 0 1

+             107:   96(fvec2) FAdd 106 104

              108:    8(fvec3) Load 66(OutColor)

              109:    8(fvec3) VectorShuffle 108 107 3 4 2

                               Store 66(OutColor) 109

@@ -279,10 +279,10 @@
         50(comp):     15(ptr) FunctionParameter

               52:             Label

              121:    8(fvec3) CompositeExtract 49(i) 0

-             122:   97(fvec2) VectorShuffle 121 121 0 1

+             122:   96(fvec2) VectorShuffle 121 121 0 1

              123:    8(fvec3) Load 66(OutColor)

-             124:   97(fvec2) VectorShuffle 123 123 2 1

-             125:   97(fvec2) FAdd 124 122

+             124:   96(fvec2) VectorShuffle 123 123 2 1

+             125:   96(fvec2) FAdd 124 122

              126:    8(fvec3) Load 66(OutColor)

              127:    8(fvec3) VectorShuffle 126 125 0 4 3

                               Store 66(OutColor) 127

@@ -293,10 +293,10 @@
         54(comp):     15(ptr) FunctionParameter

               56:             Label

              128:    8(fvec3) CompositeExtract 53(i) 0

-             129:   97(fvec2) VectorShuffle 128 128 0 1

+             129:   96(fvec2) VectorShuffle 128 128 0 1

              130:    8(fvec3) Load 66(OutColor)

-             131:   97(fvec2) VectorShuffle 130 130 0 2

-             132:   97(fvec2) FAdd 131 129

+             131:   96(fvec2) VectorShuffle 130 130 0 2

+             132:   96(fvec2) FAdd 131 129

              133:    8(fvec3) Load 66(OutColor)

              134:    8(fvec3) VectorShuffle 133 132 3 1 4

                               Store 66(OutColor) 134

diff --git a/Test/baseResults/spv.double.comp.out b/Test/baseResults/spv.double.comp.out
index 3f2ca15..d77bc0c 100755
--- a/Test/baseResults/spv.double.comp.out
+++ b/Test/baseResults/spv.double.comp.out
@@ -57,7 +57,7 @@
               25:             TypeVector 24(int) 3

               26:             TypePointer Input 25(ivec3)

 27(gl_GlobalInvocationID):     26(ptr) Variable Input

-              29:             TypeVector 24(int) 2

+              28:             TypeVector 24(int) 2

               32:             TypePointer Function 8(float)

 34(gl_LocalInvocationID):     26(ptr) Variable Input

               38:     12(int) Constant 8

@@ -86,12 +86,12 @@
                               Store 16 14

               20:     19(ptr) AccessChain 11(bufInst) 17

                               Store 20 18

-              28:   25(ivec3) Load 27(gl_GlobalInvocationID)

-              30:   29(ivec2) VectorShuffle 28 28 0 1

+              29:   25(ivec3) Load 27(gl_GlobalInvocationID)

+              30:   28(ivec2) VectorShuffle 29 29 0 1

               31:   21(ivec2) Bitcast 30

                               Store 23(storePos) 31

               35:   25(ivec3) Load 34(gl_LocalInvocationID)

-              36:   29(ivec2) VectorShuffle 35 35 0 1

+              36:   28(ivec2) VectorShuffle 35 35 0 1

               37:   21(ivec2) Bitcast 36

               39:   21(ivec2) CompositeConstruct 38 38

               40:   21(ivec2) ISub 37 39

diff --git a/Test/baseResults/spv.forLoop.frag.out b/Test/baseResults/spv.forLoop.frag.out
index 972ecea..75949a0 100755
--- a/Test/baseResults/spv.forLoop.frag.out
+++ b/Test/baseResults/spv.forLoop.frag.out
@@ -58,7 +58,7 @@
               50:             TypePointer UniformConstant 49(ivec4)

           51(v4):     50(ptr) Variable UniformConstant

               71:     48(int) Constant 4

-              86:             TypeVector 7(float) 3

+              85:             TypeVector 7(float) 3

               97:             TypePointer Input 7(float)

            98(f):     97(ptr) Variable Input

              116:     14(int) Constant 16

@@ -145,8 +145,8 @@
               82:    8(fvec4) Load 36(gl_FragColor)

               83:    8(fvec4) FAdd 82 81

                               Store 36(gl_FragColor) 83

-              85:    8(fvec4) Load 12(BaseColor)

-              87:   86(fvec3) VectorShuffle 85 85 0 1 2

+              86:    8(fvec4) Load 12(BaseColor)

+              87:   85(fvec3) VectorShuffle 86 86 0 1 2

               88:    8(fvec4) Load 84(r)

               89:    8(fvec4) VectorShuffle 88 87 4 5 6 3

                               Store 84(r) 89

@@ -169,10 +169,10 @@
                                 Branch 91

               92:             Label

              104:    8(fvec4) Load 84(r)

-             105:   86(fvec3) VectorShuffle 104 104 0 1 2

+             105:   85(fvec3) VectorShuffle 104 104 0 1 2

              106:    8(fvec4) Load 36(gl_FragColor)

-             107:   86(fvec3) VectorShuffle 106 106 0 1 2

-             108:   86(fvec3) FAdd 107 105

+             107:   85(fvec3) VectorShuffle 106 106 0 1 2

+             108:   85(fvec3) FAdd 107 105

              109:    8(fvec4) Load 36(gl_FragColor)

              110:    8(fvec4) VectorShuffle 109 108 4 5 6 3

                               Store 36(gl_FragColor) 110

diff --git a/Test/baseResults/spv.newTexture.frag.out b/Test/baseResults/spv.newTexture.frag.out
index a4e375d..1e862e1 100644
--- a/Test/baseResults/spv.newTexture.frag.out
+++ b/Test/baseResults/spv.newTexture.frag.out
@@ -5,4 +5,341 @@
 Linked fragment stage:

 

 

-Missing functionality: texel fetch

+// Module Version 99

+// Generated by (magic number): 51a00bb

+// Id's are bound by 256

+

+                              Source GLSL 430

+                              Capability Shader

+               1:             ExtInstImport  "GLSL.std.450"

+                              MemoryModel Logical GLSL450

+                              EntryPoint Fragment 4  "main"

+                              ExecutionMode 4 OriginLowerLeft

+                              Name 4  "main"

+                              Name 10  "v"

+                              Name 14  "s2D"

+                              Name 18  "c2D"

+                              Name 24  "s3D"

+                              Name 27  "c4D"

+                              Name 35  "s2DArray"

+                              Name 39  "c3D"

+                              Name 48  "s2DShadow"

+                              Name 56  "c1D"

+                              Name 68  "ic3D"

+                              Name 71  "ic1D"

+                              Name 78  "ic2D"

+                              Name 103  "sCube"

+                              Name 114  "s2DArrayShadow"

+                              Name 142  "iv"

+                              Name 146  "is2D"

+                              Name 181  "is3D"

+                              Name 193  "isCube"

+                              Name 205  "is2DArray"

+                              Name 215  "iv2"

+                              Name 219  "sCubeShadow"

+                              Name 224  "FragData"

+                              Name 236  "is2Dms"

+                              Name 241  "us2D"

+                              Name 245  "us3D"

+                              Name 249  "usCube"

+                              Name 253  "us2DArray"

+                              Name 255  "ic4D"

+                              Decorate 18(c2D) Smooth

+                              Decorate 27(c4D) Smooth

+                              Decorate 39(c3D) Smooth

+                              Decorate 56(c1D) Smooth

+                              Decorate 68(ic3D) Flat

+                              Decorate 71(ic1D) Flat

+                              Decorate 78(ic2D) Flat

+                              Decorate 236(is2Dms) NoStaticUse

+                              Decorate 241(us2D) NoStaticUse

+                              Decorate 245(us3D) NoStaticUse

+                              Decorate 249(usCube) NoStaticUse

+                              Decorate 253(us2DArray) NoStaticUse

+                              Decorate 255(ic4D) Flat

+                              Decorate 255(ic4D) NoStaticUse

+               2:             TypeVoid

+               3:             TypeFunction 2

+               7:             TypeFloat 32

+               8:             TypeVector 7(float) 4

+               9:             TypePointer Function 8(fvec4)

+              11:             TypeImage 7(float) 2D sampled format:Unknown

+              12:             TypeSampledImage 11

+              13:             TypePointer UniformConstant 12

+         14(s2D):     13(ptr) Variable UniformConstant

+              16:             TypeVector 7(float) 2

+              17:             TypePointer Input 16(fvec2)

+         18(c2D):     17(ptr) Variable Input

+              21:             TypeImage 7(float) 3D sampled format:Unknown

+              22:             TypeSampledImage 21

+              23:             TypePointer UniformConstant 22

+         24(s3D):     23(ptr) Variable UniformConstant

+              26:             TypePointer Input 8(fvec4)

+         27(c4D):     26(ptr) Variable Input

+              32:             TypeImage 7(float) 2D array sampled format:Unknown

+              33:             TypeSampledImage 32

+              34:             TypePointer UniformConstant 33

+    35(s2DArray):     34(ptr) Variable UniformConstant

+              37:             TypeVector 7(float) 3

+              38:             TypePointer Input 37(fvec3)

+         39(c3D):     38(ptr) Variable Input

+              41:    7(float) Constant 1067030938

+              45:             TypeImage 7(float) 2D depth sampled format:Unknown

+              46:             TypeSampledImage 45

+              47:             TypePointer UniformConstant 46

+   48(s2DShadow):     47(ptr) Variable UniformConstant

+              51:             TypeInt 32 1

+              52:             TypeVector 51(int) 2

+              53:     51(int) Constant 3

+              54:   52(ivec2) ConstantComposite 53 53

+              55:             TypePointer Input 7(float)

+         56(c1D):     55(ptr) Variable Input

+              66:             TypeVector 51(int) 3

+              67:             TypePointer Input 66(ivec3)

+        68(ic3D):     67(ptr) Variable Input

+              70:             TypePointer Input 51(int)

+        71(ic1D):     70(ptr) Variable Input

+              77:             TypePointer Input 52(ivec2)

+        78(ic2D):     77(ptr) Variable Input

+              80:     51(int) Constant 4

+             100:             TypeImage 7(float) Cube sampled format:Unknown

+             101:             TypeSampledImage 100

+             102:             TypePointer UniformConstant 101

+      103(sCube):    102(ptr) Variable UniformConstant

+             111:             TypeImage 7(float) 2D depth array sampled format:Unknown

+             112:             TypeSampledImage 111

+             113:             TypePointer UniformConstant 112

+114(s2DArrayShadow):    113(ptr) Variable UniformConstant

+             140:             TypeVector 51(int) 4

+             141:             TypePointer Function 140(ivec4)

+             143:             TypeImage 51(int) 2D sampled format:Unknown

+             144:             TypeSampledImage 143

+             145:             TypePointer UniformConstant 144

+       146(is2D):    145(ptr) Variable UniformConstant

+             178:             TypeImage 51(int) 3D sampled format:Unknown

+             179:             TypeSampledImage 178

+             180:             TypePointer UniformConstant 179

+       181(is3D):    180(ptr) Variable UniformConstant

+             184:    7(float) Constant 1082549862

+             190:             TypeImage 51(int) Cube sampled format:Unknown

+             191:             TypeSampledImage 190

+             192:             TypePointer UniformConstant 191

+     193(isCube):    192(ptr) Variable UniformConstant

+             202:             TypeImage 51(int) 2D array sampled format:Unknown

+             203:             TypeSampledImage 202

+             204:             TypePointer UniformConstant 203

+  205(is2DArray):    204(ptr) Variable UniformConstant

+             214:             TypePointer Function 52(ivec2)

+             216:             TypeImage 7(float) Cube depth sampled format:Unknown

+             217:             TypeSampledImage 216

+             218:             TypePointer UniformConstant 217

+219(sCubeShadow):    218(ptr) Variable UniformConstant

+             221:     51(int) Constant 2

+             223:             TypePointer Output 8(fvec4)

+   224(FragData):    223(ptr) Variable Output

+             228:    7(float) Constant 0

+             233:             TypeImage 51(int) 2D multi-sampled sampled format:Unknown

+             234:             TypeSampledImage 233

+             235:             TypePointer UniformConstant 234

+     236(is2Dms):    235(ptr) Variable UniformConstant

+             237:             TypeInt 32 0

+             238:             TypeImage 237(int) 2D sampled format:Unknown

+             239:             TypeSampledImage 238

+             240:             TypePointer UniformConstant 239

+       241(us2D):    240(ptr) Variable UniformConstant

+             242:             TypeImage 237(int) 3D sampled format:Unknown

+             243:             TypeSampledImage 242

+             244:             TypePointer UniformConstant 243

+       245(us3D):    244(ptr) Variable UniformConstant

+             246:             TypeImage 237(int) Cube sampled format:Unknown

+             247:             TypeSampledImage 246

+             248:             TypePointer UniformConstant 247

+     249(usCube):    248(ptr) Variable UniformConstant

+             250:             TypeImage 237(int) 2D array sampled format:Unknown

+             251:             TypeSampledImage 250

+             252:             TypePointer UniformConstant 251

+  253(us2DArray):    252(ptr) Variable UniformConstant

+             254:             TypePointer Input 140(ivec4)

+       255(ic4D):    254(ptr) Variable Input

+         4(main):           2 Function None 3

+               5:             Label

+           10(v):      9(ptr) Variable Function

+         142(iv):    141(ptr) Variable Function

+        215(iv2):    214(ptr) Variable Function

+              15:          12 Load 14(s2D)

+              19:   16(fvec2) Load 18(c2D)

+              20:    8(fvec4) ImageSampleImplicitLod 15 19

+                              Store 10(v) 20

+              25:          22 Load 24(s3D)

+              28:    8(fvec4) Load 27(c4D)

+              29:    8(fvec4) ImageSampleProjImplicitLod 25 28

+              30:    8(fvec4) Load 10(v)

+              31:    8(fvec4) FAdd 30 29

+                              Store 10(v) 31

+              36:          33 Load 35(s2DArray)

+              40:   37(fvec3) Load 39(c3D)

+              42:    8(fvec4) ImageSampleExplicitLod 36 40 41

+              43:    8(fvec4) Load 10(v)

+              44:    8(fvec4) FAdd 43 42

+                              Store 10(v) 44

+              49:          46 Load 48(s2DShadow)

+              50:   37(fvec3) Load 39(c3D)

+              57:    7(float) Load 56(c1D)

+              58:    7(float) CompositeExtract 50 2

+              59:    7(float) ImageSampleDrefImplicitLod 49 50 58 57 54

+              60:    8(fvec4) Load 10(v)

+              61:    7(float) CompositeExtract 60 1

+              62:    7(float) FAdd 61 59

+              63:    8(fvec4) Load 10(v)

+              64:    8(fvec4) CompositeInsert 62 63 1

+                              Store 10(v) 64

+              65:          22 Load 24(s3D)

+              69:   66(ivec3) Load 68(ic3D)

+              72:     51(int) Load 71(ic1D)

+              73:    8(fvec4) ImageFetch 65 69

+              74:    8(fvec4) Load 10(v)

+              75:    8(fvec4) FAdd 74 73

+                              Store 10(v) 75

+              76:          12 Load 14(s2D)

+              79:   52(ivec2) Load 78(ic2D)

+              81:    8(fvec4) ImageFetch 76 79 80

+              82:    8(fvec4) Load 10(v)

+              83:    8(fvec4) FAdd 82 81

+                              Store 10(v) 83

+              84:          46 Load 48(s2DShadow)

+              85:   37(fvec3) Load 39(c3D)

+              86:    7(float) Load 56(c1D)

+              87:    7(float) CompositeExtract 85 2

+              88:    7(float) ImageSampleDrefExplicitLod 84 85 87 86 54

+              89:    8(fvec4) Load 10(v)

+              90:    7(float) CompositeExtract 89 1

+              91:    7(float) FAdd 90 88

+              92:    8(fvec4) Load 10(v)

+              93:    8(fvec4) CompositeInsert 91 92 1

+                              Store 10(v) 93

+              94:          12 Load 14(s2D)

+              95:   37(fvec3) Load 39(c3D)

+              96:    7(float) Load 56(c1D)

+              97:    8(fvec4) ImageSampleProjExplicitLod 94 95 96 54

+              98:    8(fvec4) Load 10(v)

+              99:    8(fvec4) FAdd 98 97

+                              Store 10(v) 99

+             104:         101 Load 103(sCube)

+             105:   37(fvec3) Load 39(c3D)

+             106:   37(fvec3) Load 39(c3D)

+             107:   37(fvec3) Load 39(c3D)

+             108:    8(fvec4) ImageSampleExplicitLod 104 105 106 107

+             109:    8(fvec4) Load 10(v)

+             110:    8(fvec4) FAdd 109 108

+                              Store 10(v) 110

+             115:         112 Load 114(s2DArrayShadow)

+             116:    8(fvec4) Load 27(c4D)

+             117:   16(fvec2) Load 18(c2D)

+             118:   16(fvec2) Load 18(c2D)

+             119:    7(float) CompositeExtract 116 3

+             120:    7(float) ImageSampleDrefExplicitLod 115 116 119 117 118 54

+             121:    8(fvec4) Load 10(v)

+             122:    7(float) CompositeExtract 121 0

+             123:    7(float) FAdd 122 120

+             124:    8(fvec4) Load 10(v)

+             125:    8(fvec4) CompositeInsert 123 124 0

+                              Store 10(v) 125

+             126:          22 Load 24(s3D)

+             127:    8(fvec4) Load 27(c4D)

+             128:   37(fvec3) Load 39(c3D)

+             129:   37(fvec3) Load 39(c3D)

+             130:    8(fvec4) ImageSampleProjExplicitLod 126 127 128 129

+             131:    8(fvec4) Load 10(v)

+             132:    8(fvec4) FAdd 131 130

+                              Store 10(v) 132

+             133:          12 Load 14(s2D)

+             134:   37(fvec3) Load 39(c3D)

+             135:   16(fvec2) Load 18(c2D)

+             136:   16(fvec2) Load 18(c2D)

+             137:    8(fvec4) ImageSampleProjExplicitLod 133 134 135 136 54

+             138:    8(fvec4) Load 10(v)

+             139:    8(fvec4) FAdd 138 137

+                              Store 10(v) 139

+             147:         144 Load 146(is2D)

+             148:   16(fvec2) Load 18(c2D)

+             149:  140(ivec4) ImageSampleImplicitLod 147 148

+                              Store 142(iv) 149

+             150:  140(ivec4) Load 142(iv)

+             151:    8(fvec4) ConvertSToF 150

+             152:    8(fvec4) Load 10(v)

+             153:    8(fvec4) FAdd 152 151

+                              Store 10(v) 153

+             154:         144 Load 146(is2D)

+             155:    8(fvec4) Load 27(c4D)

+             156:  140(ivec4) ImageSampleProjImplicitLod 154 155 54

+                              Store 142(iv) 156

+             157:  140(ivec4) Load 142(iv)

+             158:    8(fvec4) ConvertSToF 157

+             159:    8(fvec4) Load 10(v)

+             160:    8(fvec4) FAdd 159 158

+                              Store 10(v) 160

+             161:         144 Load 146(is2D)

+             162:   37(fvec3) Load 39(c3D)

+             163:    7(float) Load 56(c1D)

+             164:  140(ivec4) ImageSampleProjExplicitLod 161 162 163

+                              Store 142(iv) 164

+             165:  140(ivec4) Load 142(iv)

+             166:    8(fvec4) ConvertSToF 165

+             167:    8(fvec4) Load 10(v)

+             168:    8(fvec4) FAdd 167 166

+                              Store 10(v) 168

+             169:         144 Load 146(is2D)

+             170:   37(fvec3) Load 39(c3D)

+             171:   16(fvec2) Load 18(c2D)

+             172:   16(fvec2) Load 18(c2D)

+             173:  140(ivec4) ImageSampleProjExplicitLod 169 170 171 172

+                              Store 142(iv) 173

+             174:  140(ivec4) Load 142(iv)

+             175:    8(fvec4) ConvertSToF 174

+             176:    8(fvec4) Load 10(v)

+             177:    8(fvec4) FAdd 176 175

+                              Store 10(v) 177

+             182:         179 Load 181(is3D)

+             183:   37(fvec3) Load 39(c3D)

+             185:  140(ivec4) ImageSampleImplicitLod 182 183 184

+                              Store 142(iv) 185

+             186:  140(ivec4) Load 142(iv)

+             187:    8(fvec4) ConvertSToF 186

+             188:    8(fvec4) Load 10(v)

+             189:    8(fvec4) FAdd 188 187

+                              Store 10(v) 189

+             194:         191 Load 193(isCube)

+             195:   37(fvec3) Load 39(c3D)

+             196:    7(float) Load 56(c1D)

+             197:  140(ivec4) ImageSampleExplicitLod 194 195 196

+                              Store 142(iv) 197

+             198:  140(ivec4) Load 142(iv)

+             199:    8(fvec4) ConvertSToF 198

+             200:    8(fvec4) Load 10(v)

+             201:    8(fvec4) FAdd 200 199

+                              Store 10(v) 201

+             206:         203 Load 205(is2DArray)

+             207:   66(ivec3) Load 68(ic3D)

+             208:     51(int) Load 71(ic1D)

+             209:  140(ivec4) ImageFetch 206 207

+                              Store 142(iv) 209

+             210:  140(ivec4) Load 142(iv)

+             211:    8(fvec4) ConvertSToF 210

+             212:    8(fvec4) Load 10(v)

+             213:    8(fvec4) FAdd 212 211

+                              Store 10(v) 213

+             220:         217 Load 219(sCubeShadow)

+             222:   52(ivec2) ImageQuerySizeLod 220 221

+                              Store 215(iv2) 222

+             225:    8(fvec4) Load 10(v)

+             226:   52(ivec2) Load 215(iv2)

+             227:   16(fvec2) ConvertSToF 226

+             229:    7(float) CompositeExtract 227 0

+             230:    7(float) CompositeExtract 227 1

+             231:    8(fvec4) CompositeConstruct 229 230 228 228

+             232:    8(fvec4) FAdd 225 231

+                              Store 224(FragData) 232

+                              Branch 6

+               6:             Label

+                              Return

+                              FunctionEnd

diff --git a/Test/baseResults/spv.texture.frag.out b/Test/baseResults/spv.texture.frag.out
index ab5146f..4326da4 100644
--- a/Test/baseResults/spv.texture.frag.out
+++ b/Test/baseResults/spv.texture.frag.out
@@ -6,4 +6,370 @@
 Linked fragment stage:

 

 

-Missing functionality: texel fetch

+// Module Version 99

+// Generated by (magic number): 51a00bb

+// Id's are bound by 283

+

+                              Source GLSL 130

+                              Capability Shader

+               1:             ExtInstImport  "GLSL.std.450"

+                              MemoryModel Logical GLSL450

+                              EntryPoint Fragment 4  "main"

+                              ExecutionMode 4 OriginLowerLeft

+                              Name 4  "main"

+                              Name 9  "blendscale"

+                              Name 11  "bias"

+                              Name 13  "lod"

+                              Name 15  "proj"

+                              Name 16  "coords1D"

+                              Name 19  "coords3D"

+                              Name 25  "coords4D"

+                              Name 27  "color"

+                              Name 33  "texSampler1D"

+                              Name 48  "coords2D"

+                              Name 73  "texSampler2D"

+                              Name 99  "texSampler3D"

+                              Name 125  "texSamplerCube"

+                              Name 140  "shadowSampler1D"

+                              Name 157  "shadowSampler2D"

+                              Name 200  "iCoords2D"

+                              Name 205  "iLod"

+                              Name 214  "gradX"

+                              Name 217  "gradY"

+                              Name 269  "gl_FragColor"

+                              Name 272  "u"

+                              Name 275  "blend"

+                              Name 281  "scale"

+                              Name 282  "t"

+                              Decorate 48(coords2D) Smooth

+                              Decorate 269(gl_FragColor) BuiltIn FragColor

+                              Decorate 281(scale) NoStaticUse

+                              Decorate 282(t) Smooth

+                              Decorate 282(t) NoStaticUse

+               2:             TypeVoid

+               3:             TypeFunction 2

+               7:             TypeFloat 32

+               8:             TypePointer Function 7(float)

+              10:    7(float) Constant 1071971828

+              12:    7(float) Constant 1073741824

+              14:    7(float) Constant 1077936128

+              17:             TypeVector 7(float) 3

+              18:             TypePointer Function 17(fvec3)

+              20:    7(float) Constant 1076753334

+              21:    7(float) Constant 1079836148

+              22:   17(fvec3) ConstantComposite 10 20 21

+              23:             TypeVector 7(float) 4

+              24:             TypePointer Function 23(fvec4)

+              26:   23(fvec4) ConstantComposite 10 20 21 12

+              28:    7(float) Constant 0

+              29:   23(fvec4) ConstantComposite 28 28 28 28

+              30:             TypeImage 7(float) 1D sampled format:Unknown

+              31:             TypeSampledImage 30

+              32:             TypePointer UniformConstant 31

+33(texSampler1D):     32(ptr) Variable UniformConstant

+              46:             TypeVector 7(float) 2

+              47:             TypePointer Input 46(fvec2)

+    48(coords2D):     47(ptr) Variable Input

+              70:             TypeImage 7(float) 2D sampled format:Unknown

+              71:             TypeSampledImage 70

+              72:             TypePointer UniformConstant 71

+73(texSampler2D):     72(ptr) Variable UniformConstant

+              96:             TypeImage 7(float) 3D sampled format:Unknown

+              97:             TypeSampledImage 96

+              98:             TypePointer UniformConstant 97

+99(texSampler3D):     98(ptr) Variable UniformConstant

+             122:             TypeImage 7(float) Cube sampled format:Unknown

+             123:             TypeSampledImage 122

+             124:             TypePointer UniformConstant 123

+125(texSamplerCube):    124(ptr) Variable UniformConstant

+             137:             TypeImage 7(float) 1D depth sampled format:Unknown

+             138:             TypeSampledImage 137

+             139:             TypePointer UniformConstant 138

+140(shadowSampler1D):    139(ptr) Variable UniformConstant

+             154:             TypeImage 7(float) 2D depth sampled format:Unknown

+             155:             TypeSampledImage 154

+             156:             TypePointer UniformConstant 155

+157(shadowSampler2D):    156(ptr) Variable UniformConstant

+             197:             TypeInt 32 1

+             198:             TypeVector 197(int) 2

+             199:             TypePointer Function 198(ivec2)

+             201:    197(int) Constant 0

+             202:    197(int) Constant 5

+             203:  198(ivec2) ConstantComposite 201 202

+             204:             TypePointer Function 197(int)

+             206:    197(int) Constant 1

+             213:             TypePointer Function 46(fvec2)

+             242:    197(int) Constant 3

+             243:    197(int) Constant 4294967289

+             244:  198(ivec2) ConstantComposite 242 243

+             268:             TypePointer Output 23(fvec4)

+269(gl_FragColor):    268(ptr) Variable Output

+             271:             TypePointer UniformConstant 23(fvec4)

+          272(u):    271(ptr) Variable UniformConstant

+             274:             TypePointer UniformConstant 7(float)

+      275(blend):    274(ptr) Variable UniformConstant

+             280:             TypePointer UniformConstant 46(fvec2)

+      281(scale):    280(ptr) Variable UniformConstant

+          282(t):     47(ptr) Variable Input

+         4(main):           2 Function None 3

+               5:             Label

+   9(blendscale):      8(ptr) Variable Function

+        11(bias):      8(ptr) Variable Function

+         13(lod):      8(ptr) Variable Function

+        15(proj):      8(ptr) Variable Function

+    16(coords1D):      8(ptr) Variable Function

+    19(coords3D):     18(ptr) Variable Function

+    25(coords4D):     24(ptr) Variable Function

+       27(color):     24(ptr) Variable Function

+  200(iCoords2D):    199(ptr) Variable Function

+       205(iLod):    204(ptr) Variable Function

+      214(gradX):    213(ptr) Variable Function

+      217(gradY):    213(ptr) Variable Function

+                              Store 9(blendscale) 10

+                              Store 11(bias) 12

+                              Store 13(lod) 14

+                              Store 15(proj) 12

+                              Store 16(coords1D) 10

+                              Store 19(coords3D) 22

+                              Store 25(coords4D) 26

+                              Store 27(color) 29

+              34:          31 Load 33(texSampler1D)

+              35:    7(float) Load 16(coords1D)

+              36:   23(fvec4) ImageSampleImplicitLod 34 35

+              37:   23(fvec4) Load 27(color)

+              38:   23(fvec4) FAdd 37 36

+                              Store 27(color) 38

+              39:          31 Load 33(texSampler1D)

+              40:    7(float) Load 16(coords1D)

+              41:    7(float) Load 11(bias)

+              42:   23(fvec4) ImageSampleImplicitLod 39 40 41

+              43:   23(fvec4) Load 27(color)

+              44:   23(fvec4) FAdd 43 42

+                              Store 27(color) 44

+              45:          31 Load 33(texSampler1D)

+              49:   46(fvec2) Load 48(coords2D)

+              50:   23(fvec4) ImageSampleProjImplicitLod 45 49

+              51:   23(fvec4) Load 27(color)

+              52:   23(fvec4) FAdd 51 50

+                              Store 27(color) 52

+              53:          31 Load 33(texSampler1D)

+              54:   23(fvec4) Load 25(coords4D)

+              55:   23(fvec4) ImageSampleProjImplicitLod 53 54

+              56:   23(fvec4) Load 27(color)

+              57:   23(fvec4) FAdd 56 55

+                              Store 27(color) 57

+              58:          31 Load 33(texSampler1D)

+              59:   46(fvec2) Load 48(coords2D)

+              60:    7(float) Load 11(bias)

+              61:   23(fvec4) ImageSampleProjImplicitLod 58 59 60

+              62:   23(fvec4) Load 27(color)

+              63:   23(fvec4) FAdd 62 61

+                              Store 27(color) 63

+              64:          31 Load 33(texSampler1D)

+              65:   23(fvec4) Load 25(coords4D)

+              66:    7(float) Load 11(bias)

+              67:   23(fvec4) ImageSampleProjImplicitLod 64 65 66

+              68:   23(fvec4) Load 27(color)

+              69:   23(fvec4) FAdd 68 67

+                              Store 27(color) 69

+              74:          71 Load 73(texSampler2D)

+              75:   46(fvec2) Load 48(coords2D)

+              76:   23(fvec4) ImageSampleImplicitLod 74 75

+              77:   23(fvec4) Load 27(color)

+              78:   23(fvec4) FAdd 77 76

+                              Store 27(color) 78

+              79:          71 Load 73(texSampler2D)

+              80:   46(fvec2) Load 48(coords2D)

+              81:    7(float) Load 11(bias)

+              82:   23(fvec4) ImageSampleImplicitLod 79 80 81

+              83:   23(fvec4) Load 27(color)

+              84:   23(fvec4) FAdd 83 82

+                              Store 27(color) 84

+              85:          71 Load 73(texSampler2D)

+              86:   17(fvec3) Load 19(coords3D)

+              87:   23(fvec4) ImageSampleProjImplicitLod 85 86

+              88:   23(fvec4) Load 27(color)

+              89:   23(fvec4) FAdd 88 87

+                              Store 27(color) 89

+              90:          71 Load 73(texSampler2D)

+              91:   23(fvec4) Load 25(coords4D)

+              92:    7(float) Load 11(bias)

+              93:   23(fvec4) ImageSampleProjImplicitLod 90 91 92

+              94:   23(fvec4) Load 27(color)

+              95:   23(fvec4) FAdd 94 93

+                              Store 27(color) 95

+             100:          97 Load 99(texSampler3D)

+             101:   17(fvec3) Load 19(coords3D)

+             102:   23(fvec4) ImageSampleImplicitLod 100 101

+             103:   23(fvec4) Load 27(color)

+             104:   23(fvec4) FAdd 103 102

+                              Store 27(color) 104

+             105:          97 Load 99(texSampler3D)

+             106:   17(fvec3) Load 19(coords3D)

+             107:    7(float) Load 11(bias)

+             108:   23(fvec4) ImageSampleImplicitLod 105 106 107

+             109:   23(fvec4) Load 27(color)

+             110:   23(fvec4) FAdd 109 108

+                              Store 27(color) 110

+             111:          97 Load 99(texSampler3D)

+             112:   23(fvec4) Load 25(coords4D)

+             113:   23(fvec4) ImageSampleProjImplicitLod 111 112

+             114:   23(fvec4) Load 27(color)

+             115:   23(fvec4) FAdd 114 113

+                              Store 27(color) 115

+             116:          97 Load 99(texSampler3D)

+             117:   23(fvec4) Load 25(coords4D)

+             118:    7(float) Load 11(bias)

+             119:   23(fvec4) ImageSampleProjImplicitLod 116 117 118

+             120:   23(fvec4) Load 27(color)

+             121:   23(fvec4) FAdd 120 119

+                              Store 27(color) 121

+             126:         123 Load 125(texSamplerCube)

+             127:   17(fvec3) Load 19(coords3D)

+             128:   23(fvec4) ImageSampleImplicitLod 126 127

+             129:   23(fvec4) Load 27(color)

+             130:   23(fvec4) FAdd 129 128

+                              Store 27(color) 130

+             131:         123 Load 125(texSamplerCube)

+             132:   17(fvec3) Load 19(coords3D)

+             133:    7(float) Load 11(bias)

+             134:   23(fvec4) ImageSampleImplicitLod 131 132 133

+             135:   23(fvec4) Load 27(color)

+             136:   23(fvec4) FAdd 135 134

+                              Store 27(color) 136

+             141:         138 Load 140(shadowSampler1D)

+             142:   17(fvec3) Load 19(coords3D)

+             143:    7(float) CompositeExtract 142 2

+             144:   23(fvec4) ImageSampleDrefImplicitLod 141 142 143

+             145:   23(fvec4) Load 27(color)

+             146:   23(fvec4) FAdd 145 144

+                              Store 27(color) 146

+             147:         138 Load 140(shadowSampler1D)

+             148:   17(fvec3) Load 19(coords3D)

+             149:    7(float) Load 11(bias)

+             150:    7(float) CompositeExtract 148 2

+             151:   23(fvec4) ImageSampleDrefImplicitLod 147 148 150 149

+             152:   23(fvec4) Load 27(color)

+             153:   23(fvec4) FAdd 152 151

+                              Store 27(color) 153

+             158:         155 Load 157(shadowSampler2D)

+             159:   17(fvec3) Load 19(coords3D)

+             160:    7(float) CompositeExtract 159 2

+             161:   23(fvec4) ImageSampleDrefImplicitLod 158 159 160

+             162:   23(fvec4) Load 27(color)

+             163:   23(fvec4) FAdd 162 161

+                              Store 27(color) 163

+             164:         155 Load 157(shadowSampler2D)

+             165:   17(fvec3) Load 19(coords3D)

+             166:    7(float) Load 11(bias)

+             167:    7(float) CompositeExtract 165 2

+             168:   23(fvec4) ImageSampleDrefImplicitLod 164 165 167 166

+             169:   23(fvec4) Load 27(color)

+             170:   23(fvec4) FAdd 169 168

+                              Store 27(color) 170

+             171:         138 Load 140(shadowSampler1D)

+             172:   23(fvec4) Load 25(coords4D)

+             173:    7(float) CompositeExtract 172 3

+             174:   23(fvec4) ImageSampleProjDrefImplicitLod 171 172 173

+             175:   23(fvec4) Load 27(color)

+             176:   23(fvec4) FAdd 175 174

+                              Store 27(color) 176

+             177:         138 Load 140(shadowSampler1D)

+             178:   23(fvec4) Load 25(coords4D)

+             179:    7(float) Load 11(bias)

+             180:    7(float) CompositeExtract 178 3

+             181:   23(fvec4) ImageSampleProjDrefImplicitLod 177 178 180 179

+             182:   23(fvec4) Load 27(color)

+             183:   23(fvec4) FAdd 182 181

+                              Store 27(color) 183

+             184:         155 Load 157(shadowSampler2D)

+             185:   23(fvec4) Load 25(coords4D)

+             186:    7(float) CompositeExtract 185 3

+             187:   23(fvec4) ImageSampleProjDrefImplicitLod 184 185 186

+             188:   23(fvec4) Load 27(color)

+             189:   23(fvec4) FAdd 188 187

+                              Store 27(color) 189

+             190:         155 Load 157(shadowSampler2D)

+             191:   23(fvec4) Load 25(coords4D)

+             192:    7(float) Load 11(bias)

+             193:    7(float) CompositeExtract 191 3

+             194:   23(fvec4) ImageSampleProjDrefImplicitLod 190 191 193 192

+             195:   23(fvec4) Load 27(color)

+             196:   23(fvec4) FAdd 195 194

+                              Store 27(color) 196

+                              Store 200(iCoords2D) 203

+                              Store 205(iLod) 206

+             207:          71 Load 73(texSampler2D)

+             208:  198(ivec2) Load 200(iCoords2D)

+             209:    197(int) Load 205(iLod)

+             210:   23(fvec4) ImageFetch 207 208

+             211:   23(fvec4) Load 27(color)

+             212:   23(fvec4) FAdd 211 210

+                              Store 27(color) 212

+             215:   46(fvec2) Load 48(coords2D)

+             216:   46(fvec2) DPdx 215

+                              Store 214(gradX) 216

+             218:   46(fvec2) Load 48(coords2D)

+             219:   46(fvec2) DPdy 218

+                              Store 217(gradY) 219

+             220:          71 Load 73(texSampler2D)

+             221:   46(fvec2) Load 48(coords2D)

+             222:   46(fvec2) Load 214(gradX)

+             223:   46(fvec2) Load 217(gradY)

+             224:   23(fvec4) ImageSampleExplicitLod 220 221 222 223

+             225:   23(fvec4) Load 27(color)

+             226:   23(fvec4) FAdd 225 224

+                              Store 27(color) 226

+             227:          71 Load 73(texSampler2D)

+             228:   46(fvec2) Load 48(coords2D)

+             229:    7(float) Load 15(proj)

+             230:    7(float) CompositeExtract 228 0

+             231:    7(float) CompositeExtract 228 1

+             232:   17(fvec3) CompositeConstruct 230 231 229

+             233:   46(fvec2) Load 214(gradX)

+             234:   46(fvec2) Load 217(gradY)

+             235:   23(fvec4) ImageSampleProjExplicitLod 227 232 233 234

+             236:   23(fvec4) Load 27(color)

+             237:   23(fvec4) FAdd 236 235

+                              Store 27(color) 237

+             238:          71 Load 73(texSampler2D)

+             239:   46(fvec2) Load 48(coords2D)

+             240:   46(fvec2) Load 214(gradX)

+             241:   46(fvec2) Load 217(gradY)

+             245:   23(fvec4) ImageSampleExplicitLod 238 239 240 241 244

+             246:   23(fvec4) Load 27(color)

+             247:   23(fvec4) FAdd 246 245

+                              Store 27(color) 247

+             248:          71 Load 73(texSampler2D)

+             249:   17(fvec3) Load 19(coords3D)

+             250:   46(fvec2) Load 214(gradX)

+             251:   46(fvec2) Load 217(gradY)

+             252:   23(fvec4) ImageSampleProjExplicitLod 248 249 250 251 244

+             253:   23(fvec4) Load 27(color)

+             254:   23(fvec4) FAdd 253 252

+                              Store 27(color) 254

+             255:         155 Load 157(shadowSampler2D)

+             256:   46(fvec2) Load 48(coords2D)

+             257:    7(float) Load 13(lod)

+             258:    7(float) CompositeExtract 256 0

+             259:    7(float) CompositeExtract 256 1

+             260:   17(fvec3) CompositeConstruct 258 259 257

+             261:   46(fvec2) Load 214(gradX)

+             262:   46(fvec2) Load 217(gradY)

+             263:    7(float) CompositeExtract 260 2

+             264:    7(float) ImageSampleDrefExplicitLod 255 260 263 261 262

+             265:   23(fvec4) Load 27(color)

+             266:   23(fvec4) CompositeConstruct 264 264 264 264

+             267:   23(fvec4) FAdd 265 266

+                              Store 27(color) 267

+             270:   23(fvec4) Load 27(color)

+             273:   23(fvec4) Load 272(u)

+             276:    7(float) Load 275(blend)

+             277:    7(float) Load 9(blendscale)

+             278:    7(float) FMul 276 277

+             279:   23(fvec4) ExtInst 1(GLSL.std.450) 46(Mix) 270 273 278

+                              Store 269(gl_FragColor) 279

+                              Branch 6

+               6:             Label

+                              Return

+                              FunctionEnd

diff --git a/Test/preprocessor.defined.vert b/Test/preprocessor.defined.vert
new file mode 100644
index 0000000..375e4d3
--- /dev/null
+++ b/Test/preprocessor.defined.vert
@@ -0,0 +1,2 @@
+#define defined_not_really
+#define defined // ERROR: "defined" can't be (un)defined:
diff --git a/Test/spv.310.comp b/Test/spv.310.comp
index 4511636..bd183e0 100644
--- a/Test/spv.310.comp
+++ b/Test/spv.310.comp
@@ -11,9 +11,7 @@
     float f;
     float g;
     float h;
-    vec3 uns[];  // this makes it look like the "second" set of 3 floats in a struct, which LLVM
-                 // takes advantage of when optimizing, giving confusing results, like thinking
-                 // &outbname.uns[18].x == &outbname[9].uns.x
+    vec3 uns[];
 } outbname;
 
 buffer outbna {
@@ -22,6 +20,7 @@
 } outbnamena;
 
 buffer outs {
+    int s;
     vec4 va[];
 } outnames;
 
@@ -30,8 +29,9 @@
     barrier();
     outbname.f = s;
     outbnamena.na = vec4(s);
-    s = outbname.uns[18].x;           // TODO: see note above
-    //outbname.uns[17] = vec3(3.0);   // TODO: see note above, this one bitcasts, which isn't handled
+    s = outbname.uns[18].x;
+    outbname.uns[17] = vec3(3.0);
     outbname.uns[i] = vec3(s);
     outnames.va[gl_LocalInvocationID.x] = vec4(s);
+    outnames.s = outbname.uns.length();
 }
diff --git a/Test/spv.AofA.frag b/Test/spv.AofA.frag
new file mode 100644
index 0000000..606d73b
--- /dev/null
+++ b/Test/spv.AofA.frag
@@ -0,0 +1,43 @@
+#version 430

+

+in float infloat;

+out float outfloat;

+

+uniform uAofA {

+    float f[2][4];

+} nameAofA[3][5];

+

+float[4][5][6] many[1][2][3];

+

+float g4[4][7];

+in float g5[5][7];

+

+uniform int i, j, k;

+

+float[4][7] foo(float a[5][7])

+{

+    float r[7];

+    r = a[2];

+

+    return float[4][7](a[0], a[1], r, a[3]);

+}

+

+void main()

+{

+    outfloat = 0.0;

+

+    g4 = foo(g5);

+

+//    if (foo(g5) == g4)

+//        ++outfloat;

+

+    float u[][7];

+    u[2][2] = 3.0;

+    float u[5][7];

+

+    foo(u);

+

+    many[i][j][k][i][j][k] = infloat;

+    outfloat += many[j][j][j][j][j][j];

+    outfloat += nameAofA[1][2].f[0][3];

+}

diff --git a/Test/test-preprocessor-list b/Test/test-preprocessor-list
index cd2381a..ac8f8be 100644
--- a/Test/test-preprocessor-list
+++ b/Test/test-preprocessor-list
@@ -11,3 +11,4 @@
 preprocessor.pragma.vert
 preprocessor.simple.vert
 preprocessor.success_if_parse_would_fail.vert
+preprocessor.defined.vert
diff --git a/Test/test-spirv-list b/Test/test-spirv-list
index ccfa068..a7d8c8d 100644
--- a/Test/test-spirv-list
+++ b/Test/test-spirv-list
@@ -79,3 +79,4 @@
 spv.voidFunction.frag
 spv.whileLoop.frag
 spv.atomic.comp
+spv.AofA.frag
diff --git a/glslang/Include/arrays.h b/glslang/Include/arrays.h
index cc2cdab..1d8ec43 100644
--- a/glslang/Include/arrays.h
+++ b/glslang/Include/arrays.h
@@ -224,6 +224,7 @@
 
         return false;
     }
+    bool isImplicit() const { return getOuterSize() == UnsizedArraySize || isInnerImplicit(); }
     void addOuterSizes(const TArraySizes& s) { sizes.push_front(s.sizes); }
     void dereference() { sizes.pop_front(); }
     void copyDereferenced(const TArraySizes& rhs)
diff --git a/glslang/Include/revision.h b/glslang/Include/revision.h
index a4c86e8..cd2e547 100644
--- a/glslang/Include/revision.h
+++ b/glslang/Include/revision.h
@@ -2,5 +2,5 @@
 // For the version, it uses the latest git tag followed by the number of commits.
 // For the date, it uses the current date (when then script is run).
 
-#define GLSLANG_REVISION "3.0.732"
-#define GLSLANG_DATE "22-Aug-2015"
+#define GLSLANG_REVISION "3.0.750"
+#define GLSLANG_DATE "13-Sep-2015"
diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp
index 7c79f21..f91d93d 100644
--- a/glslang/MachineIndependent/ParseHelper.cpp
+++ b/glslang/MachineIndependent/ParseHelper.cpp
@@ -2063,6 +2063,8 @@
     // however, before that, ES tests required an error.
     if (strncmp(identifier, "GL_", 3) == 0)
         ppError(loc, "names beginning with \"GL_\" can't be (un)defined:", op,  identifier);
+    else if (strncmp(identifier, "defined", 8) == 0)
+        ppError(loc, "\"defined\" can't be (un)defined:", op,  identifier);
     else if (strstr(identifier, "__") != 0) {
         if (profile == EEsProfile && version >= 300 &&
             (strcmp(identifier, "__LINE__") == 0 ||
@@ -2736,16 +2738,20 @@
         else if (type.isStruct())
             requireProfile(loc, ~EEsProfile, "fragment-shader array-of-struct input");
     }
+    if (type.getQualifier().storage == EvqVaryingOut && language == EShLangFragment) {
+        if (type.isArrayOfArrays())
+            requireProfile(loc, ~EEsProfile, "fragment-shader array-of-array output");
+    }
 
     return false;
 }
 
 //
-// Require array to have size
+// Require array to be completely sized
 //
-void TParseContext::arraySizeRequiredCheck(const TSourceLoc& loc, int size)
+void TParseContext::arraySizeRequiredCheck(const TSourceLoc& loc, const TArraySizes& arraySizes)
 {
-    if (size == UnsizedArraySize)
+    if (arraySizes.isImplicit())
         error(loc, "array size required", "", "");
 }
 
@@ -2754,12 +2760,12 @@
     const TTypeList& structure = *type.getStruct();
     for (int m = 0; m < (int)structure.size(); ++m) {
         const TType& member = *structure[m].type;
-        if (member.isArray() && ! member.isExplicitlySizedArray())
-            arraySizeRequiredCheck(structure[m].loc, 0);
+        if (member.isArray())
+            arraySizeRequiredCheck(structure[m].loc, *member.getArraySizes());
     }
 }
 
-void TParseContext::arrayUnsizedCheck(const TSourceLoc& loc, const TQualifier& qualifier, const TArraySizes* arraySizes, bool initializer)
+void TParseContext::arrayUnsizedCheck(const TSourceLoc& loc, const TQualifier& qualifier, const TArraySizes* arraySizes, bool initializer, bool lastMember)
 {
     assert(arraySizes);
 
@@ -2781,6 +2787,12 @@
 
     // for ES, if size isn't coming from an initializer, it has to be explicitly declared now,
     // with very few exceptions
+
+    // last member of ssbo block exception:
+    if (qualifier.storage == EvqBuffer && lastMember)
+        return;
+
+    // implicitly-sized io exceptions:
     switch (language) {
     case EShLangGeometry:
         if (qualifier.storage == EvqVaryingIn)
@@ -2803,7 +2815,7 @@
         break;
     }
 
-    arraySizeRequiredCheck(loc, arraySizes->getOuterSize());
+    arraySizeRequiredCheck(loc, *arraySizes);
 }
 
 void TParseContext::arrayOfArrayVersionCheck(const TSourceLoc& loc)
@@ -4461,7 +4473,7 @@
         arrayDimMerge(type, arraySizes);
 
         // Check that implicit sizing is only where allowed.
-        arrayUnsizedCheck(loc, type.getQualifier(), &type.getArraySizes(), initializer != nullptr);
+        arrayUnsizedCheck(loc, type.getQualifier(), &type.getArraySizes(), initializer != nullptr, false);
 
         if (! arrayQualifierError(loc, type.getQualifier()) && ! arrayError(loc, type))
             declareArray(loc, identifier, type, symbol, newDeclaration);
@@ -4945,8 +4957,10 @@
     blockStageIoCheck(loc, currentBlockQualifier);
     blockQualifierCheck(loc, currentBlockQualifier);
     if (arraySizes) {
-        arrayUnsizedCheck(loc, currentBlockQualifier, arraySizes, false);
+        arrayUnsizedCheck(loc, currentBlockQualifier, arraySizes, false, false);
         arrayDimCheck(loc, arraySizes, 0);
+        if (arraySizes->getNumDims() > 1)
+            requireProfile(loc, ~EEsProfile, "array-of-array of block");
     }
 
     // fix and check for member storage qualifiers and types that don't belong within a block
@@ -4960,10 +4974,8 @@
         memberQualifier.storage = currentBlockQualifier.storage;
         if ((currentBlockQualifier.storage == EvqUniform || currentBlockQualifier.storage == EvqBuffer) && (memberQualifier.isInterpolation() || memberQualifier.isAuxiliary()))
             error(memberLoc, "member of uniform or buffer block cannot have an auxiliary or interpolation qualifier", memberType.getFieldName().c_str(), "");
-        if (memberType.isRuntimeSizedArray() && member < typeList.size() - 1)
-            error(memberLoc, "only the last member of a buffer block can be run-time sized", memberType.getFieldName().c_str(), "");
-        if (memberType.isImplicitlySizedArray())
-            requireProfile(memberLoc, ~EEsProfile, "implicitly-sized array in a block");
+        if (memberType.isArray())
+            arrayUnsizedCheck(memberLoc, currentBlockQualifier, &memberType.getArraySizes(), false, member == typeList.size() - 1);
         if (memberQualifier.hasOffset()) {
             requireProfile(memberLoc, ~EEsProfile, "offset on block member");
             profileRequires(memberLoc, ~EEsProfile, 440, E_GL_ARB_enhanced_layouts, "offset on block member");
diff --git a/glslang/MachineIndependent/ParseHelper.h b/glslang/MachineIndependent/ParseHelper.h
index 17a5b3f..771a43e 100644
--- a/glslang/MachineIndependent/ParseHelper.h
+++ b/glslang/MachineIndependent/ParseHelper.h
@@ -137,9 +137,9 @@
     void arraySizeCheck(const TSourceLoc&, TIntermTyped* expr, int& size);
     bool arrayQualifierError(const TSourceLoc&, const TQualifier&);
     bool arrayError(const TSourceLoc&, const TType&);
-    void arraySizeRequiredCheck(const TSourceLoc&, int size);
+    void arraySizeRequiredCheck(const TSourceLoc&, const TArraySizes&);
     void structArrayCheck(const TSourceLoc&, const TType& structure);
-    void arrayUnsizedCheck(const TSourceLoc&, const TQualifier&, const TArraySizes*, bool initializer);
+    void arrayUnsizedCheck(const TSourceLoc&, const TQualifier&, const TArraySizes*, bool initializer, bool lastMember);
     void arrayOfArrayVersionCheck(const TSourceLoc&);
     void arrayDimCheck(const TSourceLoc&, const TArraySizes* sizes1, const TArraySizes* sizes2);
     void arrayDimCheck(const TSourceLoc&, const TType*, const TArraySizes*);
diff --git a/glslang/MachineIndependent/glslang.y b/glslang/MachineIndependent/glslang.y
index 0c87757..e7eb320 100644
--- a/glslang/MachineIndependent/glslang.y
+++ b/glslang/MachineIndependent/glslang.y
@@ -798,7 +798,7 @@
                                GetStorageQualifierString($1.qualifier.storage), "");
         }
         if ($1.arraySizes)
-            parseContext.arraySizeRequiredCheck($1.loc, $1.arraySizes->getOuterSize());
+            parseContext.arraySizeRequiredCheck($1.loc, *$1.arraySizes);
 
         // Add the function as a prototype after parsing it (we do not support recursion)
         TFunction *function;
@@ -814,7 +814,7 @@
         if ($1.arraySizes) {
             parseContext.profileRequires($1.loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type");
             parseContext.profileRequires($1.loc, EEsProfile, 300, 0, "arrayed type");
-            parseContext.arraySizeRequiredCheck($1.loc, $1.arraySizes->getOuterSize());
+            parseContext.arraySizeRequiredCheck($1.loc, *$1.arraySizes);
         }
         if ($1.basicType == EbtVoid) {
             parseContext.error($2.loc, "illegal use of type 'void'", $2.string->c_str(), "");
@@ -829,11 +829,11 @@
         if ($1.arraySizes) {
             parseContext.profileRequires($1.loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type");
             parseContext.profileRequires($1.loc, EEsProfile, 300, 0, "arrayed type");
-            parseContext.arraySizeRequiredCheck($1.loc, $1.arraySizes->getOuterSize());
+            parseContext.arraySizeRequiredCheck($1.loc, *$1.arraySizes);
         }
         parseContext.arrayDimCheck($2.loc, $1.arraySizes, $3.arraySizes);
 
-        parseContext.arraySizeRequiredCheck($3.loc, $3.arraySizes->getOuterSize());
+        parseContext.arraySizeRequiredCheck($3.loc, *$3.arraySizes);
         parseContext.reservedErrorCheck($2.loc, *$2.string);
 
         $1.arraySizes = $3.arraySizes;
@@ -893,7 +893,7 @@
         TParameter param = { 0, new TType($1) };
         $$.param = param;
         if ($1.arraySizes)
-            parseContext.arraySizeRequiredCheck($1.loc, $1.arraySizes->getOuterSize());
+            parseContext.arraySizeRequiredCheck($1.loc, *$1.arraySizes);
     }
     ;
 
@@ -1962,7 +1962,7 @@
             parseContext.profileRequires($1.loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type");
             parseContext.profileRequires($1.loc, EEsProfile, 300, 0, "arrayed type");
             if (parseContext.profile == EEsProfile)
-                parseContext.arraySizeRequiredCheck($1.loc, $1.arraySizes->getOuterSize());
+                parseContext.arraySizeRequiredCheck($1.loc, *$1.arraySizes);
         }
 
         $$ = $2;
@@ -1981,7 +1981,7 @@
             parseContext.profileRequires($2.loc, ENoProfile, 120, E_GL_3DL_array_objects, "arrayed type");
             parseContext.profileRequires($2.loc, EEsProfile, 300, 0, "arrayed type");
             if (parseContext.profile == EEsProfile)
-                parseContext.arraySizeRequiredCheck($2.loc, $2.arraySizes->getOuterSize());
+                parseContext.arraySizeRequiredCheck($2.loc, *$2.arraySizes);
         }
 
         $$ = $3;