Front-end Arrays of arrays: Add ES-specific checks and tests. AoA should be quite...
authorJohn Kessenich <cepheus@frii.com>
Fri, 11 Sep 2015 21:25:38 +0000 (15:25 -0600)
committerJohn Kessenich <cepheus@frii.com>
Fri, 11 Sep 2015 21:25:38 +0000 (15:25 -0600)
16 files changed:
Test/310.comp
Test/310.frag
Test/310AofA.vert
Test/430.comp
Test/baseResults/300.frag.out
Test/baseResults/300.vert.out
Test/baseResults/310.comp.out
Test/baseResults/310.frag.out
Test/baseResults/310AofA.vert.out
Test/baseResults/310implicitSizeArrayError.vert.out
Test/baseResults/430.comp.out
glslang/Include/arrays.h
glslang/Include/revision.h
glslang/MachineIndependent/ParseHelper.cpp
glslang/MachineIndependent/ParseHelper.h
glslang/MachineIndependent/glslang.y

index 4c2cfd7..d6b2c97 100644 (file)
@@ -236,3 +236,5 @@ float t__;  // ERROR, no __ until revision 310
 
     // ERROR, no __ until revision 310
 #define __D
+
+shared vec4 arr[2][3][4];
index 116a0a7..78f13f6 100644 (file)
@@ -427,3 +427,5 @@ layout(blend_support_hsl_luminosity) struct badS {int i;};     // ERROR, only on
 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
index eb68d89..a196388 100644 (file)
@@ -12,3 +12,104 @@ void main() {
   int[NY][NX] d;
   f(false, 12.1, uint[NZ](uint(0),uint(1),uint(1),uint(2)), d);
 }
+
+buffer b {\r
+    float u[];  // ERROR\r
+    vec4 v[];\r
+} name[3];
+\r
+uniform ub {\r
+    float u;\r
+    vec4 v[];   // ERROR\r
+} uname[3];
+
+buffer b2 {\r
+    float u;\r
+    vec4 v[][];  // ERROR\r
+} name2[3];
+
+buffer b3 {\r
+    float u; \r
+    vec4 v[][7];\r
+} name3[3];
+
+// General arrays of arrays
+\r
+float[4][5][6] many[1][2][3];\r
+\r
+float gu[][7];     // ERROR, size required\r
+float g4[4][7];\r
+float g5[5][7];\r
+\r
+float[4][7] foo(float a[5][7])\r
+{\r
+    float r[7];\r
+    r = a[2];\r
+    float[](a[0], a[1], r, a[3]);              // ERROR, too few dims\r
+    float[4][7][4](a[0], a[1], r, a[3]);       // ERROR, too many dims\r
+    return float[4][7](a[0], a[1], r, a[3]);\r
+    return float[][](a[0], a[1], r, a[3]);\r
+    return float[][7](a[0], a[1], a[2], a[3]);\r
+}\r
+\r
+void bar(float[5][7]) {}\r
+\r
+void foo2()\r
+{\r
+    {\r
+        float gu[3][4][2];\r
+\r
+        gu[2][4][1] = 4.0;                     // ERROR, overflow\r
+    }\r
+    vec4 ca4[3][2] = vec4[][](vec4[2](vec4(0.0), vec4(1.0)),\r
+                              vec4[2](vec4(0.0), vec4(1.0)),\r
+                              vec4[2](vec4(0.0), vec4(1.0)));\r
+    vec4 caim[][2] = vec4[][](vec4[2](vec4(4.0), vec4(2.0)),\r
+                              vec4[2](vec4(4.0), vec4(2.0)),\r
+                              vec4[2](vec4(4.0), vec4(2.0)));\r
+    vec4 caim2[][] = vec4[][](vec4[2](vec4(4.0), vec4(2.0)),\r
+                              vec4[2](vec4(4.0), vec4(2.0)),\r
+                              vec4[2](vec4(4.0), vec4(2.0)));\r
+    vec4 caim3[3][] = vec4[][](vec4[2](vec4(4.0), vec4(2.0)),\r
+                               vec4[2](vec4(4.0), vec4(2.0)),\r
+                               vec4[2](vec4(4.0), vec4(2.0)));\r
+\r
+    g4 = foo(g5);\r
+    g5 = g4;           // ERROR, wrong types\r
+    gu = g4;           // ERROR, not yet sized\r
+\r
+    foo(gu);           // ERROR, not yet sized\r
+    bar(g5);\r
+\r
+    if (foo(g5) == g4)\r
+        ;\r
+    if (foo(g5) == g5)  // ERROR, different types\r
+        ;\r
+\r
+    float u[5][7];\r
+    u[5][2] = 5.0;      // ERROR\r
+    foo(u);\r
+\r
+    vec4 badAss[3];\r
+    name[1].v[-1];     // ERROR\r
+    name[1].v[1] = vec4(4.3);\r
+    name[1].v = badAss;  // ERROR, bad assignemnt\r
+\r
+    name3[0].v[1].length();  // 7\r
+    name3[0].v.length();     // run time\r
+}\r
+\r
+struct badS {\r
+    int sa[];     // ERROR\r
+    int a[][];    // ERROR\r
+    int b[][2];   // ERROR\r
+    int c[2][];   // ERROR\r
+    int d[][4];   // ERROR\r
+};\r
+\r
+in float inArray[2][3];    // ERROR\r
+out float outArray[2][3];  // ERROR\r
+\r
+uniform ubaa {\r
+    int a;\r
+} ubaaname[2][3];  // ERROR\r
index 663fdde..0929432 100644 (file)
@@ -20,7 +20,7 @@ buffer ShaderStorageBlock
 \r
 buffer InvalidShaderStorageBlock\r
 {\r
-    float values[];  // ERROR\r
+    float values[];\r
     int value;\r
 } invalid;\r
 \r
