Merge pull request #2032 from ShchchowAMD/atomic-uint-binding

Modify max binding checks for atomic_uint
diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp
index 745dd7f..0755636 100755
--- a/SPIRV/GlslangToSpv.cpp
+++ b/SPIRV/GlslangToSpv.cpp
@@ -7482,7 +7482,7 @@
         id = builder.createCompositeExtract(mulOp, typeId, 0);
         for (int i = 1; i < componentCount; ++i) {
             builder.setPrecision(id, precision);
-            id = builder.createBinOp(spv::OpIAdd, typeId, id, builder.createCompositeExtract(operands[0], typeId, i));
+            id = builder.createBinOp(spv::OpIAdd, typeId, id, builder.createCompositeExtract(mulOp, typeId, i));
         }
     } else {
         switch (consumedOperands) {
diff --git a/Test/120.vert b/Test/120.vert
index d276557..7b98492 100644
--- a/Test/120.vert
+++ b/Test/120.vert
@@ -201,3 +201,15 @@
 
 #define macr(A,B) A ## B
 int macr(qrs,tuv);
+
+layout(std140) uniform BlockName    // ERROR
+{
+    int test;
+};
+
+#extension GL_ARB_uniform_buffer_object : enable
+
+layout(std140) uniform BlockName
+{
+    int test;
+};
\ No newline at end of file
diff --git a/Test/130.frag b/Test/130.frag
index 8a5bfd5..c352df4 100644
--- a/Test/130.frag
+++ b/Test/130.frag
@@ -62,12 +62,14 @@
     b3 < b3;                   // ERROR
     uv3 > uv3;                 // ERROR
     uvec2(2, 3) >= uvec2(3,3); // ERROR
+    int samples = gl_NumSamples; // ERROR
     int(bl4) <= int(bl4);      // true
     int(bl4.x) > int(bl4.y);   // false
 }
 
 #extension GL_ARB_texture_gather : enable
 #extension GL_ARB_texture_rectangle : enable
+#extension GL_ARB_sample_shading : enable
 
 uniform sampler2D samp2D;
 uniform sampler2DShadow samp2DS;
@@ -83,6 +85,7 @@
     s = textureGatherOffset(samp2DA, vec3(0.3), ivec2(1));
     s = textureGatherOffset(samp2DS, vec2(0.3), 1.3, ivec2(1)); // ERROR
     s = textureGatherOffset(samp2D, vec2(0.3), ivec2(1), 2);    // ERROR
+    int samples = gl_NumSamples;
 }
 
 #extension GL_ARB_gpu_shader5 : enable
diff --git a/Test/140.frag b/Test/140.frag
index 2bc2f59..5efdbed 100644
--- a/Test/140.frag
+++ b/Test/140.frag
@@ -17,6 +17,7 @@
 #error GL_ES is not set
 #endif
 
+
 in struct S { float f; } s; // ERROR
 
 float patch = 3.1;
@@ -51,3 +52,9 @@
 {
     return i1 + i2;
 }
+
+uniform sampler2DMS aaa1; // ERROR
+
+#extension GL_ARB_texture_multisample : enable
+
+uniform sampler2DMS aaa2;
diff --git a/Test/410.vert b/Test/410.vert
index 0ecf476..1891a67 100644
--- a/Test/410.vert
+++ b/Test/410.vert
@@ -6,4 +6,5 @@
 
 void main()
 {
+    int test = gl_MaxFragmentUniformVectors;
 }
diff --git a/Test/atomic_uint.frag b/Test/atomic_uint.frag
index 9a95a48..4155214 100644
--- a/Test/atomic_uint.frag
+++ b/Test/atomic_uint.frag
@@ -1,6 +1,7 @@
 #version 420 core
 
 layout(binding = 0) uniform atomic_uint counter;