index b175028..a21667e 100644 (file)
@@ -26,6 +26,7 @@ ERROR: 0:102: 'arrays of arrays' : not supported for this version or the enabled
 ERROR: 0:102: 'arrays of arrays' : not supported for this version or the enabled extensions \r
 ERROR: 0:103: 'arrays of arrays' : not supported for this version or the enabled extensions \r
 ERROR: 0:100: 'arrays of arrays' : not supported for this version or the enabled extensions \r
+ERROR: 0:100: 'array-of-array of block' : not supported with this profile: es\r
 ERROR: 0:111: 'variable indexing fragment shader ouput array' : not supported with this profile: es\r
 ERROR: 0:119: '==' : can't use with samplers or structs containing samplers \r
 ERROR: 0:120: '!=' : can't use with samplers or structs containing samplers \r
@@ -42,7 +43,7 @@ ERROR: 0:157: 'invariant' : can only apply to an output
 ERROR: 0:158: 'invariant' : can only apply to an output \r
 ERROR: 0:160: 'imageBuffer' : Reserved word. \r
 ERROR: 0:160: '' :  syntax error\r
-ERROR: 43 compilation errors.  No code generated.\r
+ERROR: 44 compilation errors.  No code generated.\r
 \r
 \r
 Shader version: 300\r
index cb861f6..d3d7cba 100644 (file)
@@ -17,7 +17,7 @@ ERROR: 0:56: '#error' : GL_ES is set
 ERROR: 0:62: '' : array size required \r
 ERROR: 0:63: '' : array size required \r
 ERROR: 0:64: '' : array size required \r
-ERROR: 0:65: 'implicitly-sized array in a block' : not supported with this profile: es\r
+ERROR: 0:65: '' : array size required \r
 ERROR: 0:67: '' : array size required \r
 ERROR: 0:76: 'invariant' : cannot change qualification after use \r
 ERROR: 0:78: 'invariant' : can only apply to an output \r
index 645b2cc..f3775e3 100644 (file)
@@ -2,7 +2,7 @@
 Warning, version 310 is not yet complete; most version-specific features are present, but some are missing.\r
 ERROR: 0:4: 'local_size' : cannot change previously set size \r
 ERROR: 0:5: 'local_size' : too large; see gl_MaxComputeWorkGroupSize \r
-ERROR: 0:23: 'values' : only the last member of a buffer block can be run-time sized \r
+ERROR: 0:23: '' : array size required \r
 ERROR: 0:39: 'in' : global storage input qualifier cannot be used in a compute shader \r
 ERROR: 0:39: 'location qualifier on input' : not supported in this stage: compute\r
 ERROR: 0:40: 'in' : global storage input qualifier cannot be used in a compute shader \r
@@ -502,6 +502,7 @@ ERROR: node is still EOpNull!
 0:?     'inbi' (in block{in highp int a})\r
 0:?     'outbi' (out block{out highp int a})\r
 0:?     't__' (global highp float)\r
+0:?     'arr' (shared 2-element array of 3-element array of 4-element array of highp 4-component vector of float)\r
 \r
 \r
 Linked compute stage:\r
@@ -928,4 +929,5 @@ ERROR: node is still EOpNull!
 0:?     'inbi' (in block{in highp int a})\r
 0:?     'outbi' (out block{out highp int a})\r
 0:?     't__' (global highp float)\r
+0:?     'arr' (shared 2-element array of 3-element array of 4-element array of highp 4-component vector of float)\r
 \r
index 910cd9c..9769eb6 100644 (file)
@@ -129,7 +129,8 @@ ERROR: 0:426: 'blend equation' : can only apply to a standalone qualifier
 ERROR: 0:427: 'blend equation' : can only apply to a standalone qualifier \r
 ERROR: 0:428: 'blend equation' : can only apply to a standalone qualifier \r
 ERROR: 0:429: 'blend_support' : unknown blend equation \r
-ERROR: 121 compilation errors.  No code generated.\r
+ERROR: 0:431: 'fragment-shader array-of-array output' : not supported with this profile: es\r
+ERROR: 122 compilation errors.  No code generated.\r
 \r
 \r
 Shader version: 310\r
@@ -1006,6 +1007,7 @@ ERROR: node is still EOpNull!
 0:?     'colorfsi' (flat sample in mediump 4-component vector of float)\r
 0:?     'sampInArray' (smooth sample in 4-element array of mediump 3-component vector of float)\r
 0:?     'badout' (out mediump 4-component vector of float)\r
+0:?     'outAA' (out 2-element array of 2-element array of mediump 4-component vector of float)\r
 \r
 \r
 Linked fragment stage:\r
@@ -1886,4 +1888,5 @@ ERROR: node is still EOpNull!
 0:?     'colorfsi' (flat sample in mediump 4-component vector of float)\r
 0:?     'sampInArray' (smooth sample in 4-element array of mediump 3-component vector of float)\r
 0:?     'badout' (out mediump 4-component vector of float)\r
+0:?     'outAA' (out 2-element array of 2-element array of mediump 4-component vector of float)\r
 \r
index 63598fc..476646c 100644 (file)
@@ -1,8 +1,32 @@
 310AofA.vert\r
 Warning, version 310 is not yet complete; most version-specific features are present, but some are missing.\r
+ERROR: 0:17: '' : array size required \r
+ERROR: 0:23: '' : array size required \r
+ERROR: 0:28: '[]' : only outermost dimension of an array of arrays can be implicitly sized \r
+ERROR: 0:40: '' : array size required \r
+ERROR: 0:48: 'constructor' : constructing non-array constituent from array argument \r
+ERROR: 0:49: 'constructior' : array constructor argument not correct type to construct array element \r
+ERROR: 0:62: '[' :  array index out of range '4'\r
+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'\r
+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'\r
+ERROR: 0:81: 'foo' : no matching overloaded function found \r
+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)\r
+ERROR: 0:90: '[' :  array index out of range '5'\r
+ERROR: 0:94: '[' :  index out of range '-1'\r
+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'\r
+ERROR: 0:103: '' : array size required \r
+ERROR: 0:104: '' : array size required \r
+ERROR: 0:105: '' : array size required \r
+ERROR: 0:106: '' : array size required \r
+ERROR: 0:107: '' : array size required \r
+ERROR: 0:110: 'vertex input arrays' : not supported with this profile: es\r
+ERROR: 0:111: 'vertex-shader array-of-array output' : not supported with this profile: es\r
+ERROR: 0:113: 'array-of-array of block' : not supported with this profile: es\r
+ERROR: 22 compilation errors.  No code generated.\r
+\r
 \r
 Shader version: 310\r