+layout(binding = 0, offset = 9) uniform atomic_uint counter;
 
 uint func(atomic_uint c)
 {
@@ -41,7 +42,7 @@
 layout(binding=0, offset=32) uniform atomic_uint aOffset;

 layout(binding=0, offset=4) uniform atomic_uint;

 layout(binding=0) uniform atomic_uint bar3;           // offset is 4

-layout(binding=0) uniform atomic_uint ac[3];          // offset = 8

+layout(binding=0) uniform atomic_uint ac[2];          // offset = 8

 layout(binding=0) uniform atomic_uint ad;             // offset = 20

 layout(offset=8) uniform atomic_uint bar4;            // ERROR, no binding

 layout(binding = 0, offset = 12) uniform atomic_uint overlap;  // ERROR, overlapping offsets

diff --git a/Test/baseResults/120.vert.out b/Test/baseResults/120.vert.out
index 5a91ed6..6c42b75 100644
--- a/Test/baseResults/120.vert.out
+++ b/Test/baseResults/120.vert.out
@@ -79,7 +79,8 @@
 ERROR: 0:195: 'gl_ModelViewMatrix' : identifiers starting with "gl_" are reserved 
 ERROR: 0:200: 'token pasting (##)' : not supported for this version or the enabled extensions 
 ERROR: 0:203: 'token pasting (##)' : not supported for this version or the enabled extensions 
-ERROR: 80 compilation errors.  No code generated.
+ERROR: 0:205: '' :  syntax error, unexpected IDENTIFIER
+ERROR: 81 compilation errors.  No code generated.
 
 
 Shader version: 120
diff --git a/Test/baseResults/130.frag.out b/Test/baseResults/130.frag.out
index 0af9ab9..6115f69 100644
--- a/Test/baseResults/130.frag.out
+++ b/Test/baseResults/130.frag.out
@@ -7,36 +7,38 @@
 ERROR: 0:62: '<' :  wrong operand types: no operation '<' exists that takes a left-hand operand of type ' temp 3-component vector of bool' and a right operand of type ' temp 3-component vector of bool' (or there is no acceptable conversion)
 ERROR: 0:63: '>' :  wrong operand types: no operation '>' exists that takes a left-hand operand of type ' temp 3-component vector of uint' and a right operand of type ' temp 3-component vector of uint' (or there is no acceptable conversion)
 ERROR: 0:64: '>=' :  wrong operand types: no operation '>=' exists that takes a left-hand operand of type ' const 2-component vector of uint' and a right operand of type ' const 2-component vector of uint' (or there is no acceptable conversion)
-ERROR: 0:80: 'textureGatherOffset' : no matching overloaded function found 
-ERROR: 0:80: 'assign' :  cannot convert from ' const float' to ' temp 4-component vector of float'
-ERROR: 0:81: 'textureGatherOffset(...)' : not supported for this version or the enabled extensions 
-ERROR: 0:84: 'textureGatherOffset(...)' : not supported for this version or the enabled extensions 
-ERROR: 0:85: 'textureGatherOffset(...)' : not supported for this version or the enabled extensions 
-WARNING: 0:88: '#extension' : extension is only partially supported: GL_ARB_gpu_shader5
-ERROR: 0:120: 'line continuation' : not supported for this version or the enabled extensions 
-ERROR: 0:126: 'uniform block' : not supported for this version or the enabled extensions 
-ERROR: 0:140: 'length' : does not operate on this type:  temp bool
-ERROR: 0:140: 'boolb' : can't use function syntax on variable 
-ERROR: 0:141: 'length' : does not operate on this type:  temp float
-ERROR: 0:141: '' : function call, method, or subroutine call expected 
-ERROR: 0:141: '' : no matching overloaded function found 
-ERROR: 0:142: 'length' : incomplete method syntax 
-ERROR: 0:143: 'length' : method does not accept any arguments 
-ERROR: 0:146: 'gl_FogFragCoord' : identifiers starting with "gl_" are reserved 
-ERROR: 0:151: 'int' : must be qualified as flat in
-ERROR: 0:151: 'redeclaration' : cannot change the type of gl_FogFragCoord
-ERROR: 0:153: 'early_fragment_tests' : not supported for this version or the enabled extensions 
-ERROR: 0:154: 'image load store' : not supported for this version or the enabled extensions 
-ERROR: 0:154: 'iimage2D' : Reserved word. 
-ERROR: 0:169: 'early_fragment_tests' : can only apply to 'in' 
-ERROR: 0:173: 'location qualifier on uniform or buffer' : not supported for this version or the enabled extensions 
-ERROR: 29 compilation errors.  No code generated.
+ERROR: 0:65: 'gl_NumSamples' : required extension not requested: GL_ARB_sample_shading
+ERROR: 0:82: 'textureGatherOffset' : no matching overloaded function found 
+ERROR: 0:82: 'assign' :  cannot convert from ' const float' to ' temp 4-component vector of float'
+ERROR: 0:83: 'textureGatherOffset(...)' : not supported for this version or the enabled extensions 
+ERROR: 0:86: 'textureGatherOffset(...)' : not supported for this version or the enabled extensions 
+ERROR: 0:87: 'textureGatherOffset(...)' : not supported for this version or the enabled extensions 
+WARNING: 0:91: '#extension' : extension is only partially supported: GL_ARB_gpu_shader5
+ERROR: 0:123: 'line continuation' : not supported for this version or the enabled extensions 
+ERROR: 0:129: 'uniform block' : not supported for this version or the enabled extensions 
+ERROR: 0:143: 'length' : does not operate on this type:  temp bool
+ERROR: 0:143: 'boolb' : can't use function syntax on variable 
+ERROR: 0:144: 'length' : does not operate on this type:  temp float
+ERROR: 0:144: '' : function call, method, or subroutine call expected 
+ERROR: 0:144: '' : no matching overloaded function found 
+ERROR: 0:145: 'length' : incomplete method syntax 
+ERROR: 0:146: 'length' : method does not accept any arguments 
+ERROR: 0:149: 'gl_FogFragCoord' : identifiers starting with "gl_" are reserved 
+ERROR: 0:154: 'int' : must be qualified as flat in
+ERROR: 0:154: 'redeclaration' : cannot change the type of gl_FogFragCoord
+ERROR: 0:156: 'early_fragment_tests' : not supported for this version or the enabled extensions 
+ERROR: 0:157: 'image load store' : not supported for this version or the enabled extensions 
+ERROR: 0:157: 'iimage2D' : Reserved word. 
+ERROR: 0:172: 'early_fragment_tests' : can only apply to 'in' 
+ERROR: 0:176: 'location qualifier on uniform or buffer' : not supported for this version or the enabled extensions 
+ERROR: 30 compilation errors.  No code generated.
 
 
 Shader version: 130
 Requested GL_ARB_explicit_attrib_location
 Requested GL_ARB_explicit_uniform_location
 Requested GL_ARB_gpu_shader5
+Requested GL_ARB_sample_shading
 Requested GL_ARB_separate_shader_objects
 Requested GL_ARB_shader_image_load_store
 Requested GL_ARB_shading_language_420pack
@@ -122,259 +124,267 @@
 0:63        false (const bool)
 0:64      Constant:
 0:64        false (const bool)
-0:65      Constant:
-0:65        true (const bool)
+0:65      Sequence
+0:65        move second child to first child ( temp int)
+0:65          'samples' ( temp int)
+0:65          'gl_NumSamples' ( uniform int SampleMaskIn)
 0:66      Constant:
-0:66        false (const bool)
-0:77  Function Definition: bar23( ( global void)
-0:77    Function Parameters: 
+0:66        true (const bool)
+0:67      Constant:
+0:67        false (const bool)
+0:79  Function Definition: bar23( ( global void)
+0:79    Function Parameters: 
 0:?     Sequence
-0:80      's' ( temp 4-component vector of float)
-0:81      move second child to first child ( temp 4-component vector of float)
-0:81        's' ( temp 4-component vector of float)
-0:81        textureGatherOffset ( global 4-component vector of float)
-0:81          'samp2DR' ( uniform sampler2DRect)
-0:81          Constant:
-0:81            0.300000
-0:81            0.300000
-0:81          Constant:
-0:81            1 (const int)
-0:81            1 (const int)
-0:82      move second child to first child ( temp 4-component vector of float)
-0:82        's' ( temp 4-component vector of float)
-0:82        textureGatherOffset ( global 4-component vector of float)
-0:82          'samp2D' ( uniform sampler2D)
-0:82          Constant:
-0:82            0.300000
-0:82            0.300000
-0:82          Constant:
-0:82            1 (const int)
-0:82            1 (const int)
+0:82      's' ( temp 4-component vector of float)
 0:83      move second child to first child ( temp 4-component vector of float)
 0:83        's' ( temp 4-component vector of float)
 0:83        textureGatherOffset ( global 4-component vector of float)
-0:83          'samp2DA' ( uniform sampler2DArray)
+0:83          'samp2DR' ( uniform sampler2DRect)
 0:83          Constant:
 0:83            0.300000
 0:83            0.300000
-0:83            0.300000
 0:83          Constant:
 0:83            1 (const int)
 0:83            1 (const int)
 0:84      move second child to first child ( temp 4-component vector of float)
 0:84        's' ( temp 4-component vector of float)
 0:84        textureGatherOffset ( global 4-component vector of float)
-0:84          'samp2DS' ( uniform sampler2DShadow)
+0:84          'samp2D' ( uniform sampler2D)
 0:84          Constant:
 0:84            0.300000
 0:84            0.300000
 0:84          Constant:
-0:84            1.300000
-0:84          Constant:
 0:84            1 (const int)
 0:84            1 (const int)
 0:85      move second child to first child ( temp 4-component vector of float)
 0:85        's' ( temp 4-component vector of float)
 0:85        textureGatherOffset ( global 4-component vector of float)
-0:85          'samp2D' ( uniform sampler2D)
+0:85          'samp2DA' ( uniform sampler2DArray)
 0:85          Constant:
 0:85            0.300000
 0:85            0.300000
+0:85            0.300000
 0:85          Constant:
 0:85            1 (const int)
 0:85            1 (const int)
-0:85          Constant:
-0:85            2 (const int)
-0:90  Function Definition: bar234( ( global void)
-0:90    Function Parameters: 
+0:86      move second child to first child ( temp 4-component vector of float)
+0:86        's' ( temp 4-component vector of float)
+0:86        textureGatherOffset ( global 4-component vector of float)
+0:86          'samp2DS' ( uniform sampler2DShadow)
+0:86          Constant:
+0:86            0.300000
+0:86            0.300000
+0:86          Constant:
+0:86            1.300000
+0:86          Constant:
+0:86            1 (const int)
+0:86            1 (const int)
+0:87      move second child to first child ( temp 4-component vector of float)
+0:87        's' ( temp 4-component vector of float)
+0:87        textureGatherOffset ( global 4-component vector of float)
+0:87          'samp2D' ( uniform sampler2D)
+0:87          Constant:
+0:87            0.300000
+0:87            0.300000
+0:87          Constant:
+0:87            1 (const int)
+0:87            1 (const int)
+0:87          Constant:
+0:87            2 (const int)
+0:88      Sequence
+0:88        move second child to first child ( temp int)
+0:88          'samples' ( temp int)
+0:88          'gl_NumSamples' ( uniform int SampleMaskIn)
+0:93  Function Definition: bar234( ( global void)
+0:93    Function Parameters: 
 0:?     Sequence
-0:93      move second child to first child ( temp 4-component vector of float)
-0:93        's' ( temp 4-component vector of float)
-0:93        textureGatherOffset ( global 4-component vector of float)
-0:93          'samp2D' ( uniform sampler2D)
-0:93          Constant:
-0:93            0.300000
-0:93            0.300000
-0:93          Constant:
-0:93            1 (const int)
-0:93            1 (const int)
-0:94      move second child to first child ( temp 4-component vector of float)
-0:94        's' ( temp 4-component vector of float)
-0:94        textureGatherOffset ( global 4-component vector of float)
-0:94          'samp2DA' ( uniform sampler2DArray)
-0:94          Constant:
-0:94            0.300000
-0:94            0.300000
-0:94            0.300000
-0:94          Constant:
-0:94            1 (const int)
-0:94            1 (const int)
-0:95      move second child to first child ( temp 4-component vector of float)
-0:95        's' ( temp 4-component vector of float)
-0:95        textureGatherOffset ( global 4-component vector of float)
-0:95          'samp2DR' ( uniform sampler2DRect)
-0:95          Constant:
-0:95            0.300000
-0:95            0.300000
-0:95          Constant:
-0:95            1 (const int)
-0:95            1 (const int)
 0:96      move second child to first child ( temp 4-component vector of float)
 0:96        's' ( temp 4-component vector of float)
 0:96        textureGatherOffset ( global 4-component vector of float)
-0:96          'samp2DS' ( uniform sampler2DShadow)
+0:96          'samp2D' ( uniform sampler2D)
 0:96          Constant:
 0:96            0.300000
 0:96            0.300000
 0:96          Constant:
-0:96            1.300000
-0:96          Constant:
 0:96            1 (const int)
 0:96            1 (const int)
 0:97      move second child to first child ( temp 4-component vector of float)
 0:97        's' ( temp 4-component vector of float)
 0:97        textureGatherOffset ( global 4-component vector of float)
-0:97          'samp2D' ( uniform sampler2D)
+0:97          'samp2DA' ( uniform sampler2DArray)
 0:97          Constant:
 0:97            0.300000
 0:97            0.300000
+0:97            0.300000
 0:97          Constant:
 0:97            1 (const int)
 0:97            1 (const int)
-0:97          Constant:
-0:97            2 (const int)
-0:107  Function Definition: bar235( ( global void)
-0:107    Function Parameters: 
-0:109    Sequence
-0:109      Sequence
-0:109        move second child to first child ( temp 3-component vector of int)
-0:109          'a' ( temp 3-component vector of int)
-0:109          textureSize ( global 3-component vector of int)
-0:109            'Sca' ( uniform samplerCubeArray)
-0:109            Constant:
-0:109              3 (const int)
-0:110      Sequence
-0:110        move second child to first child ( temp 4-component vector of float)
-0:110          'b' ( temp 4-component vector of float)
-0:110          texture ( global 4-component vector of float)
-0:110            'Sca' ( uniform samplerCubeArray)
-0:110            'i' ( smooth in 4-component vector of float)
-0:111      Sequence
-0:111        move second child to first child ( temp 4-component vector of int)
-0:111          'c' ( temp 4-component vector of int)
-0:111          texture ( global 4-component vector of int)
-0:111            'Isca' ( uniform isamplerCubeArray)
-0:111            'i' ( smooth in 4-component vector of float)
-0:111            Constant:
-0:111              0.700000
+0:98      move second child to first child ( temp 4-component vector of float)
+0:98        's' ( temp 4-component vector of float)
+0:98        textureGatherOffset ( global 4-component vector of float)
+0:98          'samp2DR' ( uniform sampler2DRect)
+0:98          Constant:
+0:98            0.300000
+0:98            0.300000
+0:98          Constant:
+0:98            1 (const int)
+0:98            1 (const int)
+0:99      move second child to first child ( temp 4-component vector of float)
+0:99        's' ( temp 4-component vector of float)
+0:99        textureGatherOffset ( global 4-component vector of float)
+0:99          'samp2DS' ( uniform sampler2DShadow)
+0:99          Constant:
+0:99            0.300000
+0:99            0.300000
+0:99          Constant:
+0:99            1.300000
+0:99          Constant:
+0:99            1 (const int)
+0:99            1 (const int)
+0:100      move second child to first child ( temp 4-component vector of float)
+0:100        's' ( temp 4-component vector of float)
+0:100        textureGatherOffset ( global 4-component vector of float)
+0:100          'samp2D' ( uniform sampler2D)
+0:100          Constant:
+0:100            0.300000
+0:100            0.300000
+0:100          Constant:
+0:100            1 (const int)
+0:100            1 (const int)
+0:100          Constant:
+0:100            2 (const int)
+0:110  Function Definition: bar235( ( global void)
+0:110    Function Parameters: 
+0:112    Sequence
 0:112      Sequence
-0:112        move second child to first child ( temp 4-component vector of uint)
-0:112          'd' ( temp 4-component vector of uint)
-0:112          texture ( global 4-component vector of uint)
-0:112            'Usca' ( uniform usamplerCubeArray)
-0:112            'i' ( smooth in 4-component vector of float)
-0:114      move second child to first child ( temp 4-component vector of float)
-0:114        'b' ( temp 4-component vector of float)
-0:114        textureLod ( global 4-component vector of float)
-0:114          'Sca' ( uniform samplerCubeArray)
-0:114          'i' ( smooth in 4-component vector of float)
-0:114          Constant:
-0:114            1.700000
-0:115      move second child to first child ( temp 3-component vector of int)
-0:115        'a' ( temp 3-component vector of int)
-0:115        textureSize ( global 3-component vector of int)
-0:115          'Scas' ( uniform samplerCubeArrayShadow)
-0:115          direct index ( temp int)
-0:115            'a' ( temp 3-component vector of int)
-0:115            Constant:
-0:115              0 (const int)
-0:116      Sequence
-0:116        move second child to first child ( temp float)
-0:116          'f' ( temp float)
-0:116          texture ( global float)
-0:116            'Scas' ( uniform samplerCubeArrayShadow)
-0:116            'i' ( smooth in 4-component vector of float)
-0:116            direct index ( temp float)
-0:116              'b' ( temp 4-component vector of float)
-0:116              Constant:
-0:116                1 (const int)
-0:117      move second child to first child ( temp 4-component vector of int)
-0:117        'c' ( temp 4-component vector of int)
-0:117        textureGrad ( global 4-component vector of int)
-0:117          'Isca' ( uniform isamplerCubeArray)
+0:112        move second child to first child ( temp 3-component vector of int)
+0:112          'a' ( temp 3-component vector of int)
+0:112          textureSize ( global 3-component vector of int)
+0:112            'Sca' ( uniform samplerCubeArray)
+0:112            Constant:
+0:112              3 (const int)
+0:113      Sequence
+0:113        move second child to first child ( temp 4-component vector of float)
+0:113          'b' ( temp 4-component vector of float)
+0:113          texture ( global 4-component vector of float)
+0:113            'Sca' ( uniform samplerCubeArray)
+0:113            'i' ( smooth in 4-component vector of float)
+0:114      Sequence
+0:114        move second child to first child ( temp 4-component vector of int)
+0:114          'c' ( temp 4-component vector of int)
+0:114          texture ( global 4-component vector of int)
+0:114            'Isca' ( uniform isamplerCubeArray)
+0:114            'i' ( smooth in 4-component vector of float)
+0:114            Constant:
+0:114              0.700000
+0:115      Sequence
+0:115        move second child to first child ( temp 4-component vector of uint)
+0:115          'd' ( temp 4-component vector of uint)
+0:115          texture ( global 4-component vector of uint)
+0:115            'Usca' ( uniform usamplerCubeArray)
+0:115            'i' ( smooth in 4-component vector of float)
+0:117      move second child to first child ( temp 4-component vector of float)
+0:117        'b' ( temp 4-component vector of float)
+0:117        textureLod ( global 4-component vector of float)
+0:117          'Sca' ( uniform samplerCubeArray)
 0:117          'i' ( smooth in 4-component vector of float)
 0:117          Constant:
-0:117            0.100000
-0:117            0.100000
-0:117            0.100000
-0:117          Constant:
-0:117            0.200000
-0:117            0.200000
-0:117            0.200000
-0:129  Function Definition: bar23444( ( global void)
-0:129    Function Parameters: 
+0:117            1.700000
+0:118      move second child to first child ( temp 3-component vector of int)
+0:118        'a' ( temp 3-component vector of int)
+0:118        textureSize ( global 3-component vector of int)
+0:118          'Scas' ( uniform samplerCubeArrayShadow)
+0:118          direct index ( temp int)
+0:118            'a' ( temp 3-component vector of int)
+0:118            Constant:
+0:118              0 (const int)
+0:119      Sequence
+0:119        move second child to first child ( temp float)
+0:119          'f' ( temp float)
+0:119          texture ( global float)
+0:119            'Scas' ( uniform samplerCubeArrayShadow)
+0:119            'i' ( smooth in 4-component vector of float)
+0:119            direct index ( temp float)
+0:119              'b' ( temp 4-component vector of float)
+0:119              Constant:
+0:119                1 (const int)
+0:120      move second child to first child ( temp 4-component vector of int)
+0:120        'c' ( temp 4-component vector of int)
+0:120        textureGrad ( global 4-component vector of int)
+0:120          'Isca' ( uniform isamplerCubeArray)
+0:120          'i' ( smooth in 4-component vector of float)
+0:120          Constant:
+0:120            0.100000
+0:120            0.100000
+0:120            0.100000
+0:120          Constant:
+0:120            0.200000
+0:120            0.200000
+0:120            0.200000
+0:132  Function Definition: bar23444( ( global void)
+0:132    Function Parameters: 
 0:?     Sequence
-0:132      Sequence
-0:132        move second child to first child ( temp float)
-0:132          'a1' ( temp float)
-0:132          direct index ( temp float)
-0:132            direct index ( temp 3-component vector of float)
-0:132              'm43' ( temp 4X3 matrix of float)
-0:132              Constant:
-0:132                3 (const int)
-0:132            Constant:
-0:132              1 (const int)
-0:134      Sequence
-0:134        move second child to first child ( temp int)
-0:134          'a2' ( temp int)
-0:134          Constant:
-0:134            4 (const int)
-0:135      add second child into first child ( temp int)
-0:135        'a2' ( temp int)
-0:135        Constant:
-0:135          3 (const int)
-0:136      add second child into first child ( temp int)
-0:136        'a2' ( temp int)
-0:136        Constant:
-0:136          3 (const int)
+0:135      Sequence
+0:135        move second child to first child ( temp float)
+0:135          'a1' ( temp float)
+0:135          direct index ( temp float)
+0:135            direct index ( temp 3-component vector of float)
+0:135              'm43' ( temp 4X3 matrix of float)
+0:135              Constant:
+0:135                3 (const int)
+0:135            Constant:
+0:135              1 (const int)
 0:137      Sequence
-0:137        move second child to first child ( temp float)
-0:137          'b' ( const (read only) float)
-0:137          component-wise multiply ( temp float)
-0:137            Constant:
-0:137              2.000000
-0:137            'a1' ( temp float)
-0:138      move second child to first child ( temp float)
-0:138        direct index ( temp float)
-0:138          'a' ( global 3-component vector of float)
-0:138          Constant:
-0:138            0 (const int)
+0:137        move second child to first child ( temp int)
+0:137          'a2' ( temp int)
+0:137          Constant:
+0:137            4 (const int)
+0:138      add second child into first child ( temp int)
+0:138        'a2' ( temp int)
 0:138        Constant:
-0:138          -1.000000
-0:140      Constant:
-0:140        0.000000
-0:141      Constant:
-0:141        0.000000
+0:138          3 (const int)
+0:139      add second child into first child ( temp int)
+0:139        'a2' ( temp int)
+0:139        Constant:
+0:139          3 (const int)
+0:140      Sequence
+0:140        move second child to first child ( temp float)
+0:140          'b' ( const (read only) float)
+0:140          component-wise multiply ( temp float)
+0:140            Constant:
+0:140              2.000000
+0:140            'a1' ( temp float)
+0:141      move second child to first child ( temp float)
+0:141        direct index ( temp float)
+0:141          'a' ( global 3-component vector of float)
+0:141          Constant:
+0:141            0 (const int)
+0:141        Constant:
+0:141          -1.000000
 0:143      Constant:
-0:143        1 (const int)
-0:162  Function Definition: qux2( ( global void)
-0:162    Function Parameters: 
+0:143        0.000000
+0:144      Constant:
+0:144        0.000000
+0:146      Constant:
+0:146        1 (const int)
+0:165  Function Definition: qux2( ( global void)
+0:165    Function Parameters: 
 0:?     Sequence
-0:165      imageAtomicCompSwap ( global int)
-0:165        'iimg2D' (layout( r32i) uniform iimage2D)
-0:165        Construct ivec2 ( temp 2-component vector of int)
-0:165          'i' ( temp int)
-0:165          'i' ( temp int)
-0:165        'i' ( temp int)
-0:165        'i' ( temp int)
-0:166      Sequence
-0:166        move second child to first child ( temp 4-component vector of int)
-0:166          'pos' ( temp 4-component vector of int)
-0:166          imageLoad ( global 4-component vector of int)
-0:166            'iimg2D' (layout( r32i) uniform iimage2D)
-0:166            Construct ivec2 ( temp 2-component vector of int)
-0:166              'i' ( temp int)
-0:166              'i' ( temp int)
+0:168      imageAtomicCompSwap ( global int)
+0:168        'iimg2D' (layout( r32i) uniform iimage2D)
+0:168        Construct ivec2 ( temp 2-component vector of int)
+0:168          'i' ( temp int)
+0:168          'i' ( temp int)
+0:168        'i' ( temp int)
+0:168        'i' ( temp int)
+0:169      Sequence
+0:169        move second child to first child ( temp 4-component vector of int)
+0:169          'pos' ( temp 4-component vector of int)
+0:169          imageLoad ( global 4-component vector of int)
+0:169            'iimg2D' (layout( r32i) uniform iimage2D)
+0:169            Construct ivec2 ( temp 2-component vector of int)
+0:169              'i' ( temp int)
+0:169              'i' ( temp int)
 0:?   Linker Objects
 0:?     'a' ( global 3-component vector of float)
 0:?     'b' ( global float)
@@ -416,6 +426,7 @@
 Requested GL_ARB_explicit_attrib_location
 Requested GL_ARB_explicit_uniform_location
 Requested GL_ARB_gpu_shader5
+Requested GL_ARB_sample_shading
 Requested GL_ARB_separate_shader_objects
 Requested GL_ARB_shader_image_load_store
 Requested GL_ARB_shading_language_420pack
diff --git a/Test/baseResults/140.frag.out b/Test/baseResults/140.frag.out
index 7ce2170..702718a 100644
--- a/Test/baseResults/140.frag.out
+++ b/Test/baseResults/140.frag.out
@@ -1,14 +1,15 @@
 140.frag
 WARNING: 0:3: varying deprecated in version 130; may be removed in future release
 ERROR: 0:17: '#error' : GL_ES is not set  
-ERROR: 0:20: 'fragment-shader struct input' : not supported for this version or the enabled extensions 
-ERROR: 0:24: 'location' : not supported for this version or the enabled extensions 
-ERROR: 0:24: 'location qualifier on input' : not supported for this version or the enabled extensions 
-ERROR: 0:26: 'location' : not supported for this version or the enabled extensions 
-ERROR: 0:26: 'location qualifier on output' : not supported for this version or the enabled extensions 
-ERROR: 0:40: 'assign' :  l-value required "v" (can't modify shader input)
-ERROR: 0:40: 'out' : Non-L-value cannot be passed for 'out' or 'inout' parameters. 
-ERROR: 8 compilation errors.  No code generated.
+ERROR: 0:21: 'fragment-shader struct input' : not supported for this version or the enabled extensions 
+ERROR: 0:25: 'location' : not supported for this version or the enabled extensions 
+ERROR: 0:25: 'location qualifier on input' : not supported for this version or the enabled extensions 
+ERROR: 0:27: 'location' : not supported for this version or the enabled extensions 
+ERROR: 0:27: 'location qualifier on output' : not supported for this version or the enabled extensions 
+ERROR: 0:41: 'assign' :  l-value required "v" (can't modify shader input)
+ERROR: 0:41: 'out' : Non-L-value cannot be passed for 'out' or 'inout' parameters. 
+ERROR: 0:56: '' :  syntax error, unexpected IDENTIFIER, expecting LEFT_BRACE or COMMA or SEMICOLON
+ERROR: 9 compilation errors.  No code generated.
 
 
 Shader version: 140
@@ -25,80 +26,80 @@
 0:12            'gl_ClipDistance' ( smooth in 5-element array of float ClipDistance)
 0:12            Constant:
 0:12              2 (const int)
-0:22  Sequence
-0:22    move second child to first child ( temp float)
-0:22      'patch' ( global float)
-0:22      Constant:
-0:22        3.100000
-0:38  Function Definition: foo( ( global void)
-0:38    Function Parameters: 
-0:40    Sequence
-0:40      Sequence
-0:40        move second child to first child ( temp 2-component vector of float)
-0:40          'r1' ( temp 2-component vector of float)
-0:40          modf ( global 2-component vector of float)
-0:40            vector swizzle ( temp 2-component vector of float)
-0:40              'v' ( smooth in 4-component vector of float)
-0:40              Sequence
-0:40                Constant:
-0:40                  0 (const int)
-0:40                Constant:
-0:40                  1 (const int)
-0:40            vector swizzle ( temp 2-component vector of float)
-0:40              'v' ( smooth in 4-component vector of float)
-0:40              Sequence
-0:40                Constant:
-0:40                  2 (const int)
-0:40                Constant:
-0:40                  3 (const int)
+0:23  Sequence
+0:23    move second child to first child ( temp float)
+0:23      'patch' ( global float)
+0:23      Constant:
+0:23        3.100000
+0:39  Function Definition: foo( ( global void)
+0:39    Function Parameters: 
+0:41    Sequence
 0:41      Sequence
 0:41        move second child to first child ( temp 2-component vector of float)
-0:41          'r2' ( temp 2-component vector of float)
+0:41          'r1' ( temp 2-component vector of float)
 0:41          modf ( global 2-component vector of float)
 0:41            vector swizzle ( temp 2-component vector of float)
-0:41              'o' ( out 4-component vector of float)
+0:41              'v' ( smooth in 4-component vector of float)
 0:41              Sequence
 0:41                Constant:
 0:41                  0 (const int)
 0:41                Constant:
 0:41                  1 (const int)
 0:41            vector swizzle ( temp 2-component vector of float)
-0:41              'o' ( out 4-component vector of float)
+0:41              'v' ( smooth in 4-component vector of float)
 0:41              Sequence
 0:41                Constant:
 0:41                  2 (const int)
 0:41                Constant:
 0:41                  3 (const int)
-0:42      move second child to first child ( temp float)
-0:42        direct index ( temp float)
-0:42          'o' ( out 4-component vector of float)
-0:42          Constant:
-0:42            2 (const int)
-0:42        Function Call: fooi( ( global float)
-0:47  Sequence
-0:47    move second child to first child ( temp float)
-0:47      'i1' ( global float)
-0:47      Test condition and select ( temp float)
-0:47        Condition
-0:47        'gl_FrontFacing' ( gl_FrontFacing bool Face)
-0:47        true case
-0:47        Constant:
-0:47          -2.000000
-0:47        false case
-0:47        Constant:
-0:47          2.000000
+0:42      Sequence
+0:42        move second child to first child ( temp 2-component vector of float)
+0:42          'r2' ( temp 2-component vector of float)
+0:42          modf ( global 2-component vector of float)
+0:42            vector swizzle ( temp 2-component vector of float)
+0:42              'o' ( out 4-component vector of float)
+0:42              Sequence
+0:42                Constant:
+0:42                  0 (const int)
+0:42                Constant:
+0:42                  1 (const int)
+0:42            vector swizzle ( temp 2-component vector of float)
+0:42              'o' ( out 4-component vector of float)
+0:42              Sequence
+0:42                Constant:
+0:42                  2 (const int)
+0:42                Constant:
+0:42                  3 (const int)
+0:43      move second child to first child ( temp float)
+0:43        direct index ( temp float)
+0:43          'o' ( out 4-component vector of float)
+0:43          Constant:
+0:43            2 (const int)
+0:43        Function Call: fooi( ( global float)
 0:48  Sequence
 0:48    move second child to first child ( temp float)
-0:48      'i2' ( global float)
-0:48      Constant:
-0:48        102.000000
-0:50  Function Definition: fooi( ( global float)
-0:50    Function Parameters: 
-0:52    Sequence
-0:52      Branch: Return with expression
-0:52        add ( temp float)
-0:52          'i1' ( global float)
-0:52          'i2' ( global float)
+0:48      'i1' ( global float)
+0:48      Test condition and select ( temp float)
+0:48        Condition
+0:48        'gl_FrontFacing' ( gl_FrontFacing bool Face)
+0:48        true case
+0:48        Constant:
+0:48          -2.000000
+0:48        false case
+0:48        Constant:
+0:48          2.000000
+0:49  Sequence
+0:49    move second child to first child ( temp float)
+0:49      'i2' ( global float)
+0:49      Constant:
+0:49        102.000000
+0:51  Function Definition: fooi( ( global float)
+0:51    Function Parameters: 
+0:53    Sequence
+0:53      Branch: Return with expression
+0:53        add ( temp float)
+0:53          'i1' ( global float)
+0:53          'i2' ( global float)
 0:?   Linker Objects
 0:?     'v' ( smooth in 4-component vector of float)
 0:?     'i' ( smooth in 4-component vector of float)
@@ -131,28 +132,28 @@
 0:12            'gl_ClipDistance' ( smooth in 5-element array of float ClipDistance)
 0:12            Constant:
 0:12              2 (const int)
-0:22  Sequence
-0:22    move second child to first child ( temp float)
-0:22      'patch' ( global float)
-0:22      Constant:
-0:22        3.100000
-0:47  Sequence
-0:47    move second child to first child ( temp float)
-0:47      'i1' ( global float)
-0:47      Test condition and select ( temp float)
-0:47        Condition
-0:47        'gl_FrontFacing' ( gl_FrontFacing bool Face)
-0:47        true case
-0:47        Constant:
-0:47          -2.000000
-0:47        false case
-0:47        Constant:
-0:47          2.000000
+0:23  Sequence
+0:23    move second child to first child ( temp float)
+0:23      'patch' ( global float)
+0:23      Constant:
+0:23        3.100000
 0:48  Sequence
 0:48    move second child to first child ( temp float)
-0:48      'i2' ( global float)
-0:48      Constant:
-0:48        102.000000
+0:48      'i1' ( global float)
+0:48      Test condition and select ( temp float)
+0:48        Condition
+0:48        'gl_FrontFacing' ( gl_FrontFacing bool Face)
+0:48        true case
+0:48        Constant:
+0:48          -2.000000
+0:48        false case
+0:48        Constant:
+0:48          2.000000
+0:49  Sequence
+0:49    move second child to first child ( temp float)
+0:49      'i2' ( global float)
+0:49      Constant:
+0:49        102.000000
 0:?   Linker Objects
 0:?     'v' ( smooth in 4-component vector of float)
 0:?     'i' ( smooth in 4-component vector of float)
diff --git a/Test/baseResults/410.vert.out b/Test/baseResults/410.vert.out
index aacdf36..79268bc 100644
--- a/Test/baseResults/410.vert.out
+++ b/Test/baseResults/410.vert.out
@@ -3,6 +3,12 @@
 0:? Sequence
 0:7  Function Definition: main( ( global void)
 0:7    Function Parameters: 
+0:9    Sequence
+0:9      Sequence
+0:9        move second child to first child ( temp int)
+0:9          'test' ( temp int)
+0:9          Constant:
+0:9            16 (const int)
 0:?   Linker Objects
 0:?     'd' ( in double)
 0:?     'd3' ( in 3-component vector of double)
@@ -18,6 +24,12 @@
 0:? Sequence
 0:7  Function Definition: main( ( global void)
 0:7    Function Parameters: 
+0:9    Sequence
+0:9      Sequence
+0:9        move second child to first child ( temp int)
+0:9          'test' ( temp int)
+0:9          Constant:
+0:9            16 (const int)
 0:?   Linker Objects
 0:?     'd' ( in double)
 0:?     'd3' ( in 3-component vector of double)
diff --git a/Test/baseResults/atomic_uint.frag.out b/Test/baseResults/atomic_uint.frag.out
index c705a06..a0c6773 100644
--- a/Test/baseResults/atomic_uint.frag.out
+++ b/Test/baseResults/atomic_uint.frag.out
@@ -1,64 +1,65 @@
 atomic_uint.frag
-ERROR: 0:10: 'atomic_uint' : samplers and atomic_uints cannot be output parameters 
-ERROR: 0:12: 'return' : type does not match, or is not convertible to, the function's return type 
-ERROR: 0:18: 'atomic_uint' : atomic_uints can only be used in uniform variables or function parameters: non_uniform_counter
-ERROR: 0:23: 'binding' : atomic_uint binding is too large; see gl_MaxAtomicCounterBindings 
-ERROR: 0:28: '+' :  wrong operand types: no operation '+' exists that takes a left-hand operand of type 'layout( binding=0 offset=0) uniform atomic_uint' and a right operand of type 'layout( binding=0 offset=0) uniform atomic_uint' (or there is no acceptable conversion)
-ERROR: 0:29: '-' :  wrong operand type no operation '-' exists that takes an operand of type layout( binding=0 offset=0) uniform atomic_uint (or there is no acceptable conversion)
-ERROR: 0:31: '[]' : scalar integer expression required 
-ERROR: 0:34: 'assign' :  l-value required "counter" (can't modify a uniform)
-ERROR: 0:34: 'assign' :  cannot convert from ' const int' to 'layout( binding=0 offset=0) uniform atomic_uint'
-ERROR: 0:37: 'atomic_uint' : atomic_uints can only be used in uniform variables or function parameters: acin
-ERROR: 0:38: 'atomic_uint' : atomic_uints can only be used in uniform variables or function parameters: acg
-ERROR: 0:47: 'offset' : atomic counters sharing the same offset: 12
-ERROR: 0:48: 'binding' : atomic_uint binding is too large; see gl_MaxAtomicCounterBindings 
-ERROR: 13 compilation errors.  No code generated.
+ERROR: 0:4: 'counter' : redefinition 
+ERROR: 0:11: 'atomic_uint' : samplers and atomic_uints cannot be output parameters 
+ERROR: 0:13: 'return' : type does not match, or is not convertible to, the function's return type 
+ERROR: 0:19: 'atomic_uint' : atomic_uints can only be used in uniform variables or function parameters: non_uniform_counter
+ERROR: 0:24: 'binding' : atomic_uint binding is too large; see gl_MaxAtomicCounterBindings 
+ERROR: 0:29: '+' :  wrong operand types: no operation '+' exists that takes a left-hand operand of type 'layout( binding=0 offset=0) uniform atomic_uint' and a right operand of type 'layout( binding=0 offset=0) uniform atomic_uint' (or there is no acceptable conversion)
+ERROR: 0:30: '-' :  wrong operand type no operation '-' exists that takes an operand of type layout( binding=0 offset=0) uniform atomic_uint (or there is no acceptable conversion)
+ERROR: 0:32: '[]' : scalar integer expression required 
+ERROR: 0:35: 'assign' :  l-value required "counter" (can't modify a uniform)
+ERROR: 0:35: 'assign' :  cannot convert from ' const int' to 'layout( binding=0 offset=0) uniform atomic_uint'
+ERROR: 0:38: 'atomic_uint' : atomic_uints can only be used in uniform variables or function parameters: acin
+ERROR: 0:39: 'atomic_uint' : atomic_uints can only be used in uniform variables or function parameters: acg
+ERROR: 0:48: 'offset' : atomic counters sharing the same offset: 12
+ERROR: 0:49: 'binding' : atomic_uint binding is too large; see gl_MaxAtomicCounterBindings 
+ERROR: 14 compilation errors.  No code generated.
 
 
 Shader version: 420
 ERROR: node is still EOpNull!
-0:5  Function Definition: func(au1; ( global uint)
-0:5    Function Parameters: 
-0:5      'c' ( in atomic_uint)
-0:7    Sequence
-0:7      Branch: Return with expression
-0:7        AtomicCounterIncrement ( global uint)
-0:7          'c' ( in atomic_uint)
-0:10  Function Definition: func2(au1; ( global uint)
-0:10    Function Parameters: 
-0:10      'c' ( out atomic_uint)
-0:12    Sequence
-0:12      Branch: Return with expression
-0:12        'counter' (layout( binding=0 offset=0) uniform atomic_uint)
+0:6  Function Definition: func(au1; ( global uint)
+0:6    Function Parameters: 
+0:6      'c' ( in atomic_uint)
+0:8    Sequence
+0:8      Branch: Return with expression
+0:8        AtomicCounterIncrement ( global uint)
+0:8          'c' ( in atomic_uint)
+0:11  Function Definition: func2(au1; ( global uint)
+0:11    Function Parameters: 
+0:11      'c' ( out atomic_uint)
+0:13    Sequence
 0:13      Branch: Return with expression
-0:13        AtomicCounter ( global uint)
-0:13          'counter' (layout( binding=0 offset=0) uniform atomic_uint)
-0:16  Function Definition: main( ( global void)
-0:16    Function Parameters: 
+0:13        'counter' (layout( binding=0 offset=0) uniform atomic_uint)
+0:14      Branch: Return with expression
+0:14        AtomicCounter ( global uint)
+0:14          'counter' (layout( binding=0 offset=0) uniform atomic_uint)
+0:17  Function Definition: main( ( global void)
+0:17    Function Parameters: 
 0:?     Sequence
-0:19      Sequence
-0:19        move second child to first child ( temp uint)
-0:19          'val' ( temp uint)
-0:19          AtomicCounter ( global uint)
-0:19            'counter' (layout( binding=0 offset=0) uniform atomic_uint)
-0:20      AtomicCounterDecrement ( global uint)
-0:20        'counter' (layout( binding=0 offset=0) uniform atomic_uint)
-0:26  Function Definition: opac( ( global void)
-0:26    Function Parameters: 
-0:28    Sequence
-0:28      'counter' (layout( binding=0 offset=0) uniform atomic_uint)
+0:20      Sequence
+0:20        move second child to first child ( temp uint)
+0:20          'val' ( temp uint)
+0:20          AtomicCounter ( global uint)
+0:20            'counter' (layout( binding=0 offset=0) uniform atomic_uint)
+0:21      AtomicCounterDecrement ( global uint)
+0:21        'counter' (layout( binding=0 offset=0) uniform atomic_uint)
+0:27  Function Definition: opac( ( global void)
+0:27    Function Parameters: 
+0:29    Sequence
 0:29      'counter' (layout( binding=0 offset=0) uniform atomic_uint)
-0:31      indirect index ( temp int)
-0:31        'a' ( temp 3-element array of int)
-0:31        'counter' (layout( binding=0 offset=0) uniform atomic_uint)
-0:32      direct index (layout( binding=1 offset=3) temp atomic_uint)
-0:32        'countArr' (layout( binding=1 offset=3) uniform 4-element array of atomic_uint)
-0:32        Constant:
-0:32          2 (const int)
-0:33      indirect index (layout( binding=1 offset=3) temp atomic_uint)
+0:30      'counter' (layout( binding=0 offset=0) uniform atomic_uint)
+0:32      indirect index ( temp int)
+0:32        'a' ( temp 3-element array of int)
+0:32        'counter' (layout( binding=0 offset=0) uniform atomic_uint)
+0:33      direct index (layout( binding=1 offset=3) temp atomic_uint)
 0:33        'countArr' (layout( binding=1 offset=3) uniform 4-element array of atomic_uint)
-0:33        'i' ( uniform int)
-0:34      'counter' (layout( binding=0 offset=0) uniform atomic_uint)
+0:33        Constant:
+0:33          2 (const int)
+0:34      indirect index (layout( binding=1 offset=3) temp atomic_uint)
+0:34        'countArr' (layout( binding=1 offset=3) uniform 4-element array of atomic_uint)
+0:34        'i' ( uniform int)
+0:35      'counter' (layout( binding=0 offset=0) uniform atomic_uint)
 0:?   Linker Objects
 0:?     'counter' (layout( binding=0 offset=0) uniform atomic_uint)
 0:?     'countArr' (layout( binding=1 offset=3) uniform 4-element array of atomic_uint)
@@ -68,8 +69,8 @@
 0:?     'aNoBind' ( uniform atomic_uint)
 0:?     'aOffset' (layout( binding=0 offset=32) uniform atomic_uint)
 0:?     'bar3' (layout( binding=0 offset=4) uniform atomic_uint)
-0:?     'ac' (layout( binding=0 offset=8) uniform 3-element array of atomic_uint)
-0:?     'ad' (layout( binding=0 offset=20) uniform atomic_uint)
+0:?     'ac' (layout( binding=0 offset=8) uniform 2-element array of atomic_uint)
+0:?     'ad' (layout( binding=0 offset=16) uniform atomic_uint)
 0:?     'bar4' (layout( offset=8) uniform atomic_uint)
 0:?     'overlap' (layout( binding=0 offset=12) uniform atomic_uint)
 0:?     'bigBind' (layout( binding=20) uniform atomic_uint)
@@ -80,16 +81,16 @@
 
 Shader version: 420
 ERROR: node is still EOpNull!
-0:16  Function Definition: main( ( global void)
-0:16    Function Parameters: 
+0:17  Function Definition: main( ( global void)
+0:17    Function Parameters: 
 0:?     Sequence
-0:19      Sequence
-0:19        move second child to first child ( temp uint)
-0:19          'val' ( temp uint)
-0:19          AtomicCounter ( global uint)
-0:19            'counter' (layout( binding=0 offset=0) uniform atomic_uint)
-0:20      AtomicCounterDecrement ( global uint)
-0:20        'counter' (layout( binding=0 offset=0) uniform atomic_uint)
+0:20      Sequence
+0:20        move second child to first child ( temp uint)
+0:20          'val' ( temp uint)
+0:20          AtomicCounter ( global uint)
+0:20            'counter' (layout( binding=0 offset=0) uniform atomic_uint)
+0:21      AtomicCounterDecrement ( global uint)
+0:21        'counter' (layout( binding=0 offset=0) uniform atomic_uint)
 0:?   Linker Objects
 0:?     'counter' (layout( binding=0 offset=0) uniform atomic_uint)
 0:?     'countArr' (layout( binding=1 offset=3) uniform 4-element array of atomic_uint)
@@ -99,8 +100,8 @@
 0:?     'aNoBind' ( uniform atomic_uint)
 0:?     'aOffset' (layout( binding=0 offset=32) uniform atomic_uint)
 0:?     'bar3' (layout( binding=0 offset=4) uniform atomic_uint)
-0:?     'ac' (layout( binding=0 offset=8) uniform 3-element array of atomic_uint)
-0:?     'ad' (layout( binding=0 offset=20) uniform atomic_uint)
+0:?     'ac' (layout( binding=0 offset=8) uniform 2-element array of atomic_uint)
+0:?     'ad' (layout( binding=0 offset=16) uniform atomic_uint)
 0:?     'bar4' (layout( offset=8) uniform atomic_uint)
 0:?     'overlap' (layout( binding=0 offset=12) uniform atomic_uint)
 0:?     'bigBind' (layout( binding=20) uniform atomic_uint)
diff --git a/Test/baseResults/hlsl.int.dot.frag.out b/Test/baseResults/hlsl.int.dot.frag.out
index a691836..7ea22a1 100644
--- a/Test/baseResults/hlsl.int.dot.frag.out
+++ b/Test/baseResults/hlsl.int.dot.frag.out
@@ -295,7 +295,7 @@
               39:   17(ivec2) Load 19(i3)
               40:   17(ivec2) IMul 38 39
               41:     11(int) CompositeExtract 40 0
-              42:     11(int) CompositeExtract 38 1
+              42:     11(int) CompositeExtract 40 1
               43:     11(int) IAdd 41 42
               44:   17(ivec2) CompositeConstruct 43 43
                               Store 19(i3) 44
@@ -303,9 +303,9 @@
               46:   22(ivec3) Load 24(i4)
               47:   22(ivec3) IMul 45 46
               48:     11(int) CompositeExtract 47 0
-              49:     11(int) CompositeExtract 45 1
+              49:     11(int) CompositeExtract 47 1
               50:     11(int) IAdd 48 49
-              51:     11(int) CompositeExtract 45 2
+              51:     11(int) CompositeExtract 47 2
               52:     11(int) IAdd 50 51
               53:   22(ivec3) CompositeConstruct 52 52 52
                               Store 24(i4) 53
@@ -313,11 +313,11 @@
               55:   27(ivec4) Load 29(i5)
               56:   27(ivec4) IMul 54 55
               57:     11(int) CompositeExtract 56 0
-              58:     11(int) CompositeExtract 54 1
+              58:     11(int) CompositeExtract 56 1
               59:     11(int) IAdd 57 58
-              60:     11(int) CompositeExtract 54 2
+              60:     11(int) CompositeExtract 56 2
               61:     11(int) IAdd 59 60
-              62:     11(int) CompositeExtract 54 3
+              62:     11(int) CompositeExtract 56 3
               63:     11(int) IAdd 61 62
               64:   27(ivec4) CompositeConstruct 63 63 63 63
                               Store 29(i5) 64
diff --git a/glslang/Include/revision.h b/glslang/Include/revision.h
index 5933bce..a0e4b20 100644
--- a/glslang/Include/revision.h
+++ b/glslang/Include/revision.h
@@ -1,3 +1,3 @@
 // This header is generated by the make-revision script.
 
-#define GLSLANG_PATCH_LEVEL 3500
+#define GLSLANG_PATCH_LEVEL 3559
diff --git a/glslang/MachineIndependent/Initialize.cpp b/glslang/MachineIndependent/Initialize.cpp
index c14a039..1e810bc 100644
--- a/glslang/MachineIndependent/Initialize.cpp
+++ b/glslang/MachineIndependent/Initialize.cpp
@@ -5178,19 +5178,25 @@
                 "flat in int gl_PrimitiveID;"
                 );
 
-        if (version >= 400) {
+        if (version >= 130) { // ARB_sample_shading
             stageBuiltins[EShLangFragment].append(
                 "flat in  int  gl_SampleID;"
                 "     in  vec2 gl_SamplePosition;"
-                "flat in  int  gl_SampleMaskIn[];"
                 "     out int  gl_SampleMask[];"
                 );
-            if (spvVersion.spv == 0)
+
+            if (spvVersion.spv == 0) {
                 stageBuiltins[EShLangFragment].append(
                     "uniform int gl_NumSamples;"
-                    );
+                );
+            }
         }
 
+        if (version >= 400)
+            stageBuiltins[EShLangFragment].append(
+                "flat in  int  gl_SampleMaskIn[];"
+            );
+
         if (version >= 430)
             stageBuiltins[EShLangFragment].append(
                 "flat in int gl_Layer;"
@@ -6621,6 +6627,14 @@
     } else {
         // non-ES profile
 
+        if (version > 400) {
+            snprintf(builtInConstant, maxSize, "const int  gl_MaxVertexUniformVectors = %d;", resources.maxVertexUniformVectors);
+            s.append(builtInConstant);
+
+            snprintf(builtInConstant, maxSize, "const int  gl_MaxFragmentUniformVectors = %d;", resources.maxFragmentUniformVectors);
+            s.append(builtInConstant);
+        }
+
         snprintf(builtInConstant, maxSize, "const int  gl_MaxVertexAttribs = %d;", resources.maxVertexAttribs);
         s.append(builtInConstant);
 
@@ -7422,18 +7436,29 @@
             BuiltInVariable("gl_FragStencilRefARB", EbvFragStencilRef, symbolTable);
         }
 
-        if ((profile != EEsProfile && version >= 400) ||
+        if ((profile != EEsProfile && version >= 130) ||
             (profile == EEsProfile && version >= 310)) {
-            BuiltInVariable("gl_SampleID",        EbvSampleId,       symbolTable);
-            BuiltInVariable("gl_SamplePosition",  EbvSamplePosition, symbolTable);
-            BuiltInVariable("gl_SampleMaskIn",    EbvSampleMask,     symbolTable);
-            BuiltInVariable("gl_SampleMask",      EbvSampleMask,     symbolTable);
-            if (profile == EEsProfile && version < 320) {
-                symbolTable.setVariableExtensions("gl_SampleID",       1, &E_GL_OES_sample_variables);
-                symbolTable.setVariableExtensions("gl_SamplePosition", 1, &E_GL_OES_sample_variables);
-                symbolTable.setVariableExtensions("gl_SampleMaskIn",   1, &E_GL_OES_sample_variables);
-                symbolTable.setVariableExtensions("gl_SampleMask",     1, &E_GL_OES_sample_variables);
-                symbolTable.setVariableExtensions("gl_NumSamples",     1, &E_GL_OES_sample_variables);
+            BuiltInVariable("gl_SampleID",           EbvSampleId,       symbolTable);
+            BuiltInVariable("gl_SamplePosition",     EbvSamplePosition, symbolTable);
+            BuiltInVariable("gl_SampleMask",         EbvSampleMask,     symbolTable);
+
+            if (profile != EEsProfile && version < 400) {
+                BuiltInVariable("gl_NumSamples",     EbvSampleMask,     symbolTable);
+
+                symbolTable.setVariableExtensions("gl_SampleMask",     1, &E_GL_ARB_sample_shading);
+                symbolTable.setVariableExtensions("gl_SampleID",       1, &E_GL_ARB_sample_shading);
+                symbolTable.setVariableExtensions("gl_SamplePosition", 1, &E_GL_ARB_sample_shading);
+                symbolTable.setVariableExtensions("gl_NumSamples",     1, &E_GL_ARB_sample_shading);
+            } else {
+                BuiltInVariable("gl_SampleMaskIn",    EbvSampleMask,     symbolTable);
+
+                if (profile == EEsProfile && version < 320) {
+                    symbolTable.setVariableExtensions("gl_SampleID", 1, &E_GL_OES_sample_variables);
+                    symbolTable.setVariableExtensions("gl_SamplePosition", 1, &E_GL_OES_sample_variables);
+                    symbolTable.setVariableExtensions("gl_SampleMaskIn", 1, &E_GL_OES_sample_variables);
+                    symbolTable.setVariableExtensions("gl_SampleMask", 1, &E_GL_OES_sample_variables);
+                    symbolTable.setVariableExtensions("gl_NumSamples", 1, &E_GL_OES_sample_variables);
+                }
             }
         }
 
diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp
index d7a8510..1702341 100644
--- a/glslang/MachineIndependent/ParseHelper.cpp
+++ b/glslang/MachineIndependent/ParseHelper.cpp
@@ -6035,6 +6035,10 @@
                 offset = qualifier.layoutOffset;
             else
                 offset = atomicUintOffsets[qualifier.layoutBinding];
+
+            if (offset % 4 != 0)
+                error(loc, "atomic counters offset should align based on 4:", "offset", "%d", offset);
+
             symbol.getWritableType().getQualifier().layoutOffset = offset;
 
             // Check for overlap
@@ -7611,7 +7615,7 @@
     switch (qualifier.storage) {
     case EvqUniform:
         profileRequires(loc, EEsProfile, 300, nullptr, "uniform block");
-        profileRequires(loc, ENoProfile, 140, nullptr, "uniform block");
+        profileRequires(loc, ENoProfile, 140, E_GL_ARB_uniform_buffer_object, "uniform block");
         if (currentBlockQualifier.layoutPacking == ElpStd430 && ! currentBlockQualifier.isPushConstant())
             requireExtensions(loc, 1, &E_GL_EXT_scalar_block_layout, "std430 requires the buffer storage qualifier");
         break;
diff --git a/glslang/MachineIndependent/Scan.cpp b/glslang/MachineIndependent/Scan.cpp
index 75cc475..710af4a 100644
--- a/glslang/MachineIndependent/Scan.cpp
+++ b/glslang/MachineIndependent/Scan.cpp
@@ -1421,6 +1421,9 @@
         afterType = true;
         if (parseContext.isEsProfile() && parseContext.version >= 310)
             return keyword;
+        if (!parseContext.isEsProfile() && (parseContext.version > 140 ||
+            (parseContext.version == 140 && parseContext.extensionsTurnedOn(1, &E_GL_ARB_texture_multisample))))
+            return keyword;
         return es30ReservedFromGLSL(150);
 
     case SAMPLER2DMSARRAY:
@@ -1430,6 +1433,9 @@
         if ((parseContext.isEsProfile() && parseContext.version >= 320) ||
             parseContext.extensionsTurnedOn(1, &E_GL_OES_texture_storage_multisample_2d_array))
             return keyword;
+        if (!parseContext.isEsProfile() && (parseContext.version > 140 ||
+            (parseContext.version == 140 && parseContext.extensionsTurnedOn(1, &E_GL_ARB_texture_multisample))))
+            return keyword;
         return es30ReservedFromGLSL(150);
 
     case SAMPLER1D:
diff --git a/glslang/MachineIndependent/Versions.cpp b/glslang/MachineIndependent/Versions.cpp
index 23cc530..23f7423 100644
--- a/glslang/MachineIndependent/Versions.cpp
+++ b/glslang/MachineIndependent/Versions.cpp
@@ -172,6 +172,7 @@
     extensionBehavior[E_GL_ARB_tessellation_shader]          = EBhDisable;
     extensionBehavior[E_GL_ARB_enhanced_layouts]             = EBhDisable;
     extensionBehavior[E_GL_ARB_texture_cube_map_array]       = EBhDisable;
+    extensionBehavior[E_GL_ARB_texture_multisample]          = EBhDisable;
     extensionBehavior[E_GL_ARB_shader_texture_lod]           = EBhDisable;
     extensionBehavior[E_GL_ARB_explicit_attrib_location]     = EBhDisable;
     extensionBehavior[E_GL_ARB_explicit_uniform_location]    = EBhDisable;
@@ -192,6 +193,8 @@
     extensionBehavior[E_GL_ARB_shader_viewport_layer_array]  = EBhDisable;
     extensionBehavior[E_GL_ARB_fragment_shader_interlock]    = EBhDisable;
     extensionBehavior[E_GL_ARB_shader_clock]                 = EBhDisable;
+    extensionBehavior[E_GL_ARB_uniform_buffer_object]        = EBhDisable;
+    extensionBehavior[E_GL_ARB_sample_shading]               = EBhDisable;
 
     extensionBehavior[E_GL_KHR_shader_subgroup_basic]            = EBhDisable;
     extensionBehavior[E_GL_KHR_shader_subgroup_vote]             = EBhDisable;
@@ -379,6 +382,7 @@
             "#define GL_ARB_tessellation_shader 1\n"
             "#define GL_ARB_enhanced_layouts 1\n"
             "#define GL_ARB_texture_cube_map_array 1\n"
+            "#define GL_ARB_texture_multisample 1\n"
             "#define GL_ARB_shader_texture_lod 1\n"
             "#define GL_ARB_explicit_attrib_location 1\n"
             "#define GL_ARB_explicit_uniform_location 1\n"
@@ -394,9 +398,11 @@
             "#define GL_ARB_sparse_texture2 1\n"
             "#define GL_ARB_sparse_texture_clamp 1\n"
             "#define GL_ARB_shader_stencil_export 1\n"
+            "#define GL_ARB_sample_shading 1\n"
 //            "#define GL_ARB_cull_distance 1\n"    // present for 4.5, but need extension control over block members
             "#define GL_ARB_post_depth_coverage 1\n"
             "#define GL_ARB_fragment_shader_interlock 1\n"
+            "#define GL_ARB_uniform_buffer_object 1\n"
             "#define GL_EXT_shader_non_constant_global_initializers 1\n"
             "#define GL_EXT_shader_image_load_formatted 1\n"
             "#define GL_EXT_post_depth_coverage 1\n"
diff --git a/glslang/MachineIndependent/Versions.h b/glslang/MachineIndependent/Versions.h
index 5048ad7..d319a2d 100644
--- a/glslang/MachineIndependent/Versions.h
+++ b/glslang/MachineIndependent/Versions.h
@@ -124,6 +124,7 @@
 const char* const E_GL_ARB_tessellation_shader          = "GL_ARB_tessellation_shader";
 const char* const E_GL_ARB_enhanced_layouts             = "GL_ARB_enhanced_layouts";
 const char* const E_GL_ARB_texture_cube_map_array       = "GL_ARB_texture_cube_map_array";
+const char* const E_GL_ARB_texture_multisample          = "GL_ARB_texture_multisample";
 const char* const E_GL_ARB_shader_texture_lod           = "GL_ARB_shader_texture_lod";
 const char* const E_GL_ARB_explicit_attrib_location     = "GL_ARB_explicit_attrib_location";
 const char* const E_GL_ARB_explicit_uniform_location    = "GL_ARB_explicit_uniform_location";
@@ -144,6 +145,8 @@
 const char* const E_GL_ARB_shader_viewport_layer_array  = "GL_ARB_shader_viewport_layer_array";
 const char* const E_GL_ARB_fragment_shader_interlock    = "GL_ARB_fragment_shader_interlock";
 const char* const E_GL_ARB_shader_clock                 = "GL_ARB_shader_clock";
+const char* const E_GL_ARB_uniform_buffer_object        = "GL_ARB_uniform_buffer_object";
+const char* const E_GL_ARB_sample_shading               = "GL_ARB_sample_shading";
 
 const char* const E_GL_KHR_shader_subgroup_basic            = "GL_KHR_shader_subgroup_basic";
 const char* const E_GL_KHR_shader_subgroup_vote             = "GL_KHR_shader_subgroup_vote";