-0:? Sequence\r
+ERROR: node is still EOpNull!\r
 0:8  Function Definition: f(b1;f1;u1[4];i1[3][2]; (global void)\r
 0:8    Function Parameters: \r
 0:8      'a' (in bool)\r
@@ -23,7 +47,289 @@ Shader version: 310
 0:13          1 (const uint)\r
 0:13          2 (const uint)\r
 0:13        'd' (temp 3-element array of 2-element array of highp int)\r
+0:44  Function Definition: foo(f1[5][7]; (global 4-element array of 7-element array of highp float)\r
+0:44    Function Parameters: \r
+0:44      'a' (in 5-element array of 7-element array of highp float)\r
+0:?     Sequence\r
+0:47      move second child to first child (temp 7-element array of highp float)\r
+0:47        'r' (temp 7-element array of highp float)\r
+0:47        direct index (temp 7-element array of highp float)\r
+0:47          'a' (in 5-element array of 7-element array of highp float)\r
+0:47          Constant:\r
+0:47            2 (const int)\r
+0:48      Constant:\r
+0:48        0.000000\r
+0:49      Constant:\r
+0:49        0.000000\r
+0:50      Branch: Return with expression\r
+0:50        Construct float (temp 4-element array of 7-element array of float)\r
+0:50          direct index (temp 7-element array of highp float)\r
+0:50            'a' (in 5-element array of 7-element array of highp float)\r
+0:50            Constant:\r
+0:50              0 (const int)\r
+0:50          direct index (temp 7-element array of highp float)\r
+0:50            'a' (in 5-element array of 7-element array of highp float)\r
+0:50            Constant:\r
+0:50              1 (const int)\r
+0:50          'r' (temp 7-element array of highp float)\r
+0:50          direct index (temp 7-element array of highp float)\r
+0:50            'a' (in 5-element array of 7-element array of highp float)\r
+0:50            Constant:\r
+0:50              3 (const int)\r
+0:51      Branch: Return with expression\r
+0:51        Construct float (temp 4-element array of 7-element array of float)\r
+0:51          direct index (temp 7-element array of highp float)\r
+0:51            'a' (in 5-element array of 7-element array of highp float)\r
+0:51            Constant:\r
+0:51              0 (const int)\r
+0:51          direct index (temp 7-element array of highp float)\r
+0:51            'a' (in 5-element array of 7-element array of highp float)\r
+0:51            Constant:\r
+0:51              1 (const int)\r
+0:51          'r' (temp 7-element array of highp float)\r
+0:51          direct index (temp 7-element array of highp float)\r
+0:51            'a' (in 5-element array of 7-element array of highp float)\r
+0:51            Constant:\r
+0:51              3 (const int)\r
+0:52      Branch: Return with expression\r
+0:52        Construct float (temp 4-element array of 7-element array of float)\r
+0:52          direct index (temp 7-element array of highp float)\r
+0:52            'a' (in 5-element array of 7-element array of highp float)\r
+0:52            Constant:\r
+0:52              0 (const int)\r
+0:52          direct index (temp 7-element array of highp float)\r
+0:52            'a' (in 5-element array of 7-element array of highp float)\r
+0:52            Constant:\r
+0:52              1 (const int)\r
+0:52          direct index (temp 7-element array of highp float)\r
+0:52            'a' (in 5-element array of 7-element array of highp float)\r
+0:52            Constant:\r
+0:52              2 (const int)\r
+0:52          direct index (temp 7-element array of highp float)\r
+0:52            'a' (in 5-element array of 7-element array of highp float)\r
+0:52            Constant:\r
+0:52              3 (const int)\r
+0:55  Function Definition: bar(f1[5][7]; (global void)\r
+0:55    Function Parameters: \r
+0:55      '' (in 5-element array of 7-element array of highp float)\r
+0:57  Function Definition: foo2( (global void)\r
+0:57    Function Parameters: \r
+0:?     Sequence\r
+0:?       Sequence\r
+0:62        move second child to first child (temp highp float)\r
+0:62          direct index (temp highp float)\r
+0:62            direct index (temp 2-element array of highp float)\r
+0:62              direct index (temp 4-element array of 2-element array of highp float)\r
+0:62                'gu' (temp 3-element array of 4-element array of 2-element array of highp float)\r
+0:62                Constant:\r
+0:62                  2 (const int)\r
+0:62              Constant:\r
+0:62                4 (const int)\r
+0:62            Constant:\r
+0:62              1 (const int)\r
+0:62          Constant:\r
+0:62            4.000000\r
+0:64      Sequence\r
+0:64        move second child to first child (temp 3-element array of 2-element array of highp 4-component vector of float)\r
+0:64          'ca4' (temp 3-element array of 2-element array of highp 4-component vector of float)\r
+0:66          Constant:\r
+0:66            0.000000\r
+0:66            0.000000\r
+0:66            0.000000\r
+0:66            0.000000\r
+0:66            1.000000\r
+0:66            1.000000\r
+0:66            1.000000\r
+0:66            1.000000\r
+0:66            0.000000\r
+0:66            0.000000\r
+0:66            0.000000\r
+0:66            0.000000\r
+0:66            1.000000\r
+0:66            1.000000\r
+0:66            1.000000\r
+0:66            1.000000\r
+0:66            0.000000\r
+0:66            0.000000\r
+0:66            0.000000\r
+0:66            0.000000\r
+0:66            1.000000\r
+0:66            1.000000\r
+0:66            1.000000\r
+0:66            1.000000\r
+0:67      Sequence\r
+0:67        move second child to first child (temp 3-element array of 2-element array of highp 4-component vector of float)\r
+0:67          'caim' (temp 3-element array of 2-element array of highp 4-component vector of float)\r
+0:69          Constant:\r
+0:69            4.000000\r
+0:69            4.000000\r
+0:69            4.000000\r
+0:69            4.000000\r
+0:69            2.000000\r
+0:69            2.000000\r
+0:69            2.000000\r
+0:69            2.000000\r
+0:69            4.000000\r
+0:69            4.000000\r
+0:69            4.000000\r
+0:69            4.000000\r
+0:69            2.000000\r
+0:69            2.000000\r
+0:69            2.000000\r
+0:69            2.000000\r
+0:69            4.000000\r
+0:69            4.000000\r
+0:69            4.000000\r
+0:69            4.000000\r
+0:69            2.000000\r
+0:69            2.000000\r
+0:69            2.000000\r
+0:69            2.000000\r
+0:70      Sequence\r
+0:70        move second child to first child (temp 3-element array of 2-element array of highp 4-component vector of float)\r
+0:70          'caim2' (temp 3-element array of 2-element array of highp 4-component vector of float)\r
+0:72          Constant:\r
+0:72            4.000000\r
+0:72            4.000000\r
+0:72            4.000000\r
+0:72            4.000000\r
+0:72            2.000000\r
+0:72            2.000000\r
+0:72            2.000000\r
+0:72            2.000000\r
+0:72            4.000000\r
+0:72            4.000000\r
+0:72            4.000000\r
+0:72            4.000000\r
+0:72            2.000000\r
+0:72            2.000000\r
+0:72            2.000000\r
+0:72            2.000000\r
+0:72            4.000000\r
+0:72            4.000000\r
+0:72            4.000000\r
+0:72            4.000000\r
+0:72            2.000000\r
+0:72            2.000000\r
+0:72            2.000000\r
+0:72            2.000000\r
+0:73      Sequence\r
+0:73        move second child to first child (temp 3-element array of 2-element array of highp 4-component vector of float)\r
+0:73          'caim3' (temp 3-element array of 2-element array of highp 4-component vector of float)\r
+0:75          Constant:\r
+0:75            4.000000\r
+0:75            4.000000\r
+0:75            4.000000\r
+0:75            4.000000\r
+0:75            2.000000\r
+0:75            2.000000\r
+0:75            2.000000\r
+0:75            2.000000\r
+0:75            4.000000\r
+0:75            4.000000\r
+0:75            4.000000\r
+0:75            4.000000\r
+0:75            2.000000\r
+0:75            2.000000\r
+0:75            2.000000\r
+0:75            2.000000\r
+0:75            4.000000\r
+0:75            4.000000\r
+0:75            4.000000\r
+0:75            4.000000\r
+0:75            2.000000\r
+0:75            2.000000\r
+0:75            2.000000\r
+0:75            2.000000\r
+0:77      move second child to first child (temp 4-element array of 7-element array of highp float)\r
+0:77        'g4' (global 4-element array of 7-element array of highp float)\r
+0:77        Function Call: foo(f1[5][7]; (global 4-element array of 7-element array of highp float)\r
+0:77          'g5' (global 5-element array of 7-element array of highp float)\r
+0:78      'g5' (global 5-element array of 7-element array of highp float)\r
+0:79      'gu' (global implicitly-sized array of 7-element array of highp float)\r
+0:81      Constant:\r
+0:81        0.000000\r
+0:82      Function Call: bar(f1[5][7]; (global void)\r
+0:82        'g5' (global 5-element array of 7-element array of highp float)\r
+0:84      Test condition and select (temp void)\r
+0:84        Condition\r
+0:84        Compare Equal (temp bool)\r
+0:84          Function Call: foo(f1[5][7]; (global 4-element array of 7-element array of highp float)\r
+0:84            'g5' (global 5-element array of 7-element array of highp float)\r
+0:84          'g4' (global 4-element array of 7-element array of highp float)\r
+0:84        true case is null\r
+0:86      Test condition and select (temp void)\r
+0:86        Condition\r
+0:86        Constant:\r
+0:86          false (const bool)\r
+0:86        true case is null\r
+0:90      move second child to first child (temp highp float)\r
+0:90        direct index (temp highp float)\r
+0:90          direct index (temp 7-element array of highp float)\r
+0:90            'u' (temp 5-element array of 7-element array of highp float)\r
+0:90            Constant:\r
+0:90              5 (const int)\r
+0:90          Constant:\r
+0:90            2 (const int)\r
+0:90        Constant:\r
+0:90          5.000000\r
+0:91      Function Call: foo(f1[5][7]; (global 4-element array of 7-element array of highp float)\r
+0:91        'u' (temp 5-element array of 7-element array of highp float)\r
+0:94      direct index (layout(column_major shared ) temp highp 4-component vector of float)\r
+0:94        v: direct index for structure (layout(column_major shared ) buffer implicitly-sized array of highp 4-component vector of float)\r
+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})\r
+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})\r
+0:94            Constant:\r
+0:94              1 (const int)\r
+0:94          Constant:\r
+0:94            1 (const int)\r
+0:94        Constant:\r
+0:94          -1 (const int)\r
+0:95      move second child to first child (temp highp 4-component vector of float)\r
+0:95        direct index (layout(column_major shared ) temp highp 4-component vector of float)\r
+0:95          v: direct index for structure (layout(column_major shared ) buffer implicitly-sized array of highp 4-component vector of float)\r
+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})\r
+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})\r
+0:95              Constant:\r
+0:95                1 (const int)\r
+0:95            Constant:\r
+0:95              1 (const int)\r
+0:95          Constant:\r
+0:95            1 (const int)\r
+0:95        Constant:\r
+0:95          4.300000\r
+0:95          4.300000\r
+0:95          4.300000\r
+0:95          4.300000\r
+0:96      v: direct index for structure (layout(column_major shared ) buffer implicitly-sized array of highp 4-component vector of float)\r
+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})\r
+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})\r
+0:96          Constant:\r
+0:96            1 (const int)\r
+0:96        Constant:\r
+0:96          1 (const int)\r
+0:98      Constant:\r
+0:98        7 (const int)\r
+0:99      array length (temp highp int)\r
+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)\r
+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})\r
+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})\r
+0:99            Constant:\r
+0:99              0 (const int)\r
+0:99          Constant:\r
+0:99            1 (const int)\r
 0:?   Linker Objects\r
+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})\r
+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})\r
+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})\r
+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})\r
+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)\r
+0:?     'gu' (global implicitly-sized array of 7-element array of highp float)\r
+0:?     'g4' (global 4-element array of 7-element array of highp float)\r
+0:?     'g5' (global 5-element array of 7-element array of highp float)\r
+0:?     'inArray' (in 2-element array of 3-element array of highp float)\r
+0:?     'outArray' (smooth out 2-element array of 3-element array of highp float)\r
+0:?     'ubaaname' (layout(column_major shared ) uniform 2-element array of 3-element array of block{layout(column_major shared ) uniform highp int a})\r
 0:?     'gl_VertexID' (gl_VertexId highp int VertexId)\r
 0:?     'gl_InstanceID' (gl_InstanceId highp int InstanceId)\r
 \r
@@ -32,7 +338,7 @@ Linked vertex stage:
 \r
 \r
 Shader version: 310\r
-0:? Sequence\r
+ERROR: node is still EOpNull!\r
 0:8  Function Definition: f(b1;f1;u1[4];i1[3][2]; (global void)\r
 0:8    Function Parameters: \r
 0:8      'a' (in bool)\r
@@ -53,7 +359,289 @@ Shader version: 310
 0:13          1 (const uint)\r
 0:13          2 (const uint)\r
 0:13        'd' (temp 3-element array of 2-element array of highp int)\r
+0:44  Function Definition: foo(f1[5][7]; (global 4-element array of 7-element array of highp float)\r
+0:44    Function Parameters: \r
+0:44      'a' (in 5-element array of 7-element array of highp float)\r
+0:?     Sequence\r
+0:47      move second child to first child (temp 7-element array of highp float)\r
+0:47        'r' (temp 7-element array of highp float)\r
+0:47        direct index (temp 7-element array of highp float)\r
+0:47          'a' (in 5-element array of 7-element array of highp float)\r
+0:47          Constant:\r
+0:47            2 (const int)\r
+0:48      Constant:\r
+0:48        0.000000\r
+0:49      Constant:\r
+0:49        0.000000\r
+0:50      Branch: Return with expression\r
+0:50        Construct float (temp 4-element array of 7-element array of float)\r
+0:50          direct index (temp 7-element array of highp float)\r
+0:50            'a' (in 5-element array of 7-element array of highp float)\r
+0:50            Constant:\r
+0:50              0 (const int)\r
+0:50          direct index (temp 7-element array of highp float)\r
+0:50            'a' (in 5-element array of 7-element array of highp float)\r
+0:50            Constant:\r
+0:50              1 (const int)\r
+0:50          'r' (temp 7-element array of highp float)\r
+0:50          direct index (temp 7-element array of highp float)\r
+0:50            'a' (in 5-element array of 7-element array of highp float)\r
+0:50            Constant:\r
+0:50              3 (const int)\r
+0:51      Branch: Return with expression\r
+0:51        Construct float (temp 4-element array of 7-element array of float)\r
+0:51          direct index (temp 7-element array of highp float)\r
+0:51            'a' (in 5-element array of 7-element array of highp float)\r
+0:51            Constant:\r
+0:51              0 (const int)\r
+0:51          direct index (temp 7-element array of highp float)\r
+0:51            'a' (in 5-element array of 7-element array of highp float)\r
+0:51            Constant:\r
+0:51              1 (const int)\r
+0:51          'r' (temp 7-element array of highp float)\r
+0:51          direct index (temp 7-element array of highp float)\r
+0:51            'a' (in 5-element array of 7-element array of highp float)\r
+0:51            Constant:\r
+0:51              3 (const int)\r
+0:52      Branch: Return with expression\r
+0:52        Construct float (temp 4-element array of 7-element array of float)\r
+0:52          direct index (temp 7-element array of highp float)\r
+0:52            'a' (in 5-element array of 7-element array of highp float)\r
+0:52            Constant:\r
+0:52              0 (const int)\r
+0:52          direct index (temp 7-element array of highp float)\r
+0:52            'a' (in 5-element array of 7-element array of highp float)\r
+0:52            Constant:\r
+0:52              1 (const int)\r
+0:52          direct index (temp 7-element array of highp float)\r
+0:52            'a' (in 5-element array of 7-element array of highp float)\r
+0:52            Constant:\r
+0:52              2 (const int)\r
+0:52          direct index (temp 7-element array of highp float)\r
+0:52            'a' (in 5-element array of 7-element array of highp float)\r
+0:52            Constant:\r
+0:52              3 (const int)\r
+0:55  Function Definition: bar(f1[5][7]; (global void)\r
+0:55    Function Parameters: \r
+0:55      '' (in 5-element array of 7-element array of highp float)\r
+0:57  Function Definition: foo2( (global void)\r
+0:57    Function Parameters: \r
+0:?     Sequence\r
+0:?       Sequence\r
+0:62        move second child to first child (temp highp float)\r
+0:62          direct index (temp highp float)\r
+0:62            direct index (temp 2-element array of highp float)\r
+0:62              direct index (temp 4-element array of 2-element array of highp float)\r
+0:62                'gu' (temp 3-element array of 4-element array of 2-element array of highp float)\r
+0:62                Constant:\r
+0:62                  2 (const int)\r
+0:62              Constant:\r
+0:62                4 (const int)\r
+0:62            Constant:\r
+0:62              1 (const int)\r
+0:62          Constant:\r
+0:62            4.000000\r
+0:64      Sequence\r
+0:64        move second child to first child (temp 3-element array of 2-element array of highp 4-component vector of float)\r
+0:64          'ca4' (temp 3-element array of 2-element array of highp 4-component vector of float)\r
+0:66          Constant:\r
+0:66            0.000000\r
+0:66            0.000000\r
+0:66            0.000000\r
+0:66            0.000000\r
+0:66            1.000000\r
+0:66            1.000000\r
+0:66            1.000000\r
+0:66            1.000000\r
+0:66            0.000000\r
+0:66            0.000000\r
+0:66            0.000000\r
+0:66            0.000000\r
+0:66            1.000000\r
+0:66            1.000000\r
+0:66            1.000000\r
+0:66            1.000000\r
+0:66            0.000000\r
+0:66            0.000000\r
+0:66            0.000000\r
+0:66            0.000000\r
+0:66            1.000000\r
+0:66            1.000000\r
+0:66            1.000000\r
+0:66            1.000000\r
+0:67      Sequence\r
+0:67        move second child to first child (temp 3-element array of 2-element array of highp 4-component vector of float)\r
+0:67          'caim' (temp 3-element array of 2-element array of highp 4-component vector of float)\r
+0:69          Constant:\r
+0:69            4.000000\r
+0:69            4.000000\r
+0:69            4.000000\r
+0:69            4.000000\r
+0:69            2.000000\r
+0:69            2.000000\r
+0:69            2.000000\r
+0:69            2.000000\r
+0:69            4.000000\r
+0:69            4.000000\r
+0:69            4.000000\r
+0:69            4.000000\r
+0:69            2.000000\r
+0:69            2.000000\r
+0:69            2.000000\r
+0:69            2.000000\r
+0:69            4.000000\r
+0:69            4.000000\r
+0:69            4.000000\r
+0:69            4.000000\r
+0:69            2.000000\r
+0:69            2.000000\r
+0:69            2.000000\r
+0:69            2.000000\r
+0:70      Sequence\r
+0:70        move second child to first child (temp 3-element array of 2-element array of highp 4-component vector of float)\r
+0:70          'caim2' (temp 3-element array of 2-element array of highp 4-component vector of float)\r
+0:72          Constant:\r
+0:72            4.000000\r
+0:72            4.000000\r
+0:72            4.000000\r
+0:72            4.000000\r
+0:72            2.000000\r
+0:72            2.000000\r
+0:72            2.000000\r
+0:72            2.000000\r
+0:72            4.000000\r
+0:72            4.000000\r
+0:72            4.000000\r
+0:72            4.000000\r
+0:72            2.000000\r
+0:72            2.000000\r
+0:72            2.000000\r
+0:72            2.000000\r
+0:72            4.000000\r
+0:72            4.000000\r
+0:72            4.000000\r
+0:72            4.000000\r
+0:72            2.000000\r
+0:72            2.000000\r
+0:72            2.000000\r
+0:72            2.000000\r
+0:73      Sequence\r
+0:73        move second child to first child (temp 3-element array of 2-element array of highp 4-component vector of float)\r
+0:73          'caim3' (temp 3-element array of 2-element array of highp 4-component vector of float)\r
+0:75          Constant:\r
+0:75            4.000000\r
+0:75            4.000000\r
+0:75            4.000000\r
+0:75            4.000000\r
+0:75            2.000000\r
+0:75            2.000000\r
+0:75            2.000000\r
+0:75            2.000000\r
+0:75            4.000000\r
+0:75            4.000000\r
+0:75            4.000000\r
+0:75            4.000000\r
+0:75            2.000000\r
+0:75            2.000000\r
+0:75            2.000000\r
+0:75            2.000000\r
+0:75            4.000000\r
+0:75            4.000000\r
+0:75            4.000000\r
+0:75            4.000000\r
+0:75            2.000000\r
+0:75            2.000000\r
+0:75            2.000000\r
+0:75            2.000000\r
+0:77      move second child to first child (temp 4-element array of 7-element array of highp float)\r
+0:77        'g4' (global 4-element array of 7-element array of highp float)\r
+0:77        Function Call: foo(f1[5][7]; (global 4-element array of 7-element array of highp float)\r
+0:77          'g5' (global 5-element array of 7-element array of highp float)\r
+0:78      'g5' (global 5-element array of 7-element array of highp float)\r
+0:79      'gu' (global 1-element array of 7-element array of highp float)\r
+0:81      Constant:\r
+0:81        0.000000\r
+0:82      Function Call: bar(f1[5][7]; (global void)\r
+0:82        'g5' (global 5-element array of 7-element array of highp float)\r
+0:84      Test condition and select (temp void)\r
+0:84        Condition\r
+0:84        Compare Equal (temp bool)\r
+0:84          Function Call: foo(f1[5][7]; (global 4-element array of 7-element array of highp float)\r
+0:84            'g5' (global 5-element array of 7-element array of highp float)\r
+0:84          'g4' (global 4-element array of 7-element array of highp float)\r
+0:84        true case is null\r
+0:86      Test condition and select (temp void)\r
+0:86        Condition\r
+0:86        Constant:\r
+0:86          false (const bool)\r
+0:86        true case is null\r
+0:90      move second child to first child (temp highp float)\r
+0:90        direct index (temp highp float)\r
+0:90          direct index (temp 7-element array of highp float)\r
+0:90            'u' (temp 5-element array of 7-element array of highp float)\r
+0:90            Constant:\r
+0:90              5 (const int)\r
+0:90          Constant:\r
+0:90            2 (const int)\r
+0:90        Constant:\r
+0:90          5.000000\r
+0:91      Function Call: foo(f1[5][7]; (global 4-element array of 7-element array of highp float)\r
+0:91        'u' (temp 5-element array of 7-element array of highp float)\r
+0:94      direct index (layout(column_major shared ) temp highp 4-component vector of float)\r
+0:94        v: direct index for structure (layout(column_major shared ) buffer implicitly-sized array of highp 4-component vector of float)\r
+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})\r
+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})\r
+0:94            Constant:\r
+0:94              1 (const int)\r
+0:94          Constant:\r
+0:94            1 (const int)\r
+0:94        Constant:\r
+0:94          -1 (const int)\r
+0:95      move second child to first child (temp highp 4-component vector of float)\r
+0:95        direct index (layout(column_major shared ) temp highp 4-component vector of float)\r
+0:95          v: direct index for structure (layout(column_major shared ) buffer implicitly-sized array of highp 4-component vector of float)\r
+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})\r
+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})\r
+0:95              Constant:\r
+0:95                1 (const int)\r
+0:95            Constant:\r
+0:95              1 (const int)\r
+0:95          Constant:\r
+0:95            1 (const int)\r
+0:95        Constant:\r
+0:95          4.300000\r
+0:95          4.300000\r
+0:95          4.300000\r
+0:95          4.300000\r
+0:96      v: direct index for structure (layout(column_major shared ) buffer implicitly-sized array of highp 4-component vector of float)\r
+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})\r
+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})\r
+0:96          Constant:\r
+0:96            1 (const int)\r
+0:96        Constant:\r
+0:96          1 (const int)\r
+0:98      Constant:\r
+0:98        7 (const int)\r
+0:99      array length (temp highp int)\r
+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)\r
+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})\r
+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})\r
+0:99            Constant:\r
+0:99              0 (const int)\r
+0:99          Constant:\r
+0:99            1 (const int)\r
 0:?   Linker Objects\r
+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})\r
+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})\r
+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})\r
+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})\r
+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)\r
+0:?     'gu' (global 1-element array of 7-element array of highp float)\r
+0:?     'g4' (global 4-element array of 7-element array of highp float)\r
+0:?     'g5' (global 5-element array of 7-element array of highp float)\r
+0:?     'inArray' (in 2-element array of 3-element array of highp float)\r
+0:?     'outArray' (smooth out 2-element array of 3-element array of highp float)\r
+0:?     'ubaaname' (layout(column_major shared ) uniform 2-element array of 3-element array of block{layout(column_major shared ) uniform highp int a})\r
 0:?     'gl_VertexID' (gl_VertexId highp int VertexId)\r
 0:?     'gl_InstanceID' (gl_InstanceId highp int InstanceId)\r
 \r
index 958b668..a3b98f3 100644 (file)
@@ -1,6 +1,6 @@
 310implicitSizeArrayError.vert\r
 Warning, version 310 is not yet complete; most version-specific features are present, but some are missing.\r
-ERROR: 0:3: 'implicitly-sized array in a block' : not supported with this profile: es\r
+ERROR: 0:3: '' : array size required \r
 ERROR: 1 compilation errors.  No code generated.\r
 \r
 \r
index 29f0f87..538caa0 100644 (file)
@@ -2,7 +2,6 @@
 Warning, version 430 is not yet complete; most version-specific features are present, but some are missing.\r
 ERROR: 0:4: 'local_size' : cannot change previously set size \r
 ERROR: 0:5: 'local_size' : too large; see gl_MaxComputeWorkGroupSize \r
-ERROR: 0:23: 'values' : only the last member of a buffer block can be run-time sized \r
 ERROR: 0:43: 'in' : global storage input qualifier cannot be used in a compute shader \r
 ERROR: 0:43: 'location qualifier on input' : not supported in this stage: compute\r
 ERROR: 0:44: 'in' : global storage input qualifier cannot be used in a compute shader \r
@@ -17,7 +16,7 @@ ERROR: 0:65: 'assign' :  l-value required "ro" (can't modify a readonly buffer)
 ERROR: 0:77: '=' :  cannot convert from 'temp double' to 'temp int'\r
 ERROR: 0:81: 'input block' : not supported in this stage: compute\r
 ERROR: 0:85: 'output block' : not supported in this stage: compute\r
-ERROR: 17 compilation errors.  No code generated.\r
+ERROR: 16 compilation errors.  No code generated.\r
 \r
 \r
 Shader version: 430\r
index cc2cdab..1d8ec43 100644 (file)
@@ -224,6 +224,7 @@ struct TArraySizes {
 
         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)
index 37a027a..abb7f13 100644 (file)
@@ -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.747"
+#define GLSLANG_REVISION "3.0.748"
 #define GLSLANG_DATE "11-Sep-2015"
index e0f13fb..4ab1c9f 100644 (file)
@@ -2738,16 +2738,20 @@ bool TParseContext::arrayError(const TSourceLoc& loc, const TType& type)
         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", "", "");
 }
 
@@ -2756,12 +2760,12 @@ void TParseContext::structArrayCheck(const TSourceLoc& /*loc*/, const TType& typ
     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);
 
@@ -2783,6 +2787,12 @@ void TParseContext::arrayUnsizedCheck(const TSourceLoc& loc, const TQualifier& q
 
     // 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)
@@ -2805,7 +2815,7 @@ void TParseContext::arrayUnsizedCheck(const TSourceLoc& loc, const TQualifier& q
         break;
     }
 
-    arraySizeRequiredCheck(loc, arraySizes->getOuterSize());
+    arraySizeRequiredCheck(loc, *arraySizes);
 }
 
 void TParseContext::arrayOfArrayVersionCheck(const TSourceLoc& loc)
@@ -4463,7 +4473,7 @@ TIntermNode* TParseContext::declareVariable(const TSourceLoc& loc, TString& iden
         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);
@@ -4947,8 +4957,10 @@ void TParseContext::declareBlock(const TSourceLoc& loc, TTypeList& typeList, con
     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
@@ -4962,10 +4974,8 @@ void TParseContext::declareBlock(const TSourceLoc& loc, TTypeList& typeList, con
         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");
index 17a5b3f..771a43e 100644 (file)
@@ -137,9 +137,9 @@ public:
     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*);
index 0c87757..e7eb320 100644 (file)
@@ -798,7 +798,7 @@ function_header
                                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 @@ parameter_declarator
         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 @@ parameter_declarator
         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 @@ parameter_type_specifier
         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 @@ struct_declaration
             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 @@ struct_declaration
             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;