Home | History | Annotate | Download | only in shaders
      1 #X1. Constructor tests test constructing arrays of arrays with different declaration syntax and data types.
      2 #X2. Return value tests test arrays of arrays as function return values.
      3 #X3. Parameter tests test arrays of arrays as different types of function parameters (in, out, unnamed).
      4 #X4. Implicit size tests test constructing arrays of arrays with implicit size.
      5 #X5. Assignment tests test assigning an array of arrays to another array of arrays variable.
      6 #X6. Length tests test the length method of arrays of arrays.
      7 #X8. Array access tests test array element access at initialization with const/dynamic values
      8 
      9 group constructor "Array of arrays constructors"
     10 
     11 	group explicit "Testing constructors with explicit sizes"
     12 		case float_3x3
     13 			version 310 es
     14 			desc "Testing constructing explicitly sized arrays of arrays"
     15 			values
     16 			{
     17 				input vec3 in0 = [ vec3(0.5, 1.0, 2.0) | vec3(7.4, -1.0, 2.0) | vec3(3.0, 1.6, -2.0) ];
     18 				output vec3 out0 = [ vec3(2.0, 0.5, 1.0) | vec3(2.0, 7.4, -1.0) | vec3(-2.0, 3.0, 1.6) ];
     19 			}
     20 
     21 			both ""
     22 				#version 310 es
     23 				precision mediump float;
     24 				${DECLARATIONS}
     25 
     26 				void main()
     27 				{
     28 					${SETUP}
     29 					float[3][3] x;
     30 					x = float[3][3] (	float[3] (in0.z, in0.x, in0.y),
     31 										float[3] (in0.z, in0.x, in0.y),
     32 										float[3] (in0.z, in0.x, in0.y) );
     33 					out0 = vec3(x[0][0], x[1][1], x[2][2]);
     34 					${OUTPUT}
     35 				}
     36 			""
     37 		end
     38 
     39 		case float_3x4
     40 			version 310 es
     41 			desc "Testing constructing explicitly sized arrays of arrays"
     42 			values
     43 			{
     44 				input vec4 in0 = [ vec4(0.5, 1.0, 2.0, 0.2) | vec4(7.4, -1.0, 2.0, -1.3) | vec4(3.0, 1.6, -2.0, 0.5) ];
     45 				output vec4 out0 = [ vec4(2.0, 0.5, 0.2, 1.0) | vec4(2.0, 7.4, -1.3, -1.0) | vec4(-2.0, 3.0, 0.5, 1.6) ];
     46 			}
     47 
     48 			both ""
     49 				#version 310 es
     50 				precision mediump float;
     51 				${DECLARATIONS}
     52 
     53 				void main()
     54 				{
     55 					${SETUP}
     56 					float[3][4] x;
     57 					x = float[3][4] ( 	float[4] (in0.z, in0.x, in0.w, in0.y),
     58 										float[4] (in0.z, in0.x, in0.w, in0.y),
     59 										float[4] (in0.z, in0.x, in0.w, in0.y) );
     60 					out0 = vec4(x[0][0], x[1][1], x[2][2], x[2][3]);
     61 					${OUTPUT}
     62 				}
     63 			""
     64 		end
     65 
     66 		case int_3x1
     67 			version 310 es
     68 			desc "Testing constructing explicitly sized arrays of arrays"
     69 			values
     70 			{
     71 				input ivec3 in0 = [ ivec3(0, 1, 2) | ivec3(7, -1, 2) | ivec3(3, 1, -2) ];
     72 				output ivec3 out0 = [ ivec3(2, 0, 1) | ivec3(2, 7, -1) | ivec3(-2, 3, 1) ];
     73 			}
     74 
     75 			both ""
     76 				#version 310 es
     77 				precision mediump int;
     78 				precision mediump float;
     79 				${DECLARATIONS}
     80 
     81 				void main()
     82 				{
     83 					${SETUP}
     84 					int x[3][1];
     85 					x = int[3][1] (	int[1] (in0.z),
     86 									int[1] (in0.x),
     87 									int[1] (in0.y) );
     88 					out0 = ivec3(x[0][0], x[1][0], x[2][0]);
     89 					${OUTPUT}
     90 				}
     91 			""
     92 		end
     93 
     94 		case int_4x4x4
     95 			version 310 es
     96 			desc "Testing constructing explicitly sized arrays of arrays"
     97 			values
     98 			{
     99 				input ivec4 in0 = [ ivec4(0, 1, 2, 0) | ivec4(7, -1, 2, -1) | ivec4(3, 1, -2, 0) ];
    100 				output ivec4 out0 = [ ivec4(2, 0, 0, 1) | ivec4(2, 7, -1, -1) | ivec4(-2, 3, 0, 1) ];
    101 			}
    102 
    103 			both ""
    104 				#version 310 es
    105 				precision mediump int;
    106 				precision mediump float;
    107 				${DECLARATIONS}
    108 
    109 				void main()
    110 				{
    111 					${SETUP}
    112 					int[4] x[4][4];
    113 					x = int[4][4][4] (	int[4][4] (	(int[4] (in0.z, in0.x, in0.w, in0.y)),
    114 													(int[4] (in0.z, in0.x, in0.w, in0.y)),
    115 													(int[4] (in0.z, in0.x, in0.w, in0.y)),
    116 													(int[4] (in0.z, in0.x, in0.w, in0.y))),
    117 
    118 										int[4][4] (	(int[4] (in0.z, in0.x, in0.w, in0.y)),
    119 													(int[4] (in0.z, in0.x, in0.w, in0.y)),
    120 													(int[4] (in0.z, in0.x, in0.w, in0.y)),
    121 													(int[4] (in0.z, in0.x, in0.w, in0.y))),
    122 
    123 										int[4][4] (	(int[4] (in0.z, in0.x, in0.w, in0.y)),
    124 													(int[4] (in0.z, in0.x, in0.w, in0.y)),
    125 													(int[4] (in0.z, in0.x, in0.w, in0.y)),
    126 													(int[4] (in0.z, in0.x, in0.w, in0.y))),
    127 
    128 										int[4][4] (	(int[4] (in0.z, in0.x, in0.w, in0.y)),
    129 													(int[4] (in0.z, in0.x, in0.w, in0.y)),
    130 													(int[4] (in0.z, in0.x, in0.w, in0.y)),
    131 													(int[4] (in0.z, in0.x, in0.w, in0.y))) );
    132 
    133 					out0 = ivec4(x[0][0][0], x[1][1][1], x[2][2][2], x[3][3][3]);
    134 					${OUTPUT}
    135 				}
    136 			""
    137 		end
    138 
    139 		case bool_3x3x3
    140 			version 310 es
    141 			desc "Testing constructing explicitly sized arrays of arrays"
    142 			values
    143 			{
    144 				input bvec3 in0 = [ bvec3(true, true, false) ];
    145 				output bvec3 out0 = [ bvec3(false, true, true) ];
    146 			}
    147 
    148 			both ""
    149 				#version 310 es
    150 				precision mediump float;
    151 				${DECLARATIONS}
    152 
    153 				void main()
    154 				{
    155 					${SETUP}
    156 					bool[3][3][3] x;
    157 					x = bool[3][3][3] (	bool[3][3] ((bool[3] (in0.y, in0.y, in0.y)),
    158 													(bool[3] (in0.z, in0.z, in0.z)),
    159 													(bool[3] (in0.x, in0.x, in0.x))),
    160 
    161 										bool[3][3] ((bool[3] (in0.y, in0.y, in0.y)),
    162 													(bool[3] (in0.z, in0.z, in0.z)),
    163 													(bool[3] (in0.x, in0.x, in0.x))),
    164 
    165 										bool[3][3] ((bool[3] (in0.y, in0.y, in0.y)),
    166 													(bool[3] (in0.z, in0.z, in0.z)),
    167 													(bool[3] (in0.x, in0.x, in0.x))) );
    168 
    169 					out0 = bvec3(x[1][1][1], x[0][0][0], x[2][2][2]);
    170 					${OUTPUT}
    171 				}
    172 			""
    173 		end
    174 
    175 		case bool_2x1x4
    176 			version 310 es
    177 			desc "Testing constructing explicitly sized arrays of arrays"
    178 			values
    179 			{
    180 				input bvec4 in0 = [ bvec4(true, true, false, false) ];
    181 				output bvec4 out0 = [ bvec4(false, true, true, false) ];
    182 			}
    183 
    184 			both ""
    185 				#version 310 es
    186 				precision mediump float;
    187 				${DECLARATIONS}
    188 
    189 				void main()
    190 				{
    191 					${SETUP}
    192 					bool x[2][1][4];
    193 					x = bool[2][1][4] ( bool[1][4] ((bool[4] (in0.z, in0.x, in0.y, in0.w))),
    194 										bool[1][4] ((bool[4] (in0.z, in0.x, in0.y, in0.w))) );
    195 					out0 = bvec4(x[0][0][0], x[0][0][1], x[1][0][2], x[1][0][3]);
    196 					${OUTPUT}
    197 				}
    198 			""
    199 		end
    200 
    201 		case struct_3x2
    202 			version 310 es
    203 			desc "Testing constructing explicitly sized arrays of arrays"
    204 			values
    205 			{
    206 				input vec3 in0 = [ vec3(0.5, 1.0, 2.0) ];
    207 				output vec3 out0 = [ vec3(2.0, -0.5, -1.0) ];
    208 			}
    209 
    210 			both ""
    211 				#version 310 es
    212 				precision mediump float;
    213 				${DECLARATIONS}
    214 
    215 				void main()
    216 				{
    217 					${SETUP}
    218 
    219 					struct Test
    220 					{
    221 						float f;
    222 						vec3 v;
    223 					};
    224 
    225 					Test a = Test(in0.z, vec3(in0.x, in0.y, in0.z));
    226 					Test b = Test(in0.y, vec3(-in0.z, -in0.x, -in0.y));
    227 					Test c = Test(in0.x, vec3(-in0.y, in0.z, -in0.x));
    228 
    229 					Test[2] x[3] = Test[3][2] ( (Test[2] (a, b)),
    230 												(Test[2] (c, a)),
    231 											    (Test[2] (b, c)) );
    232 
    233 					out0 = vec3(x[0][0].f, x[0][1].v.y, x[2][1].v.x);
    234 					${OUTPUT}
    235 				}
    236 			""
    237 		end
    238 
    239 		case struct_4x1x4
    240 			version 310 es
    241 			desc "Testing constructing explicitly sized arrays of arrays"
    242 			values
    243 			{
    244 				input vec4 in0 = [ vec4(0.5, 1.0, 2.0, 1.5) ];
    245 				output vec4 out0 = [ vec4(2.0, -0.5, -1.0, -1.5) ];
    246 			}
    247 
    248 			both ""
    249 				#version 310 es
    250 				precision mediump float;
    251 				${DECLARATIONS}
    252 
    253 				void main()
    254 				{
    255 					${SETUP}
    256 
    257 					struct Test
    258 					{
    259 						float f;
    260 						vec3 v;
    261 					};
    262 
    263 					Test a = Test(in0.z, vec3(in0.x, in0.y, in0.z));
    264 					Test b = Test(in0.y, vec3(-in0.z, -in0.x, -in0.y));
    265 					Test c = Test(in0.x, vec3(-in0.y, in0.z, -in0.x));
    266 					Test d = Test(-in0.w, vec3(-in0.w, -in0.x, -in0.z));
    267 
    268 					Test[4] x[4][1] = Test[4][1][4] (	(Test[1][4] (Test[4] (a, b, c, d))),
    269 														(Test[1][4] (Test[4] (a, b, c, d))),
    270 														(Test[1][4] (Test[4] (a, b, c, d))),
    271 														(Test[1][4] (Test[4] (a, b, c, d))) );
    272 
    273 					out0 = vec4(x[0][0][0].f, x[1][0][1].v.y, x[2][0][2].v.x, x[3][0][3].v.x);
    274 					${OUTPUT}
    275 				}
    276 			""
    277 		end
    278 
    279 		case vec3_4x3
    280 			version 310 es
    281 			desc "Testing constructing explicitly sized arrays of arrays"
    282 			values
    283 			{
    284 				input vec3 in0 = [ vec3(0.5, 1.0, 2.0) | vec3(7.4, -1.0, 2.0) | vec3(3.0, 1.6, -2.0) ];
    285 				output vec3 out0 = [ vec3(0.5, -2.0, 1.0) | vec3(7.4, -2.0, -1.0) | vec3(3.0, 2.0, 1.6) ];
    286 			}
    287 
    288 			both ""
    289 				#version 310 es
    290 				precision mediump float;
    291 				${DECLARATIONS}
    292 
    293 				void main()
    294 				{
    295 					${SETUP}
    296 
    297 					vec3[3] x[4];
    298 					x = vec3[4][3] (vec3[3] (	vec3(in0.x, in0.y, in0.z),
    299 												vec3(-in0.y, -in0.z, -in0.x),
    300 												vec3(in0.z, in0.x, in0.y)),
    301 									vec3[3] (	vec3(in0.x, in0.y, in0.z),
    302 												vec3(-in0.y, -in0.z, -in0.x),
    303 												vec3(in0.z, in0.x, in0.y)),
    304 									vec3[3] (	vec3(in0.x, in0.y, in0.z),
    305 												vec3(-in0.y, -in0.z, -in0.x),
    306 												vec3(in0.z, in0.x, in0.y)),
    307 									vec3[3] (	vec3(in0.x, in0.y, in0.z),
    308 												vec3(-in0.y, -in0.z, -in0.x),
    309 												vec3(in0.z, in0.x, in0.y)) );
    310 
    311 					out0 = vec3(x[0][0].x, x[1][1].y, x[3][2].z);
    312 					${OUTPUT}
    313 				}
    314 			""
    315 		end
    316 
    317 		case ivec3_3x2x1
    318 			version 310 es
    319 			desc "Testing constructing explicitly sized arrays of arrays"
    320 			values
    321 			{
    322 				input ivec3 in0 = [ ivec3(5, 1, 2) | ivec3(7, -1, 2) | ivec3(3, 1, -2) ];
    323 				output ivec3 out0 = [ ivec3(5, -2, 1) | ivec3(7, -2, -1) | ivec3(3, 2, 1) ];
    324 			}
    325 
    326 			both ""
    327 				#version 310 es
    328 				precision mediump int;
    329 				precision mediump float;
    330 				${DECLARATIONS}
    331 
    332 				void main()
    333 				{
    334 					${SETUP}
    335 
    336 					ivec3 x[3][2][1];
    337 					x = ivec3[3][2][1] (ivec3[2][1] (	ivec3[1] (ivec3(in0.x, in0.y, in0.z)),
    338 														ivec3[1] (ivec3(-in0.y, -in0.z, -in0.x))),
    339 										ivec3[2][1] (	ivec3[1] (ivec3(in0.z, in0.x, in0.y)),
    340 														ivec3[1] (ivec3(in0.x, in0.y, in0.z))),
    341 										ivec3[2][1] (	ivec3[1] (ivec3(-in0.y, -in0.z, -in0.x)),
    342 														ivec3[1] (ivec3(in0.z, in0.x, in0.y))) );
    343 
    344 					out0 = ivec3(x[0][0][0].x, x[2][0][0].y, x[1][0][0].z);
    345 					${OUTPUT}
    346 				}
    347 			""
    348 		end
    349 
    350 		case bvec3_1x2x3
    351 			version 310 es
    352 			desc "Testing constructing explicitly sized arrays of arrays"
    353 			values
    354 			{
    355 				input bvec3 in0 = [ bvec3(true, false, true) ];
    356 				output bvec3 out0 = [ bvec3(true, true, false) ];
    357 			}
    358 
    359 			both ""
    360 				#version 310 es
    361 				precision mediump float;
    362 				${DECLARATIONS}
    363 
    364 				void main()
    365 				{
    366 					${SETUP}
    367 
    368 					bvec3[3] x[1][2];
    369 					x = bvec3[1][2][3] ( bvec3[2][3] (	bvec3[3] (	bvec3(in0.x, in0.y, in0.z),
    370 																	bvec3(in0.y, in0.z, in0.x),
    371 																	bvec3(in0.z, in0.x, in0.y)),
    372 
    373 														bvec3[3] (	bvec3(in0.z, in0.x, in0.y),
    374 																	bvec3(in0.x, in0.y, in0.z),
    375 																	bvec3(in0.y, in0.z, in0.x)) ));
    376 
    377 					out0 = bvec3(x[0][0][0].x, x[0][0][1].y, x[0][1][0].z);
    378 					${OUTPUT}
    379 				}
    380 			""
    381 		end
    382 
    383 		case mat3_3x2
    384 			version 310 es
    385 			desc "Testing constructing explicitly sized arrays of arrays"
    386 			values
    387 			{
    388 				input vec3 in0 = [ vec3(0.5, 1.0, 2.0) | vec3(-1.5, 0.0, -2.3) ];
    389 				output vec3 out0 = [ vec3(0.5, -1.0, 1.0) | vec3(-1.5, 0.0, 0.0) ];
    390 			}
    391 
    392 			both ""
    393 				#version 310 es
    394 				precision mediump float;
    395 				${DECLARATIONS}
    396 
    397 				void main()
    398 				{
    399 					${SETUP}
    400 					mat3[3][2] a = mat3[3][2] (	mat3[2] (	mat3(	in0.x, in0.y, in0.z,
    401 																	in0.x, in0.y, in0.z,
    402 																	in0.x, in0.y, in0.z),
    403 															mat3(	in0.z, in0.x, -in0.y,
    404 																	in0.z, in0.x, -in0.y,
    405 																	in0.z, in0.x, -in0.y)),
    406 
    407 												mat3[2] (	mat3(	-in0.z, -in0.z, in0.z,
    408 																	-in0.y, -in0.y, in0.y,
    409 																	-in0.x, -in0.x, in0.x),
    410 															mat3(	in0.x, in0.y, in0.z,
    411 																	in0.x, in0.y, in0.z,
    412 																	in0.x, in0.y, in0.z)),
    413 
    414 												mat3[2] (	mat3(	in0.z, in0.x, -in0.y,
    415 																	in0.z, in0.x, -in0.y,
    416 																	in0.z, in0.x, -in0.y),
    417 															mat3(	-in0.z, -in0.z, in0.z,
    418 																	-in0.y, -in0.y, in0.y,
    419 																	-in0.x, -in0.x, in0.x)) );
    420 
    421 					mat3 a0 = a[0][0];
    422 					mat3 a1 = a[0][1];
    423 					mat3 a2 = a[2][1];
    424 
    425 					float ret0 = a0[2][0];
    426 					float ret1 = a1[0][2];
    427 					float ret2 = a2[1][2];
    428 
    429 					out0 = vec3(ret0, ret1, ret2);
    430 					${OUTPUT}
    431 				}
    432 			""
    433 		end
    434 
    435 		case mat3_3x3x3
    436 			version 310 es
    437 			desc "Testing constructing explicitly sized arrays of arrays"
    438 			values
    439 			{
    440 				input ivec3 in0 = [ ivec3(0, 1, 2) | ivec3(-1, 0, -2) ];
    441 				output ivec3 out0 = [ ivec3(0, -1, 1) | ivec3(-1, 0, 0) ];
    442 			}
    443 
    444 			both ""
    445 				#version 310 es
    446 				precision mediump int;
    447 				precision mediump float;
    448 				${DECLARATIONS}
    449 
    450 				void main()
    451 				{
    452 					${SETUP}
    453 
    454 					mat3 a = mat3(	in0.x, in0.y, in0.z,
    455 									in0.x, in0.y, in0.z,
    456 									in0.x, in0.y, in0.z);
    457 					mat3 b = mat3(	in0.z, in0.x, -in0.y,
    458 									in0.z, in0.x, -in0.y,
    459 									in0.z, in0.x, -in0.y);
    460 					mat3 c = mat3(	-in0.z, -in0.z, in0.z,
    461 									-in0.y, -in0.y, in0.y,
    462 									-in0.x, -in0.x, in0.x);
    463 
    464 					mat3[3][3][3] x = mat3[3][3][3] (	mat3[3][3] (mat3[3] (a, a, a),
    465 																	mat3[3] (b, b, b),
    466 																	mat3[3] (c, c, c)),
    467 
    468 														mat3[3][3] (mat3[3] (b, b, b),
    469 																	mat3[3] (a, a, a),
    470 																	mat3[3] (c, c, c)),
    471 
    472 														mat3[3][3] (mat3[3] (c, c, c),
    473 																	mat3[3] (a, a, a),
    474 																	mat3[3] (b, b, b)) );
    475 
    476 					mat3 x0 = x[0][0][0];
    477 					mat3 x1 = x[1][0][0];
    478 					mat3 x2 = x[2][0][0];
    479 
    480 					float ret0 = x0[2][0];
    481 					float ret1 = x1[0][2];
    482 					float ret2 = x2[1][2];
    483 
    484 					out0 = ivec3(ret0, ret1, ret2);
    485 					${OUTPUT}
    486 				}
    487 			""
    488 		end
    489 
    490 		case mat3_3x4
    491 			version 310 es
    492 			desc "Testing constructing explicitly sized arrays of arrays"
    493 			values
    494 			{
    495 				input bvec3 in0 = [ bvec3(true, false, true) ];
    496 				output bvec3 out0 = [ bvec3(true, false, false) ];
    497 			}
    498 
    499 			both ""
    500 				#version 310 es
    501 				precision mediump float;
    502 				${DECLARATIONS}
    503 
    504 				void main()
    505 				{
    506 					${SETUP}
    507 
    508 					mat3 a = mat3(	in0.x, in0.y, in0.z,
    509 									in0.x, in0.y, in0.z,
    510 									in0.x, in0.y, in0.z);
    511 
    512 					mat3 b = mat3(	in0.z, in0.x, in0.y,
    513 									in0.z, in0.x, in0.y,
    514 									in0.z, in0.x, in0.y);
    515 
    516 					mat3 c = mat3(	in0.z, in0.z, in0.z,
    517 									in0.y, in0.y, in0.y,
    518 									in0.x, in0.x, in0.x);
    519 
    520 					mat3[4] x[3] = mat3[3][4] (	mat3[4] (a, b, c, a),
    521 												mat3[4] (b, c, a, b),
    522 												mat3[4] (c, a, b, c) );
    523 
    524 					mat3 x0 = x[0][0];
    525 					mat3 x1 = x[1][3];
    526 					mat3 x2 = x[2][0];
    527 
    528 					float ret0 = x0[2][0];
    529 					float ret1 = x1[0][2];
    530 					float ret2 = x2[1][2];
    531 
    532 					out0 = bvec3(ret0, ret1, ret2);
    533 					${OUTPUT}
    534 				}
    535 			""
    536 		end
    537 
    538 		case high_dimensional_array
    539 			version 310 es
    540 			desc "Testing constructing explicitly sized arrays of arrays"
    541 			values
    542 			{
    543 				input ivec2 in0 = [ ivec2(1, -2) ];
    544 				output ivec2 out0 = [ ivec2(-2, 1) ];
    545 			}
    546 
    547 			both ""
    548 				#version 310 es
    549 				precision mediump float;
    550 				${DECLARATIONS}
    551 
    552 				void main()
    553 				{
    554 					${SETUP}
    555 
    556 					int[1][1][1][2][1][1][1] x = int[1][1][1][2][1][1][1] ( int[1][1][2][1][1][1] (int [1][2][1][1][1] ( int[2][1][1][1] (	int[1][1][1] ( int[1][1] (int[1] (in0.y))),
    557 																																			int[1][1][1] ( int[1][1] (int[1] (in0.x)))))));
    558 
    559 					out0 = ivec2(x[0][0][0][0][0][0][0], x[0][0][0][1][0][0][0]);
    560 					${OUTPUT}
    561 				}
    562 			""
    563 		end
    564 
    565 	end # explicit
    566 
    567 	group implicit "Testing constructors with implicit size"
    568 
    569 		case float_3x3
    570 			version 310 es
    571 			desc "Testing constructing implicitly sized arrays of arrays"
    572 			values
    573 			{
    574 				input vec3 in0 = [ vec3(0.5, 1.0, 2.0) | vec3(7.4, -1.0, 2.0) | vec3(3.0, 1.6, -2.0) ];
    575 				output vec3 out0 = [ vec3(2.0, 0.5, 1.0) | vec3(2.0, 7.4, -1.0) | vec3(-2.0, 3.0, 1.6) ];
    576 			}
    577 
    578 			both ""
    579 				#version 310 es
    580 				precision mediump float;
    581 				${DECLARATIONS}
    582 
    583 				void main()
    584 				{
    585 					${SETUP}
    586 					float[3][3] x;
    587 					x = float[][] ( float[](in0.z, in0.x, in0.y),
    588 									float[](in0.z, in0.x, in0.y),
    589 									float[](in0.z, in0.x, in0.y) );
    590 
    591 					out0 = vec3(x[0][0], x[1][1], x[2][2]);
    592 					${OUTPUT}
    593 				}
    594 			""
    595 		end
    596 
    597 		case float_3x4
    598 			version 310 es
    599 			desc "Testing constructing implicitly sized arrays of arrays"
    600 			values
    601 			{
    602 				input vec4 in0 = [ vec4(0.5, 1.0, 2.0, 0.2) | vec4(7.4, -1.0, 2.0, -1.3) | vec4(3.0, 1.6, -2.0, 0.5) ];
    603 				output vec4 out0 = [ vec4(2.0, 0.5, 0.2, 1.0) | vec4(2.0, 7.4, -1.3, -1.0) | vec4(-2.0, 3.0, 0.5, 1.6) ];
    604 			}
    605 
    606 			both ""
    607 				#version 310 es
    608 				precision mediump float;
    609 				${DECLARATIONS}
    610 
    611 				void main()
    612 				{
    613 					${SETUP}
    614 					float[3][4] x;
    615 					x = float[][] ( float[] (in0.z, in0.x, in0.w, in0.y),
    616 									float[] (in0.z, in0.x, in0.w, in0.y),
    617 									float[] (in0.z, in0.x, in0.w, in0.y) );
    618 
    619 					out0 = vec4(x[0][0], x[1][1], x[2][2], x[2][3]);
    620 					${OUTPUT}
    621 				}
    622 			""
    623 		end
    624 
    625 		case int_3x1
    626 			version 310 es
    627 			desc "Testing constructing implicitly sized arrays of arrays"
    628 			values
    629 			{
    630 				input ivec3 in0 = [ ivec3(0, 1, 2) | ivec3(7, -1, 2) | ivec3(3, 1, -2) ];
    631 				output ivec3 out0 = [ ivec3(2, 0, 1) | ivec3(2, 7, -1) | ivec3(-2, 3, 1) ];
    632 			}
    633 
    634 			both ""
    635 				#version 310 es
    636 				precision mediump int;
    637 				precision mediump float;
    638 				${DECLARATIONS}
    639 
    640 				void main()
    641 				{
    642 					${SETUP}
    643 					int x[3][1];
    644 					x = int[][] ( int[] (in0.z),
    645 								  int[] (in0.x),
    646 								  int[] (in0.y) );
    647 
    648 					out0 = ivec3(x[0][0], x[1][0], x[2][0]);
    649 					${OUTPUT}
    650 				}
    651 			""
    652 		end
    653 
    654 		case int_4x4x4
    655 			version 310 es
    656 			desc "Testing constructing implicitly sized arrays of arrays"
    657 			values
    658 			{
    659 				input ivec4 in0 = [ ivec4(0, 1, 2, 0) | ivec4(7, -1, 2, -1) | ivec4(3, 1, -2, 0) ];
    660 				output ivec4 out0 = [ ivec4(2, 0, 0, 1) | ivec4(2, 7, -1, -1) | ivec4(-2, 3, 0, 1) ];
    661 			}
    662 
    663 			both ""
    664 				#version 310 es
    665 				precision mediump int;
    666 				precision mediump float;
    667 				${DECLARATIONS}
    668 
    669 				void main()
    670 				{
    671 					${SETUP}
    672 					int[4] x[4][4];
    673 					x = int[][][] ( int[][] ((int[] (in0.z, in0.x, in0.w, in0.y)),
    674 											 (int[] (in0.z, in0.x, in0.w, in0.y)),
    675 											 (int[] (in0.z, in0.x, in0.w, in0.y)),
    676 											 (int[] (in0.z, in0.x, in0.w, in0.y))),
    677 
    678 									int[][] ((int[] (in0.z, in0.x, in0.w, in0.y)),
    679 											 (int[] (in0.z, in0.x, in0.w, in0.y)),
    680 											 (int[] (in0.z, in0.x, in0.w, in0.y)),
    681 											 (int[] (in0.z, in0.x, in0.w, in0.y))),
    682 
    683 									int[][] ((int[] (in0.z, in0.x, in0.w, in0.y)),
    684 											 (int[] (in0.z, in0.x, in0.w, in0.y)),
    685 											 (int[] (in0.z, in0.x, in0.w, in0.y)),
    686 											 (int[] (in0.z, in0.x, in0.w, in0.y))),
    687 
    688 									int[][] ((int[] (in0.z, in0.x, in0.w, in0.y)),
    689 											 (int[] (in0.z, in0.x, in0.w, in0.y)),
    690 											 (int[] (in0.z, in0.x, in0.w, in0.y)),
    691 											 (int[] (in0.z, in0.x, in0.w, in0.y))) );
    692 
    693 					out0 = ivec4(x[0][0][0], x[1][1][1], x[2][2][2], x[3][3][3]);
    694 					${OUTPUT}
    695 				}
    696 			""
    697 		end
    698 
    699 		case bool_3x3x3
    700 			version 310 es
    701 			desc "Testing constructing implicitly sized arrays of arrays"
    702 			values
    703 			{
    704 				input bvec3 in0 = [ bvec3(true, true, false) ];
    705 				output bvec3 out0 = [ bvec3(false, true, true) ];
    706 			}
    707 
    708 			both ""
    709 				#version 310 es
    710 				precision mediump float;
    711 				${DECLARATIONS}
    712 
    713 				void main()
    714 				{
    715 					${SETUP}
    716 					bool[3][3][3] x;
    717 					x = bool[][][] (bool[][] (	(bool[] (in0.y, in0.y, in0.y)),
    718 												(bool[] (in0.z, in0.z, in0.z)),
    719 												(bool[] (in0.x, in0.x, in0.x))),
    720 
    721 									bool[][] (	(bool[] (in0.y, in0.y, in0.y)),
    722 												(bool[] (in0.z, in0.z, in0.z)),
    723 												(bool[] (in0.x, in0.x, in0.x))),
    724 
    725 									bool[][] (	(bool[] (in0.y, in0.y, in0.y)),
    726 												(bool[] (in0.z, in0.z, in0.z)),
    727 												(bool[] (in0.x, in0.x, in0.x))) );
    728 
    729 					out0 = bvec3(x[1][1][1], x[0][0][0], x[2][2][2]);
    730 					${OUTPUT}
    731 				}
    732 			""
    733 		end
    734 
    735 		case bool_2x1x4
    736 			version 310 es
    737 			desc "Testing constructing implicitly sized arrays of arrays"
    738 			values
    739 			{
    740 				input bvec4 in0 = [ bvec4(true, true, false, false) ];
    741 				output bvec4 out0 = [ bvec4(false, true, true, false) ];
    742 			}
    743 
    744 			both ""
    745 				#version 310 es
    746 				precision mediump float;
    747 				${DECLARATIONS}
    748 
    749 				void main()
    750 				{
    751 					${SETUP}
    752 					bool x[2][1][4];
    753 					x = bool[2][1][4] ( bool[][] ((bool[] (in0.z, in0.x, in0.y, in0.w))),
    754 										bool[][] ((bool[] (in0.z, in0.x, in0.y, in0.w))) );
    755 					out0 = bvec4(x[0][0][0], x[0][0][1], x[1][0][2], x[1][0][3]);
    756 					${OUTPUT}
    757 				}
    758 			""
    759 		end
    760 
    761 		case struct_3x2
    762 			version 310 es
    763 			desc "Testing constructing implicitly sized arrays of arrays"
    764 			values
    765 			{
    766 				input vec3 in0 = [ vec3(0.5, 1.0, 2.0) ];
    767 				output vec3 out0 = [ vec3(2.0, -0.5, -1.0) ];
    768 			}
    769 
    770 			both ""
    771 				#version 310 es
    772 				precision mediump float;
    773 				${DECLARATIONS}
    774 
    775 				void main()
    776 				{
    777 					${SETUP}
    778 
    779 					struct Test
    780 					{
    781 						float f;
    782 						vec3 v;
    783 					};
    784 
    785 					Test a = Test(in0.z, vec3(in0.x, in0.y, in0.z));
    786 					Test b = Test(in0.y, vec3(-in0.z, -in0.x, -in0.y));
    787 					Test c = Test(in0.x, vec3(-in0.y, in0.z, -in0.x));
    788 
    789 					Test[2] x[3] = Test[][] (	(Test[] (a, b)),
    790 												(Test[] (c, a)),
    791 											    (Test[] (b, c)) );
    792 
    793 					out0 = vec3(x[0][0].f, x[0][1].v.y, x[2][1].v.x);
    794 					${OUTPUT}
    795 				}
    796 			""
    797 		end
    798 
    799 		case struct_4x1x4
    800 			version 310 es
    801 			desc "Testing constructing implicitly sized arrays of arrays"
    802 			values
    803 			{
    804 				input vec4 in0 = [ vec4(0.5, 1.0, 2.0, 1.5) ];
    805 				output vec4 out0 = [ vec4(2.0, -0.5, -1.0, -1.5) ];
    806 			}
    807 
    808 			both ""
    809 				#version 310 es
    810 				precision mediump float;
    811 				${DECLARATIONS}
    812 
    813 				void main()
    814 				{
    815 					${SETUP}
    816 
    817 
    818 					struct Test
    819 					{
    820 						float f;
    821 						vec3 v;
    822 					};
    823 
    824 					Test a = Test(in0.z, vec3(in0.x, in0.y, in0.z));
    825 					Test b = Test(in0.y, vec3(-in0.z, -in0.x, -in0.y));
    826 					Test c = Test(in0.x, vec3(-in0.y, in0.z, -in0.x));
    827 					Test d = Test(-in0.w, vec3(-in0.w, -in0.x, -in0.z));
    828 
    829 					Test[4] x[4][1] = Test[][][] (	(Test[][] (Test[] (a, b, c, d))),
    830 													(Test[][] (Test[] (a, b, c, d))),
    831 													(Test[][] (Test[] (a, b, c, d))),
    832 													(Test[][] (Test[] (a, b, c, d))) );
    833 
    834 					out0 = vec4(x[0][0][0].f, x[1][0][1].v.y, x[2][0][2].v.x, x[3][0][3].v.x);
    835 					${OUTPUT}
    836 				}
    837 			""
    838 		end
    839 
    840 		case vec3_4x3
    841 			version 310 es
    842 			desc "Testing constructing implicitly sized arrays of arrays"
    843 			values
    844 			{
    845 				input vec3 in0 = [ vec3(0.5, 1.0, 2.0) | vec3(7.4, -1.0, 2.0) | vec3(3.0, 1.6, -2.0) ];
    846 				output vec3 out0 = [ vec3(0.5, -2.0, 1.0) | vec3(7.4, -2.0, -1.0) | vec3(3.0, 2.0, 1.6) ];
    847 			}
    848 
    849 			both ""
    850 				#version 310 es
    851 				precision mediump float;
    852 				${DECLARATIONS}
    853 
    854 				void main()
    855 				{
    856 					${SETUP}
    857 
    858 					vec3[3] x[4];
    859 					x = vec3[][] ( 	vec3[] 	(	vec3(in0.x, in0.y, in0.z),
    860 												vec3(-in0.y, -in0.z, -in0.x),
    861 												vec3(in0.z, in0.x, in0.y)),
    862 									vec3[] 	(	vec3(in0.x, in0.y, in0.z),
    863 												vec3(-in0.y, -in0.z, -in0.x),
    864 												vec3(in0.z, in0.x, in0.y)),
    865 
    866 									vec3[] 	(	vec3(in0.x, in0.y, in0.z),
    867 												vec3(-in0.y, -in0.z, -in0.x),
    868 												vec3(in0.z, in0.x, in0.y)),
    869 
    870 									vec3[] 	(	vec3(in0.x, in0.y, in0.z),
    871 												vec3(-in0.y, -in0.z, -in0.x),
    872 												vec3(in0.z, in0.x, in0.y)) );
    873 
    874 					out0 = vec3(x[0][0].x, x[1][1].y, x[3][2].z);
    875 					${OUTPUT}
    876 				}
    877 			""
    878 		end
    879 
    880 		case ivec3_3x2x1
    881 			version 310 es
    882 			desc "Testing constructing implicitly sized arrays of arrays"
    883 			values
    884 			{
    885 				input ivec3 in0 = [ ivec3(5, 1, 2) | ivec3(7, -1, 2) | ivec3(3, 1, -2) ];
    886 				output ivec3 out0 = [ ivec3(5, -2, 1) | ivec3(7, -2, -1) | ivec3(3, 2, 1) ];
    887 			}
    888 
    889 			both ""
    890 				#version 310 es
    891 				precision mediump int;
    892 				precision mediump float;
    893 				${DECLARATIONS}
    894 
    895 				void main()
    896 				{
    897 					${SETUP}
    898 
    899 					ivec3 x[3][2][1];
    900 					x = ivec3[][][] ( 	ivec3[][] (	ivec3[] (ivec3(in0.x, in0.y, in0.z)),
    901 													ivec3[] (ivec3(-in0.y, -in0.z, -in0.x))),
    902 										ivec3[][] (	ivec3[] (ivec3(in0.z, in0.x, in0.y)),
    903 													ivec3[] (ivec3(in0.x, in0.y, in0.z))),
    904 										ivec3[][] (	ivec3[] (ivec3(-in0.y, -in0.z, -in0.x)),
    905 													ivec3[] (ivec3(in0.z, in0.x, in0.y))) );
    906 					out0 = ivec3(x[0][0][0].x, x[2][0][0].y, x[1][0][0].z);
    907 					${OUTPUT}
    908 				}
    909 			""
    910 		end
    911 
    912 		case bvec3_1x2x3
    913 			version 310 es
    914 			desc "Testing constructing implicitly sized arrays of arrays"
    915 			values
    916 			{
    917 				input bvec3 in0 = [ bvec3(true, false, true) ];
    918 				output bvec3 out0 = [ bvec3(true, true, false) ];
    919 			}
    920 
    921 			both ""
    922 				#version 310 es
    923 				precision mediump float;
    924 				${DECLARATIONS}
    925 
    926 				void main()
    927 				{
    928 					${SETUP}
    929 
    930 					bvec3[3] x[1][2];
    931 					x = bvec3[][][] ( 	bvec3[][] (	bvec3[] (bvec3(in0.x, in0.y, in0.z),
    932 															 bvec3(in0.y, in0.z, in0.x),
    933 															 bvec3(in0.z, in0.x, in0.y)),
    934 
    935 													bvec3[] (bvec3(in0.z, in0.x, in0.y),
    936 															 bvec3(in0.x, in0.y, in0.z),
    937 															 bvec3(in0.y, in0.z, in0.x)) ));
    938 
    939 					out0 = bvec3(x[0][0][0].x, x[0][0][1].y, x[0][1][0].z);
    940 					${OUTPUT}
    941 				}
    942 			""
    943 		end
    944 
    945 		case mat3_3x2
    946 			version 310 es
    947 			desc "Testing constructing implicitly sized arrays of arrays"
    948 			values
    949 			{
    950 				input vec3 in0 = [ vec3(0.5, 1.0, 2.0) | vec3(-1.5, 0.0, -2.3) ];
    951 				output vec3 out0 = [ vec3(0.5, -1.0, 1.0) | vec3(-1.5, 0.0, 0.0) ];
    952 			}
    953 
    954 			both ""
    955 				#version 310 es
    956 				precision mediump float;
    957 				${DECLARATIONS}
    958 
    959 				void main()
    960 				{
    961 					${SETUP}
    962 					mat3[3][2] a = mat3[][] (	mat3[] (mat3(	in0.x, in0.y, in0.z,
    963 																in0.x, in0.y, in0.z,
    964 																in0.x, in0.y, in0.z),
    965 														mat3(	in0.z, in0.x, -in0.y,
    966 																in0.z, in0.x, -in0.y,
    967 																in0.z, in0.x, -in0.y)),
    968 
    969 												mat3[] (mat3(	-in0.z, -in0.z, in0.z,
    970 																-in0.y, -in0.y, in0.y,
    971 																-in0.x, -in0.x, in0.x),
    972 														mat3(	in0.x, in0.y, in0.z,
    973 																in0.x, in0.y, in0.z,
    974 																in0.x, in0.y, in0.z)),
    975 
    976 												mat3[] (mat3(	in0.z, in0.x, -in0.y,
    977 																in0.z, in0.x, -in0.y,
    978 																in0.z, in0.x, -in0.y),
    979 														mat3(	-in0.z, -in0.z, in0.z,
    980 																-in0.y, -in0.y, in0.y,
    981 																-in0.x, -in0.x, in0.x)) );
    982 
    983 					mat3 a0 = a[0][0];
    984 					mat3 a1 = a[0][1];
    985 					mat3 a2 = a[2][1];
    986 
    987 					float ret0 = a0[2][0];
    988 					float ret1 = a1[0][2];
    989 					float ret2 = a2[1][2];
    990 
    991 					out0 = vec3(ret0, ret1, ret2);
    992 					${OUTPUT}
    993 				}
    994 			""
    995 		end
    996 
    997 		case mat3_3x3x3
    998 			version 310 es
    999 			desc "Testing constructing implicitly sized arrays of arrays"
   1000 			values
   1001 			{
   1002 				input ivec3 in0 = [ ivec3(0, 1, 2) | ivec3(-1, 0, -2) ];
   1003 				output ivec3 out0 = [ ivec3(0, -1, 1) | ivec3(-1, 0, 0) ];
   1004 			}
   1005 
   1006 			both ""
   1007 				#version 310 es
   1008 				precision mediump int;
   1009 				precision mediump float;
   1010 				${DECLARATIONS}
   1011 
   1012 				void main()
   1013 				{
   1014 					${SETUP}
   1015 
   1016 					mat3 a = mat3(	in0.x, in0.y, in0.z,
   1017 									in0.x, in0.y, in0.z,
   1018 									in0.x, in0.y, in0.z);
   1019 					mat3 b = mat3(	in0.z, in0.x, -in0.y,
   1020 									in0.z, in0.x, -in0.y,
   1021 									in0.z, in0.x, -in0.y);
   1022 					mat3 c = mat3(	-in0.z, -in0.z, in0.z,
   1023 									-in0.y, -in0.y, in0.y,
   1024 									-in0.x, -in0.x, in0.x);
   1025 
   1026 					mat3[3][3][3] x = mat3[][][] (	mat3[][] ( 	mat3[] (a, a, a),
   1027 																mat3[] (b, b, b),
   1028 																mat3[] (c, c, c)),
   1029 
   1030 													mat3[][] ( 	mat3[] (b, b, b),
   1031 																mat3[] (a, a, a),
   1032 																mat3[] (c, c, c)),
   1033 
   1034 													mat3[][] ( 	mat3[] (c, c, c),
   1035 																mat3[] (a, a, a),
   1036 																mat3[] (b, b, b)) );
   1037 
   1038 					mat3 x0 = x[0][0][0];
   1039 					mat3 x1 = x[1][0][0];
   1040 					mat3 x2 = x[2][0][0];
   1041 
   1042 					float ret0 = x0[2][0];
   1043 					float ret1 = x1[0][2];
   1044 					float ret2 = x2[1][2];
   1045 
   1046 					out0 = ivec3(ret0, ret1, ret2);
   1047 					${OUTPUT}
   1048 				}
   1049 			""
   1050 		end
   1051 
   1052 		case mat3_3x4
   1053 			version 310 es
   1054 			desc "Testing constructing implicitly sized arrays of arrays"
   1055 			values
   1056 			{
   1057 				input bvec3 in0 = [ bvec3(true, false, true) ];
   1058 				output bvec3 out0 = [ bvec3(true, false, false) ];
   1059 			}
   1060 
   1061 			both ""
   1062 				#version 310 es
   1063 				precision mediump float;
   1064 				${DECLARATIONS}
   1065 
   1066 				void main()
   1067 				{
   1068 					${SETUP}
   1069 
   1070 					mat3 a = mat3(	in0.x, in0.y, in0.z,
   1071 									in0.x, in0.y, in0.z,
   1072 									in0.x, in0.y, in0.z);
   1073 
   1074 					mat3 b = mat3(	in0.z, in0.x, in0.y,
   1075 									in0.z, in0.x, in0.y,
   1076 									in0.z, in0.x, in0.y);
   1077 
   1078 					mat3 c = mat3(	in0.z, in0.z, in0.z,
   1079 									in0.y, in0.y, in0.y,
   1080 									in0.x, in0.x, in0.x);
   1081 
   1082 					mat3[4] x[3] = mat3[][] (	mat3[] (a, b, c, a),
   1083 												mat3[] (b, c, a, b),
   1084 												mat3[] (c, a, b, c) );
   1085 
   1086 					mat3 x0 = x[0][0];
   1087 					mat3 x1 = x[1][3];
   1088 					mat3 x2 = x[2][0];
   1089 
   1090 					float ret0 = x0[2][0];
   1091 					float ret1 = x1[0][2];
   1092 					float ret2 = x2[1][2];
   1093 
   1094 					out0 = bvec3(ret0, ret1, ret2);
   1095 					${OUTPUT}
   1096 				}
   1097 			""
   1098 		end
   1099 
   1100 		case int_high_dimensional_array
   1101 			version 310 es
   1102 			desc "Testing constructing implicitly sized arrays of arrays"
   1103 			values
   1104 			{
   1105 				input ivec2 in0 = [ ivec2(1, -2) ];
   1106 				output ivec2 out0 = [ ivec2(-2, 1) ];
   1107 			}
   1108 
   1109 			both ""
   1110 				#version 310 es
   1111 				precision mediump float;
   1112 				${DECLARATIONS}
   1113 
   1114 				void main()
   1115 				{
   1116 					${SETUP}
   1117 
   1118 					int[][][][][][][] x = int[][][][][][][] ( int[][][][][][] (int [][][][][] ( int[][][][] (	int[][][] ( int[][] (int[] (in0.y))),
   1119 																												int[][][] ( int[][] (int[] (in0.x)))))));
   1120 
   1121 					out0 = ivec2(x[0][0][0][0][0][0][0], x[0][0][0][1][0][0][0]);
   1122 					${OUTPUT}
   1123 				}
   1124 			""
   1125 		end
   1126 
   1127 	end # implicit
   1128 
   1129 end # constructor
   1130 
   1131 group return "Array of arrays as return value"
   1132 
   1133 	group explicit "Testing return value with explicit constructor"
   1134 
   1135 		case float_3x3
   1136 			version 310 es
   1137 			desc "Testing arrays of arrays as function return values with explicit array size"
   1138 			values
   1139 			{
   1140 				input vec3 in0 = [ vec3(0.5, 1.0, 2.0) | vec3(7.4, -1.0, 2.0) | vec3(3.0, 1.6, -2.0) ];
   1141 				output vec3 out0 = [ vec3(2.0, -0.5, 1.0) | vec3(2.0, -7.4, -1.0) | vec3(-2.0, -3.0, 1.6) ];
   1142 			}
   1143 
   1144 			both ""
   1145 				#version 310 es
   1146 				precision mediump float;
   1147 				${DECLARATIONS}
   1148 
   1149 				float[3][3] func(vec3 a)
   1150 				{
   1151 					return float[3][3] (float[3] (a.z, 0.0, 0.0),
   1152 										float[3] (0.0, -a.x, 0.0),
   1153 										float[3] (0.0, 0.0, a.y) );
   1154 				}
   1155 
   1156 				void main()
   1157 				{
   1158 					${SETUP}
   1159 					float[3][3] x = func(in0);
   1160 					out0 = vec3(x[0][0], x[1][1], x[2][2]);
   1161 					${OUTPUT}
   1162 				}
   1163 			""
   1164 		end
   1165 
   1166 		case int_2x2x2
   1167 			version 310 es
   1168 			desc "Testing arrays of arrays as function return values with explicit array size"
   1169 			values
   1170 			{
   1171 				input ivec2 in0 = [ ivec2(4, 1) | ivec2(7, -1) | ivec2(3, 1) ];
   1172 				output ivec2 out0 =	[ ivec2(1, -4) | ivec2(-1, -7) | ivec2(1, -3) ];
   1173 			}
   1174 
   1175 			both ""
   1176 				#version 310 es
   1177 				precision mediump int;
   1178 				precision mediump float;
   1179 				${DECLARATIONS}
   1180 
   1181 				int[2][2][2] func(ivec2 a)
   1182 				{
   1183 					return int[2][2][2] (	int[2][2] (	int[2] (a.y, -a.x),
   1184 														int[2] (0, 0)),
   1185 											int[2][2] (	int[2] (0, 0),
   1186 														int[2] (a.y, -a.x)) );
   1187 				}
   1188 
   1189 				void main()
   1190 				{
   1191 					${SETUP}
   1192 					int[2][2][2] x = func(in0);
   1193 					out0 = ivec2(x[0][0][0], x[1][1][1]);
   1194 					${OUTPUT}
   1195 				}
   1196 			""
   1197 		end
   1198 
   1199 		case bool_3x2x3
   1200 			version 310 es
   1201 			desc "Testing arrays of arrays as function return values with explicit array size"
   1202 			values
   1203 			{
   1204 				input bvec3 in0 = 	[ bvec3(false, true, true) ];
   1205 				output bvec3 out0 = [ bvec3(true, false, true) ];
   1206 			}
   1207 
   1208 			both ""
   1209 				#version 310 es
   1210 				precision mediump float;
   1211 				${DECLARATIONS}
   1212 
   1213 				bool[3][2][3] func(bvec3 a)
   1214 				{
   1215 					return bool[3][2][3] (	bool[2][3] (bool[3] (a.z, a.x, a.y),
   1216 														bool[3] (a.x, a.y, a.z)),
   1217 											bool[2][3] (bool[3] (a.x, a.y, a.z),
   1218 														bool[3] (a.z, a.x, a.y)),
   1219 											bool[2][3] (bool[3] (a.y, a.z, a.x),
   1220 														bool[3] (a.y, a.z, a.x)) );
   1221 				}
   1222 
   1223 				void main()
   1224 				{
   1225 					${SETUP}
   1226 					bool[3] x[3][2] = func(in0);
   1227 					out0 = bvec3(x[0][0][0], x[1][1][1], x[2][1][0]);
   1228 					${OUTPUT}
   1229 				}
   1230 			""
   1231 		end
   1232 
   1233 
   1234 		case vec3_2x3
   1235 			version 310 es
   1236 			desc "Testing arrays of arrays as function return values with explicit array size"
   1237 			values
   1238 			{
   1239 				input vec3 in0 = 	[ vec3(0.5, 1.0, 2.0) | vec3(-0.5, 11.2, -1.0) ];
   1240 				output vec3 out0 = [ vec3(1.0, 0.5, -2.0) | vec3(11.2, -0.5, 1.0) ];
   1241 			}
   1242 
   1243 			both ""
   1244 				#version 310 es
   1245 				precision mediump float;
   1246 				${DECLARATIONS}
   1247 
   1248 				vec3[2][3] func(vec3 p)
   1249 				{
   1250 					vec3[2][3] a = vec3[2][3](	vec3[3] (vec3(p.x, p.y, -p.z),
   1251 														vec3(p.y, -p.z, p.x),
   1252 														vec3(-p.z, p.x, p.y)),
   1253 												vec3[3] (vec3(p.y, -p.z, p.x),
   1254 														vec3(p.x, p.y, -p.z),
   1255 														vec3(-p.z, p.x, p.y)) );
   1256 
   1257 					return vec3[2][3] ( vec3[3] (a[0][1], a[0][2], a[0][0]),
   1258 										vec3[3] (a[1][1], a[1][2], a[1][0]));
   1259 				}
   1260 
   1261 				void main()
   1262 				{
   1263 					${SETUP}
   1264 
   1265 					vec3[2][3] x = func(in0);
   1266 					out0 = vec3(x[0][0].x, x[1][1].y, x[0][2].z);
   1267 					${OUTPUT}
   1268 				}
   1269 			""
   1270 		end
   1271 
   1272 		case struct_3x1x3
   1273 			version 310 es
   1274 			desc "Testing arrays of arrays as function return values with explicit array size"
   1275 			values
   1276 			{
   1277 				input vec3 in0 = [ vec3(0.5, 1.0, 2.0) ];
   1278 				output vec3 out0 = [ vec3(-1.0, 2.0, 0.5) ];
   1279 			}
   1280 
   1281 			both ""
   1282 				#version 310 es
   1283 				precision mediump float;
   1284 				${DECLARATIONS}
   1285 
   1286 				struct Test
   1287 				{
   1288 					float f;
   1289 					vec3 v;
   1290 				};
   1291 
   1292 				Test[3][1][3] func(vec3 p)
   1293 				{
   1294 					Test a = Test(p.z, vec3(p.x, p.y, p.z));
   1295 					Test b = Test(p.y, vec3(-p.z, -p.x, -p.y));
   1296 					Test c = Test(p.x, vec3(-p.y, p.z, -p.x));
   1297 
   1298 					return Test[3][1][3] (	Test[1][3] (Test[3] (b, b, b)),
   1299 											Test[1][3] (Test[3] (a, a, a)),
   1300 											Test[1][3] (Test[3] (c, c, c)) );
   1301 				}
   1302 
   1303 				void main()
   1304 				{
   1305 					${SETUP}
   1306 					Test[3][1][3] x = func(in0);
   1307 					out0 = vec3(x[0][0][0].v.z, x[2][0][2].v.y, x[1][0][1].v.x);
   1308 					${OUTPUT}
   1309 				}
   1310 			""
   1311 		end
   1312 
   1313 		case ivec3_3x3
   1314 			version 310 es
   1315 			desc "Testing arrays of arrays as function return values with explicit array size"
   1316 			values
   1317 			{
   1318 				input ivec3 in0 = [ ivec3(5, 1, 2) | ivec3(-5, 11, -1) ];
   1319 				output ivec3 out0 = [ ivec3(1, 5, -2) | ivec3(11, -5, 1) ];
   1320 			}
   1321 
   1322 			both ""
   1323 				#version 310 es
   1324 				precision mediump int;
   1325 				precision mediump float;
   1326 				${DECLARATIONS}
   1327 
   1328 				ivec3[3][3] func(ivec3 p)
   1329 				{
   1330 					ivec3[3][3] a = ivec3[3][3] (	ivec3[3] (	ivec3(p.x, p.y, -p.z),
   1331 																ivec3(p.x, p.y, -p.z),
   1332 																ivec3(p.x, p.y, -p.z)),
   1333 
   1334 													ivec3[3] (	ivec3(p.y, -p.z, p.x),
   1335 																ivec3(p.y, -p.z, p.x),
   1336 																ivec3(p.y, -p.z, p.x)),
   1337 
   1338 													ivec3[3] (	ivec3(-p.z, p.x, p.y),
   1339 																ivec3(-p.z, p.x, p.y),
   1340 																ivec3(-p.z, p.x, p.y)) );
   1341 					return a;
   1342 				}
   1343 
   1344 				void main()
   1345 				{
   1346 					${SETUP}
   1347 					ivec3[3][3] x = func(in0);
   1348 					out0 = ivec3(x[1][0].x, x[2][0].y, x[0][2].z);
   1349 					${OUTPUT}
   1350 				}
   1351 			""
   1352 		end
   1353 
   1354 		case bvec4_4x2
   1355 			version 310 es
   1356 			desc "Testing arrays of arrays as function return values with explicit array size"
   1357 			values
   1358 			{
   1359 				input bvec4 in0 = 	[ bvec4(true, false, false, true) ];
   1360 				output bvec4 out0 = [ bvec4(true, true, false, true) ];
   1361 			}
   1362 
   1363 			both ""
   1364 				#version 310 es
   1365 				precision mediump int;
   1366 				precision mediump float;
   1367 				${DECLARATIONS}
   1368 
   1369 				bvec4[4][2] func(bvec4 p)
   1370 				{
   1371 					bvec4[4] x = bvec4[4](	bvec4(p.x, p.y, p.z, p.w),
   1372 											bvec4(p.w, p.y, p.z, p.x),
   1373 											bvec4(p.z, p.w, p.x, p.y),
   1374 											bvec4(p.y, p.x, p.z, p.w) );
   1375 
   1376 					return bvec4[4][2] ( bvec4[2] (bvec4(x[0]),
   1377 												  bvec4(x[1])),
   1378 
   1379 										 bvec4[2] (bvec4(x[2]),
   1380 												  bvec4(x[3])),
   1381 
   1382 										 bvec4[2] (bvec4(x[1]),
   1383 												  bvec4(x[2])),
   1384 
   1385 										 bvec4[2] (bvec4(x[3]),
   1386 												  bvec4(x[0])) );
   1387 				}
   1388 
   1389 				void main()
   1390 				{
   1391 					${SETUP}
   1392 					bvec4[4][2] x = func(in0);
   1393 					out0 = bvec4(x[0][1].x, x[1][0].y, x[2][0].z, x[3][1].w);
   1394 					${OUTPUT}
   1395 				}
   1396 			""
   1397 		end
   1398 
   1399 		case mat3_3x2
   1400 			version 310 es
   1401 			desc "Testing arrays of arrays as function return values with explicit array size"
   1402 			values
   1403 			{
   1404 				input vec3 in0 = [ vec3(0.5, 1.0, 2.0) | vec3(-1.5, 0.0, -2.3) ];
   1405 				output vec3 out0 = [ vec3(0.5, -1.0, 1.0) | vec3(-1.5, 0.0, 0.0) ];
   1406 			}
   1407 
   1408 			both ""
   1409 				#version 310 es
   1410 				precision mediump float;
   1411 				${DECLARATIONS}
   1412 
   1413 				mat3[3][2] func(vec3 p)
   1414 				{
   1415 					mat3[3][2] a = mat3[3][2] (	mat3[2] (mat3(	p.x, p.y, p.z,
   1416 																p.x, p.y, p.z,
   1417 																p.x, p.y, p.z),
   1418 														mat3(	p.z, p.x, -p.y,
   1419 																p.z, p.x, -p.y,
   1420 																p.z, p.x, -p.y)),
   1421 
   1422 												mat3[2] (mat3(	-p.z, -p.z, p.z,
   1423 																-p.y, -p.y, p.y,
   1424 																-p.x, -p.x, p.x),
   1425 														mat3(	p.x, p.y, p.z,
   1426 																p.x, p.y, p.z,
   1427 																p.x, p.y, p.z)),
   1428 
   1429 												mat3[2] (mat3(	p.z, p.x, -p.y,
   1430 																p.z, p.x, -p.y,
   1431 																p.z, p.x, -p.y),
   1432 														mat3(	-p.z, -p.z, p.z,
   1433 																-p.y, -p.y, p.y,
   1434 																-p.x, -p.x, p.x)) );
   1435 
   1436 					return a;
   1437 				}
   1438 
   1439 				void main()
   1440 				{
   1441 					${SETUP}
   1442 
   1443 					mat3 a[3][2] = func(in0);
   1444 
   1445 					mat3 a0 = a[0][0];
   1446 					mat3 a1 = a[0][1];
   1447 					mat3 a2 = a[2][1];
   1448 
   1449 					float ret0 = a0[2][0];
   1450 					float ret1 = a1[0][2];
   1451 					float ret2 = a2[1][2];
   1452 
   1453 					out0 = vec3(ret0, ret1, ret2);
   1454 					${OUTPUT}
   1455 				}
   1456 			""
   1457 		end
   1458 
   1459 		case mat3_3x3x3
   1460 			version 310 es
   1461 			desc "Testing arrays of arrays as function return values with explicit array size"
   1462 			values
   1463 			{
   1464 				input ivec3 in0 = [ ivec3(0, 1, 2) | ivec3(-1, 0, -2) ];
   1465 				output ivec3 out0 = [ ivec3(0, -1, 1) | ivec3(-1, 0, 0) ];
   1466 			}
   1467 
   1468 			both ""
   1469 				#version 310 es
   1470 				precision mediump int;
   1471 				precision mediump float;
   1472 				${DECLARATIONS}
   1473 
   1474 				mat3[3][3][3] func(ivec3 p)
   1475 				{
   1476 					mat3 a = mat3(	p.x, p.y, p.z,
   1477 									p.x, p.y, p.z,
   1478 									p.x, p.y, p.z);
   1479 					mat3 b = mat3(	p.z, p.x, -p.y,
   1480 									p.z, p.x, -p.y,
   1481 									p.z, p.x, -p.y);
   1482 					mat3 c = mat3(	-p.z, -p.z, p.z,
   1483 									-p.y, -p.y, p.y,
   1484 									-p.x, -p.x, p.x);
   1485 
   1486 					return mat3[3][3][3] (	mat3[3][3] (mat3[3] (a, a, a),
   1487 														mat3[3] (b, b, b),
   1488 														mat3[3] (c, c, c)),
   1489 
   1490 											mat3[3][3] (mat3[3] (b, b, b),
   1491 														mat3[3] (a, a, a),
   1492 														mat3[3] (c, c, c)),
   1493 
   1494 											mat3[3][3] (mat3[3] (c, c, c),
   1495 														mat3[3] (a, a, a),
   1496 														mat3[3] (b, b, b)) );
   1497 				}
   1498 
   1499 				void main()
   1500 				{
   1501 					${SETUP}
   1502 
   1503 					mat3 x[3][3][3] = func(in0);
   1504 
   1505 					mat3 x0 = x[0][0][0];
   1506 					mat3 x1 = x[1][0][0];
   1507 					mat3 x2 = x[2][0][0];
   1508 
   1509 					float ret0 = x0[2][0];
   1510 					float ret1 = x1[0][2];
   1511 					float ret2 = x2[1][2];
   1512 
   1513 					out0 = ivec3(ret0, ret1, ret2);
   1514 					${OUTPUT}
   1515 				}
   1516 			""
   1517 		end
   1518 
   1519 		case mat3_3x4
   1520 			version 310 es
   1521 			desc "Testing arrays of arrays as function return values with explicit array size"
   1522 			values
   1523 			{
   1524 				input bvec3 in0 = [ bvec3(true, false, true) ];
   1525 				output bvec3 out0 = [ bvec3(true, false, false) ];
   1526 			}
   1527 
   1528 			both ""
   1529 				#version 310 es
   1530 				precision mediump float;
   1531 				${DECLARATIONS}
   1532 
   1533 				mat3[3][4] func(bvec3 p)
   1534 				{
   1535 					mat3 a = mat3(	p.x, p.y, p.z,
   1536 									p.x, p.y, p.z,
   1537 									p.x, p.y, p.z);
   1538 
   1539 					mat3 b = mat3(	p.z, p.x, p.y,
   1540 									p.z, p.x, p.y,
   1541 									p.z, p.x, p.y);
   1542 
   1543 					mat3 c = mat3(	p.z, p.z, p.z,
   1544 									p.y, p.y, p.y,
   1545 									p.x, p.x, p.x);
   1546 
   1547 					return mat3[3][4] (	mat3[4] (a, b, c, a),
   1548 										mat3[4] (b, c, a, b),
   1549 										mat3[4] (c, a, b, c) );
   1550 				}
   1551 
   1552 				void main()
   1553 				{
   1554 					${SETUP}
   1555 
   1556 					mat3[4] x[3] = func(in0);
   1557 
   1558 					mat3 x0 = x[0][0];
   1559 					mat3 x1 = x[1][3];
   1560 					mat3 x2 = x[2][0];
   1561 
   1562 					float ret0 = x0[2][0];
   1563 					float ret1 = x1[0][2];
   1564 					float ret2 = x2[1][2];
   1565 
   1566 					out0 = bvec3(ret0, ret1, ret2);
   1567 					${OUTPUT}
   1568 				}
   1569 			""
   1570 		end
   1571 
   1572 	end # explicit
   1573 
   1574 	group implicit "Test return value with implicit constructor"
   1575 
   1576 		case float_3x3
   1577 			version 310 es
   1578 			desc "Testing arrays of arrays as function return values with implicit array size"
   1579 			values
   1580 			{
   1581 				input vec3 in0 = [ vec3(0.5, 1.0, 2.0) | vec3(7.4, -1.0, 2.0) | vec3(3.0, 1.6, -2.0) ];
   1582 				output vec3 out0 = [ vec3(2.0, -0.5, 1.0) | vec3(2.0, -7.4, -1.0) | vec3(-2.0, -3.0, 1.6) ];
   1583 			}
   1584 
   1585 			both ""
   1586 				#version 310 es
   1587 				precision mediump float;
   1588 				${DECLARATIONS}
   1589 
   1590 				float[3][3] func(vec3 a)
   1591 				{
   1592 					return float[][] (	float[] (a.z, 0.0, 0.0),
   1593 										float[] (0.0, -a.x, 0.0),
   1594 										float[] (0.0, 0.0, a.y) );
   1595 				}
   1596 
   1597 				void main()
   1598 				{
   1599 					${SETUP}
   1600 					float[3][3] x = func(in0);
   1601 					out0 = vec3(x[0][0], x[1][1], x[2][2]);
   1602 					${OUTPUT}
   1603 				}
   1604 			""
   1605 		end
   1606 
   1607 		case int_2x2x2
   1608 			version 310 es
   1609 			desc "Testing arrays of arrays as function return values with implicit array size"
   1610 			values
   1611 			{
   1612 				input ivec2 in0 = [ ivec2(4, 1) | ivec2(7, -1) | ivec2(3, 1) ];
   1613 				output ivec2 out0 =	[ ivec2(1, -4) | ivec2(-1, -7) | ivec2(1, -3) ];
   1614 			}
   1615 
   1616 			both ""
   1617 				#version 310 es
   1618 				precision mediump int;
   1619 				precision mediump float;
   1620 				${DECLARATIONS}
   1621 
   1622 				int[2][2][2] func(ivec2 a)
   1623 				{
   1624 					return int[][][] (	int[][] (	int[] (a.y, -a.x),
   1625 													int[] (0, 0)),
   1626 										int[][] (	int[] (0, 0),
   1627 													int[] (a.y, -a.x)) );
   1628 				}
   1629 
   1630 				void main()
   1631 				{
   1632 					${SETUP}
   1633 					int[2][2][2] x = func(in0);
   1634 					out0 = ivec2(x[0][0][0], x[1][1][1]);
   1635 					${OUTPUT}
   1636 				}
   1637 			""
   1638 		end
   1639 
   1640 		case bool_3x2x3
   1641 			version 310 es
   1642 			desc "Testing arrays of arrays as function return values with implicit array size"
   1643 			values
   1644 			{
   1645 				input bvec3 in0 = 	[ bvec3(false, true, true) ];
   1646 				output bvec3 out0 = [ bvec3(true, false, true) ];
   1647 			}
   1648 
   1649 			both ""
   1650 				#version 310 es
   1651 				precision mediump float;
   1652 				${DECLARATIONS}
   1653 
   1654 				bool[3][2][3] func(bvec3 a)
   1655 				{
   1656 					return bool[][][] (	bool[][] (	bool[] (a.z, a.x, a.y),
   1657 													bool[] (a.x, a.y, a.z)),
   1658 										bool[][] (	bool[] (a.x, a.y, a.z),
   1659 													bool[] (a.z, a.x, a.y)),
   1660 										bool[][] (	bool[] (a.y, a.z, a.x),
   1661 													bool[] (a.y, a.z, a.x)) );
   1662 				}
   1663 
   1664 				void main()
   1665 				{
   1666 					${SETUP}
   1667 					bool[3] x[3][2] = func(in0);
   1668 					out0 = bvec3(x[0][0][0], x[1][1][1], x[2][1][0]);
   1669 					${OUTPUT}
   1670 				}
   1671 			""
   1672 		end
   1673 
   1674 		case vec3_2x3
   1675 			version 310 es
   1676 			desc "Testing arrays of arrays as function return values with implicit array size"
   1677 			values
   1678 			{
   1679 				input vec3 in0 = 	[ vec3(0.5, 1.0, 2.0) | vec3(-0.5, 11.2, -1.0) ];
   1680 				output vec3 out0 = [ vec3(1.0, 0.5, -2.0) | vec3(11.2, -0.5, 1.0) ];
   1681 			}
   1682 
   1683 			both ""
   1684 				#version 310 es
   1685 				precision mediump float;
   1686 				${DECLARATIONS}
   1687 
   1688 				vec3[2][3] func(vec3 p)
   1689 				{
   1690 					vec3[2][3] a = vec3[2][3](	vec3[3] (	vec3(p.x, p.y, -p.z),
   1691 															vec3(p.y, -p.z, p.x),
   1692 															vec3(-p.z, p.x, p.y)),
   1693 												vec3[3] (	vec3(p.y, -p.z, p.x),
   1694 															vec3(p.x, p.y, -p.z),
   1695 															vec3(-p.z, p.x, p.y)) );
   1696 
   1697 					return vec3[][] ( 	vec3[] (a[0][1], a[0][2], a[0][0]),
   1698 										vec3[] (a[1][1], a[1][2], a[1][0]));
   1699 				}
   1700 
   1701 				void main()
   1702 				{
   1703 					${SETUP}
   1704 
   1705 					vec3[2][3] x = func(in0);
   1706 					out0 = vec3(x[0][0].x, x[1][1].y, x[0][2].z);
   1707 					${OUTPUT}
   1708 				}
   1709 			""
   1710 		end
   1711 
   1712 		case struct_3x1x3
   1713 			version 310 es
   1714 			desc "Testing arrays of arrays as function return values with implicit array size"
   1715 			values
   1716 			{
   1717 				input vec3 in0 = [ vec3(0.5, 1.0, 2.0) ];
   1718 				output vec3 out0 = [ vec3(-1.0, 2.0, 0.5) ];
   1719 			}
   1720 
   1721 			both ""
   1722 				#version 310 es
   1723 				precision mediump float;
   1724 				${DECLARATIONS}
   1725 
   1726 				struct Test
   1727 				{
   1728 					float f;
   1729 					vec3 v;
   1730 				};
   1731 
   1732 				Test[3][1][3] func(vec3 p)
   1733 				{
   1734 					Test a = Test(p.z, vec3(p.x, p.y, p.z));
   1735 					Test b = Test(p.y, vec3(-p.z, -p.x, -p.y));
   1736 					Test c = Test(p.x, vec3(-p.y, p.z, -p.x));
   1737 
   1738 					return Test[][][] (	Test[][] (Test[] (b, b, b)),
   1739 										Test[][] (Test[] (a, a, a)),
   1740 										Test[][] (Test[] (c, c, c)) );
   1741 				}
   1742 
   1743 				void main()
   1744 				{
   1745 					${SETUP}
   1746 					Test[3][1][3] x = func(in0);
   1747 					out0 = vec3(x[0][0][0].v.z, x[2][0][2].v.y, x[1][0][1].v.x);
   1748 					${OUTPUT}
   1749 				}
   1750 			""
   1751 		end
   1752 
   1753 		case ivec3_3x3
   1754 			version 310 es
   1755 			desc "Testing arrays of arrays as function return values with implicit array size"
   1756 			values
   1757 			{
   1758 				input ivec3 in0 = [ ivec3(5, 1, 2) | ivec3(-5, 11, -1) ];
   1759 				output ivec3 out0 = [ ivec3(1, 5, -2) | ivec3(11, -5, 1) ];
   1760 			}
   1761 
   1762 			both ""
   1763 				#version 310 es
   1764 				precision mediump int;
   1765 				precision mediump float;
   1766 				${DECLARATIONS}
   1767 
   1768 				ivec3[3][3] func(ivec3 p)
   1769 				{
   1770 					return ivec3[][] (	ivec3[] (	ivec3(p.x, p.y, -p.z),
   1771 													ivec3(p.x, p.y, -p.z),
   1772 													ivec3(p.x, p.y, -p.z)),
   1773 
   1774 										ivec3[] (	ivec3(p.y, -p.z, p.x),
   1775 													ivec3(p.y, -p.z, p.x),
   1776 													ivec3(p.y, -p.z, p.x)),
   1777 
   1778 										ivec3[] (	ivec3(-p.z, p.x, p.y),
   1779 													ivec3(-p.z, p.x, p.y),
   1780 													ivec3(-p.z, p.x, p.y)) );
   1781 				}
   1782 
   1783 				void main()
   1784 				{
   1785 					${SETUP}
   1786 					ivec3[3][3] x = func(in0);
   1787 					out0 = ivec3(x[1][0].x, x[2][0].y, x[0][2].z);
   1788 					${OUTPUT}
   1789 				}
   1790 			""
   1791 		end
   1792 
   1793 		case bvec4_4x2
   1794 			version 310 es
   1795 			desc "Testing arrays of arrays as function return values with implicit array size"
   1796 			values
   1797 			{
   1798 				input bvec4 in0 = 	[ bvec4(true, false, false, true) ];
   1799 				output bvec4 out0 = [ bvec4(true, true, false, true) ];
   1800 			}
   1801 
   1802 			both ""
   1803 				#version 310 es
   1804 				precision mediump int;
   1805 				precision mediump float;
   1806 				${DECLARATIONS}
   1807 
   1808 				bvec4[4][2] func(bvec4 p)
   1809 				{
   1810 					bvec4[4] x = bvec4[4](	bvec4(p.x, p.y, p.z, p.w),
   1811 											bvec4(p.w, p.y, p.z, p.x),
   1812 											bvec4(p.z, p.w, p.x, p.y),
   1813 											bvec4(p.y, p.x, p.z, p.w) );
   1814 
   1815 					return bvec4[][] ( 	bvec4[] (bvec4(x[0]),
   1816 												 bvec4(x[1])),
   1817 
   1818 										bvec4[] (bvec4(x[2]),
   1819 												 bvec4(x[3])),
   1820 
   1821 										bvec4[] (bvec4(x[1]),
   1822 												 bvec4(x[2])),
   1823 
   1824 										bvec4[] (bvec4(x[3]),
   1825 												 bvec4(x[0])) );
   1826 				}
   1827 
   1828 				void main()
   1829 				{
   1830 					${SETUP}
   1831 					bvec4[4][2] x = func(in0);
   1832 					out0 = bvec4(x[0][1].x, x[1][0].y, x[2][0].z, x[3][1].w);
   1833 					${OUTPUT}
   1834 				}
   1835 			""
   1836 		end
   1837 
   1838 		case mat3_3x2
   1839 			version 310 es
   1840 			desc "Testing arrays of arrays as function return values with implicit array size"
   1841 			values
   1842 			{
   1843 				input vec3 in0 = [ vec3(0.5, 1.0, 2.0) | vec3(-1.5, 0.0, -2.3) ];
   1844 				output vec3 out0 = [ vec3(0.5, -1.0, 1.0) | vec3(-1.5, 0.0, 0.0) ];
   1845 			}
   1846 
   1847 			both ""
   1848 				#version 310 es
   1849 				precision mediump float;
   1850 				${DECLARATIONS}
   1851 
   1852 				mat3[3][2] func(vec3 p)
   1853 				{
   1854 					return mat3[][] (	mat3[] (mat3(	p.x, p.y, p.z,
   1855 														p.x, p.y, p.z,
   1856 														p.x, p.y, p.z),
   1857 												mat3(	p.z, p.x, -p.y,
   1858 														p.z, p.x, -p.y,
   1859 														p.z, p.x, -p.y)),
   1860 
   1861 										mat3[] (mat3(	-p.z, -p.z, p.z,
   1862 														-p.y, -p.y, p.y,
   1863 														-p.x, -p.x, p.x),
   1864 												mat3(	p.x, p.y, p.z,
   1865 														p.x, p.y, p.z,
   1866 														p.x, p.y, p.z)),
   1867 
   1868 										mat3[] (mat3(	p.z, p.x, -p.y,
   1869 														p.z, p.x, -p.y,
   1870 														p.z, p.x, -p.y),
   1871 												mat3(	-p.z, -p.z, p.z,
   1872 														-p.y, -p.y, p.y,
   1873 														-p.x, -p.x, p.x)) );
   1874 
   1875 				}
   1876 
   1877 				void main()
   1878 				{
   1879 					${SETUP}
   1880 
   1881 					mat3 a[3][2] = func(in0);
   1882 
   1883 					mat3 a0 = a[0][0];
   1884 					mat3 a1 = a[0][1];
   1885 					mat3 a2 = a[2][1];
   1886 
   1887 					float ret0 = a0[2][0];
   1888 					float ret1 = a1[0][2];
   1889 					float ret2 = a2[1][2];
   1890 
   1891 					out0 = vec3(ret0, ret1, ret2);
   1892 					${OUTPUT}
   1893 				}
   1894 			""
   1895 		end
   1896 
   1897 		case mat3_3x3x3
   1898 			version 310 es
   1899 			desc "Testing arrays of arrays as function return values with implicit array size"
   1900 			values
   1901 			{
   1902 				input ivec3 in0 = [ ivec3(0, 1, 2) | ivec3(-1, 0, -2) ];
   1903 				output ivec3 out0 = [ ivec3(0, -1, 1) | ivec3(-1, 0, 0) ];
   1904 			}
   1905 
   1906 			both ""
   1907 				#version 310 es
   1908 				precision mediump int;
   1909 				precision mediump float;
   1910 				${DECLARATIONS}
   1911 
   1912 				mat3[3][3][3] func(ivec3 p)
   1913 				{
   1914 					mat3 a = mat3(	p.x, p.y, p.z,
   1915 									p.x, p.y, p.z,
   1916 									p.x, p.y, p.z);
   1917 					mat3 b = mat3(	p.z, p.x, -p.y,
   1918 									p.z, p.x, -p.y,
   1919 									p.z, p.x, -p.y);
   1920 					mat3 c = mat3(	-p.z, -p.z, p.z,
   1921 									-p.y, -p.y, p.y,
   1922 									-p.x, -p.x, p.x);
   1923 
   1924 					return mat3[][][] (	mat3[][] (	mat3[] (a, a, a),
   1925 													mat3[] (b, b, b),
   1926 													mat3[] (c, c, c)),
   1927 
   1928 										mat3[][] (	mat3[] (b, b, b),
   1929 													mat3[] (a, a, a),
   1930 													mat3[] (c, c, c)),
   1931 
   1932 										mat3[][] (	mat3[] (c, c, c),
   1933 													mat3[] (a, a, a),
   1934 													mat3[] (b, b, b)) );
   1935 				}
   1936 
   1937 				void main()
   1938 				{
   1939 					${SETUP}
   1940 
   1941 					mat3 x[3][3][3] = func(in0);
   1942 
   1943 					mat3 x0 = x[0][0][0];
   1944 					mat3 x1 = x[1][0][0];
   1945 					mat3 x2 = x[2][0][0];
   1946 
   1947 					float ret0 = x0[2][0];
   1948 					float ret1 = x1[0][2];
   1949 					float ret2 = x2[1][2];
   1950 
   1951 					out0 = ivec3(ret0, ret1, ret2);
   1952 					${OUTPUT}
   1953 				}
   1954 			""
   1955 		end
   1956 
   1957 		case mat3_3x4
   1958 			version 310 es
   1959 			desc "Testing arrays of arrays as function return values with implicit array size"
   1960 			values
   1961 			{
   1962 				input bvec3 in0 = [ bvec3(true, false, true) ];
   1963 				output bvec3 out0 = [ bvec3(true, false, false) ];
   1964 			}
   1965 
   1966 			both ""
   1967 				#version 310 es
   1968 				precision mediump float;
   1969 				${DECLARATIONS}
   1970 
   1971 				mat3[3][4] func(bvec3 p)
   1972 				{
   1973 					mat3 a = mat3(	p.x, p.y, p.z,
   1974 									p.x, p.y, p.z,
   1975 									p.x, p.y, p.z);
   1976 
   1977 					mat3 b = mat3(	p.z, p.x, p.y,
   1978 									p.z, p.x, p.y,
   1979 									p.z, p.x, p.y);
   1980 
   1981 					mat3 c = mat3(	p.z, p.z, p.z,
   1982 									p.y, p.y, p.y,
   1983 									p.x, p.x, p.x);
   1984 
   1985 					return mat3[][] (	mat3[] (a, b, c, a),
   1986 										mat3[] (b, c, a, b),
   1987 										mat3[] (c, a, b, c) );
   1988 				}
   1989 
   1990 				void main()
   1991 				{
   1992 					${SETUP}
   1993 
   1994 					mat3[4] x[3] = func(in0);
   1995 
   1996 					mat3 x0 = x[0][0];
   1997 					mat3 x1 = x[1][3];
   1998 					mat3 x2 = x[2][0];
   1999 
   2000 					float ret0 = x0[2][0];
   2001 					float ret1 = x1[0][2];
   2002 					float ret2 = x2[1][2];
   2003 
   2004 					out0 = bvec3(ret0, ret1, ret2);
   2005 					${OUTPUT}
   2006 				}
   2007 			""
   2008 		end
   2009 
   2010 	end # implicit
   2011 
   2012 end # return
   2013 
   2014 group parameter "Array of arrays as a function parameter"
   2015 
   2016 	# in
   2017 	group in "Array of arrays as an in-function parameter"
   2018 
   2019 		case float_3x3
   2020 			version 310 es
   2021 			desc "Testing array of arrays as an in-function parameter"
   2022 			values
   2023 			{
   2024 				input vec3 in0 = [ vec3(0.5, 1.0, 2.0) | vec3(7.4, -1.0, 2.0) | vec3(3.0, 1.6, -2.0) ];
   2025 				output vec3 out0 = [ vec3(2.0, -0.5, 1.0) | vec3(2.0, -7.4, -1.0) | vec3(-2.0, -3.0, 1.6) ];
   2026 			}
   2027 
   2028 			both ""
   2029 				#version 310 es
   2030 				precision mediump float;
   2031 				${DECLARATIONS}
   2032 
   2033 				vec3 func(in float[3][3] x)
   2034 				{
   2035 					return vec3(x[0][0], x[1][1], x[2][2]);
   2036 				}
   2037 
   2038 				void main()
   2039 				{
   2040 					${SETUP}
   2041 					float[3][3] x = float[3][3] ( 	float[3] (in0.z, 0.0, 0.0),
   2042 													float[3] (0.0, -in0.x, 0.0),
   2043 													float[3] (0.0, 0.0, in0.y) );
   2044 
   2045 					out0 = func(x);
   2046 					${OUTPUT}
   2047 				}
   2048 			""
   2049 		end
   2050 
   2051 		case int_2x2x2
   2052 			version 310 es
   2053 			desc "Testing array of arrays as an in-function parameter"
   2054 			values
   2055 			{
   2056 				input ivec2 in0 = [ ivec2(4, 1) | ivec2(7, -1) | ivec2(3, 1) ];
   2057 				output ivec2 out0 =	[ ivec2(1, -4) | ivec2(-1, -7) | ivec2(1, -3) ];
   2058 			}
   2059 
   2060 			both ""
   2061 				#version 310 es
   2062 				precision mediump int;
   2063 				precision mediump float;
   2064 				${DECLARATIONS}
   2065 
   2066 				ivec2 func(in int[2][2][2] x)
   2067 				{
   2068 					return ivec2(x[0][0][0], x[1][1][1]);
   2069 				}
   2070 
   2071 				void main()
   2072 				{
   2073 					${SETUP}
   2074 					int[2][2][2] x = int[2][2][2] (	int[2][2] (	int[2] (in0.y, -in0.x),
   2075 																int[2] (0, 0)),
   2076 													int[2][2] (	int[2] (0, 0),
   2077 																int[2] (in0.y, -in0.x)) );
   2078 
   2079 					out0 = func(x);
   2080 					${OUTPUT}
   2081 				}
   2082 			""
   2083 		end
   2084 
   2085 		case bool_3x2x3
   2086 			version 310 es
   2087 			desc "Testing array of arrays as an in-function parameter"
   2088 			values
   2089 			{
   2090 				input bvec3 in0 = 	[ bvec3(false, true, true) ];
   2091 				output bvec3 out0 = [ bvec3(true, false, true) ];
   2092 			}
   2093 
   2094 			both ""
   2095 				#version 310 es
   2096 				precision mediump float;
   2097 				${DECLARATIONS}
   2098 
   2099 				bvec3 func(in bool x[3][2][3])
   2100 				{
   2101 					return bvec3(x[0][0][0], x[1][1][1], x[2][1][0]);
   2102 				}
   2103 
   2104 				void main()
   2105 				{
   2106 					${SETUP}
   2107 					bool[3] x[3][2] = bool[3][2][3] (	bool[2][3] (bool[3] (in0.z, in0.x, in0.y),
   2108 																	bool[3] (in0.x, in0.y, in0.z)),
   2109 														bool[2][3] (bool[3] (in0.x, in0.y, in0.z),
   2110 																	bool[3] (in0.z, in0.x, in0.y)),
   2111 														bool[2][3] (bool[3] (in0.y, in0.z, in0.x),
   2112 																	bool[3] (in0.y, in0.z, in0.x)) );
   2113 
   2114 					out0 = func(x);
   2115 					${OUTPUT}
   2116 				}
   2117 			""
   2118 		end
   2119 
   2120 		case vec3_2x3
   2121 			version 310 es
   2122 			desc "Testing array of arrays as an in-function parameter"
   2123 			values
   2124 			{
   2125 				input vec3 in0 = 	[ vec3(0.5, 1.0, 2.0) | vec3(-0.5, 11.2, -1.0) ];
   2126 				output vec3 out0 = [ vec3(1.0, 0.5, -2.0) | vec3(11.2, -0.5, 1.0) ];
   2127 			}
   2128 
   2129 			both ""
   2130 				#version 310 es
   2131 				precision mediump float;
   2132 				${DECLARATIONS}
   2133 
   2134 				vec3 func(in vec3[3] x[2])
   2135 				{
   2136 					return vec3(x[0][0].x, x[1][1].y, x[0][2].z);
   2137 				}
   2138 
   2139 				void main()
   2140 				{
   2141 					${SETUP}
   2142 					vec3[2][3] x = vec3[2][3](	vec3[3] (	vec3(in0.x, in0.y, -in0.z),
   2143 															vec3(in0.y, -in0.z, in0.x),
   2144 															vec3(-in0.z, in0.x, in0.y)),
   2145 												vec3[3] (	vec3(in0.y, -in0.z, in0.x),
   2146 															vec3(in0.x, in0.y, -in0.z),
   2147 															vec3(-in0.z, in0.x, in0.y)) );
   2148 
   2149 					x = vec3[2][3] (vec3[3] (x[0][1], x[0][2], x[0][0]),
   2150 									vec3[3] (x[1][1], x[1][2], x[1][0]) );
   2151 
   2152 					out0 = func(x);
   2153 					${OUTPUT}
   2154 				}
   2155 			""
   2156 		end
   2157 
   2158 		case struct_3x1x3
   2159 			version 310 es
   2160 			desc "Testing array of arrays as an in-function parameter"
   2161 			values
   2162 			{
   2163 				input vec3 in0 = [ vec3(0.5, 1.0, 2.0) ];
   2164 				output vec3 out0 = [ vec3(-1.0, 2.0, 0.5) ];
   2165 			}
   2166 
   2167 			both ""
   2168 				#version 310 es
   2169 				precision mediump float;
   2170 				${DECLARATIONS}
   2171 
   2172 				struct Test
   2173 				{
   2174 					float f;
   2175 					vec3 v;
   2176 				};
   2177 
   2178 				vec3 func(in Test[3] x[3][1])
   2179 				{
   2180 					return vec3(x[0][0][0].v.z, x[2][0][2].v.y, x[1][0][1].v.x);
   2181 				}
   2182 
   2183 				void main()
   2184 				{
   2185 					${SETUP}
   2186 					Test a = Test(in0.z, vec3(in0.x, in0.y, in0.z));
   2187 					Test b = Test(in0.y, vec3(-in0.z, -in0.x, -in0.y));
   2188 					Test c = Test(in0.x, vec3(-in0.y, in0.z, -in0.x));
   2189 
   2190 					Test x[3][1][3] = Test[3][1][3] (	Test[1][3] (Test[3] (b, b, b)),
   2191 														Test[1][3] (Test[3] (a, a, a)),
   2192 														Test[1][3] (Test[3] (c, c, c)) );
   2193 
   2194 					out0 = func(x);
   2195 					${OUTPUT}
   2196 				}
   2197 			""
   2198 		end
   2199 
   2200 		case ivec3_3x3
   2201 			version 310 es
   2202 			desc "Testing array of arrays as an in-function parameter"
   2203 			values
   2204 			{
   2205 				input ivec3 in0 = [ ivec3(5, 1, 2) | ivec3(-5, 11, -1) ];
   2206 				output ivec3 out0 = [ ivec3(1, 5, -2) | ivec3(11, -5, 1) ];
   2207 			}
   2208 
   2209 			both ""
   2210 				#version 310 es
   2211 				precision mediump int;
   2212 				precision mediump float;
   2213 				${DECLARATIONS}
   2214 
   2215 				ivec3 func(in ivec3 x[3][3])
   2216 				{
   2217 					return ivec3(x[1][0].x, x[2][0].y, x[0][2].z);
   2218 				}
   2219 
   2220 				void main()
   2221 				{
   2222 					${SETUP}
   2223 					ivec3[3][3] x = ivec3[3][3] (	ivec3[3] (	ivec3(in0.x, in0.y, -in0.z),
   2224 																ivec3(in0.x, in0.y, -in0.z),
   2225 																ivec3(in0.x, in0.y, -in0.z)),
   2226 
   2227 													ivec3[3] (	ivec3(in0.y, -in0.z, in0.x),
   2228 																ivec3(in0.y, -in0.z, in0.x),
   2229 																ivec3(in0.y, -in0.z, in0.x)),
   2230 
   2231 													ivec3[3] (	ivec3(-in0.z, in0.x, in0.y),
   2232 																ivec3(-in0.z, in0.x, in0.y),
   2233 																ivec3(-in0.z, in0.x, in0.y)) );
   2234 
   2235 					out0 = func(x);
   2236 					${OUTPUT}
   2237 				}
   2238 			""
   2239 		end
   2240 
   2241 		case bvec4_4x2
   2242 			version 310 es
   2243 			desc "Testing array of arrays as an in-function parameter"
   2244 			values
   2245 			{
   2246 				input bvec4 in0 = 	[ bvec4(true, false, false, true) ];
   2247 				output bvec4 out0 = [ bvec4(true, true, false, true) ];
   2248 			}
   2249 
   2250 			both ""
   2251 				#version 310 es
   2252 				precision mediump int;
   2253 				precision mediump float;
   2254 				${DECLARATIONS}
   2255 
   2256 				bvec4 func(in bvec4[4][2] x)
   2257 				{
   2258 					return bvec4(x[0][1].x, x[1][0].y, x[2][0].z, x[3][1].w);
   2259 				}
   2260 
   2261 				void main()
   2262 				{
   2263 					${SETUP}
   2264 					bvec4[4] a = bvec4[4](	bvec4(in0.x, in0.y, in0.z, in0.w),
   2265 											bvec4(in0.w, in0.y, in0.z, in0.x),
   2266 											bvec4(in0.z, in0.w, in0.x, in0.y),
   2267 											bvec4(in0.y, in0.x, in0.z, in0.w) );
   2268 
   2269 					bvec4 x[4][2] = bvec4[4][2] (	bvec4[2] (bvec4(a[0]),
   2270 															  bvec4(a[1])),
   2271 
   2272 													bvec4[2] (bvec4(a[2]),
   2273 															  bvec4(a[3])),
   2274 
   2275 													bvec4[2] (bvec4(a[1]),
   2276 															  bvec4(a[2])),
   2277 
   2278 													bvec4[2] (bvec4(a[3]),
   2279 															  bvec4(a[0])) );
   2280 
   2281 					out0 = func(x);
   2282 					${OUTPUT}
   2283 				}
   2284 			""
   2285 		end
   2286 
   2287 		case mat3_3x2
   2288 			version 310 es
   2289 			desc "Testing array of arrays as an in-function parameter"
   2290 			values
   2291 			{
   2292 				input vec3 in0 = [ vec3(0.5, 1.0, 2.0) | vec3(-1.5, 0.0, -2.3) ];
   2293 				output vec3 out0 = [ vec3(0.5, -1.0, 1.0) | vec3(-1.5, 0.0, 0.0) ];
   2294 			}
   2295 
   2296 			both ""
   2297 				#version 310 es
   2298 				precision mediump float;
   2299 				${DECLARATIONS}
   2300 
   2301 				vec3 func(in mat3[2] x[3])
   2302 				{
   2303 					mat3 a0 = x[0][0];
   2304 					mat3 a1 = x[0][1];
   2305 					mat3 a2 = x[2][1];
   2306 
   2307 					float ret0 = a0[2][0];
   2308 					float ret1 = a1[0][2];
   2309 					float ret2 = a2[1][2];
   2310 
   2311 					return vec3(ret0, ret1, ret2);
   2312 				}
   2313 
   2314 				void main()
   2315 				{
   2316 					${SETUP}
   2317 
   2318 					mat3 a = mat3(	in0.x, in0.y, in0.z,
   2319 									in0.x, in0.y, in0.z,
   2320 									in0.x, in0.y, in0.z);
   2321 
   2322 					mat3 b = mat3(	in0.z, in0.x, -in0.y,
   2323 									in0.z, in0.x, -in0.y,
   2324 									in0.z, in0.x, -in0.y);
   2325 
   2326 					mat3 c = mat3 (	-in0.z, -in0.z, in0.z,
   2327 									-in0.y, -in0.y, in0.y,
   2328 									-in0.x, -in0.x, in0.x);
   2329 
   2330 					mat3[3][2] x = mat3[3][2] (	mat3[2] (a, b),
   2331 												mat3[2] (c, a),
   2332 												mat3[2] (b, c) );
   2333 
   2334 					out0 = func(x);
   2335 					${OUTPUT}
   2336 				}
   2337 			""
   2338 		end
   2339 
   2340 		case mat3_3x3x3
   2341 			version 310 es
   2342 			desc "Testing array of arrays as an in-function parameter"
   2343 			values
   2344 			{
   2345 				input ivec3 in0 = [ ivec3(0, 1, 2) | ivec3(-1, 0, -2) ];
   2346 				output ivec3 out0 = [ ivec3(0, -1, 1) | ivec3(-1, 0, 0) ];
   2347 			}
   2348 
   2349 			both ""
   2350 				#version 310 es
   2351 				precision mediump int;
   2352 				precision mediump float;
   2353 				${DECLARATIONS}
   2354 
   2355 				ivec3 func(in mat3[3][3] x[3])
   2356 				{
   2357 					mat3 x0 = x[0][0][0];
   2358 					mat3 x1 = x[1][0][0];
   2359 					mat3 x2 = x[2][0][0];
   2360 
   2361 					float ret0 = x0[2][0];
   2362 					float ret1 = x1[0][2];
   2363 					float ret2 = x2[1][2];
   2364 
   2365 					return ivec3(ret0, ret1, ret2);
   2366 				}
   2367 
   2368 				void main()
   2369 				{
   2370 					${SETUP}
   2371 
   2372 					mat3 a = mat3(	in0.x, in0.y, in0.z,
   2373 									in0.x, in0.y, in0.z,
   2374 									in0.x, in0.y, in0.z);
   2375 					mat3 b = mat3(	in0.z, in0.x, -in0.y,
   2376 									in0.z, in0.x, -in0.y,
   2377 									in0.z, in0.x, -in0.y);
   2378 					mat3 c = mat3(	-in0.z, -in0.z, in0.z,
   2379 									-in0.y, -in0.y, in0.y,
   2380 									-in0.x, -in0.x, in0.x);
   2381 
   2382 					mat3 x[3][3][3] = mat3[3][3][3] (	mat3[3][3] (mat3[3] (a, a, a),
   2383 																	mat3[3] (b, b, b),
   2384 																	mat3[3] (c, c, c)),
   2385 
   2386 														mat3[3][3] (mat3[3] (b, b, b),
   2387 																	mat3[3] (a, a, a),
   2388 																	mat3[3] (c, c, c)),
   2389 
   2390 														mat3[3][3] (mat3[3] (c, c, c),
   2391 																	mat3[3] (a, a, a),
   2392 																	mat3[3] (b, b, b)) );
   2393 
   2394 					out0 = func(x);
   2395 					${OUTPUT}
   2396 				}
   2397 			""
   2398 		end
   2399 
   2400 		case mat3_3x4
   2401 			version 310 es
   2402 			desc "Testing array of arrays as an in-function parameter"
   2403 			values
   2404 			{
   2405 				input bvec3 in0 = [ bvec3(true, false, true) ];
   2406 				output bvec3 out0 = [ bvec3(true, false, false) ];
   2407 			}
   2408 
   2409 			both ""
   2410 				#version 310 es
   2411 				precision mediump float;
   2412 				${DECLARATIONS}
   2413 
   2414 				bvec3 func(in mat3[4] x[3])
   2415 				{
   2416 					mat3 x0 = x[0][0];
   2417 					mat3 x1 = x[1][3];
   2418 					mat3 x2 = x[2][0];
   2419 
   2420 					float ret0 = x0[2][0];
   2421 					float ret1 = x1[0][2];
   2422 					float ret2 = x2[1][2];
   2423 
   2424 					return bvec3(ret0, ret1, ret2);
   2425 				}
   2426 
   2427 				void main()
   2428 				{
   2429 					${SETUP}
   2430 
   2431 					mat3 a = mat3(	in0.x, in0.y, in0.z,
   2432 									in0.x, in0.y, in0.z,
   2433 									in0.x, in0.y, in0.z);
   2434 
   2435 					mat3 b = mat3(	in0.z, in0.x, in0.y,
   2436 									in0.z, in0.x, in0.y,
   2437 									in0.z, in0.x, in0.y);
   2438 
   2439 					mat3 c = mat3(	in0.z, in0.z, in0.z,
   2440 									in0.y, in0.y, in0.y,
   2441 									in0.x, in0.x, in0.x);
   2442 
   2443 					mat3 x[3][4] = mat3[3][4] (	mat3[4] (a, b, c, a),
   2444 												mat3[4] (b, c, a, b),
   2445 												mat3[4] (c, a, b, c) );
   2446 
   2447 					out0 = func(x);
   2448 
   2449 					${OUTPUT}
   2450 				}
   2451 			""
   2452 		end
   2453 
   2454 	end # in
   2455 
   2456 	# out
   2457 	group out "Array of arrays as an out-function paramter"
   2458 
   2459 		case float_3x3
   2460 			version 310 es
   2461 			desc "Testing array of arrays as an out-function parameter"
   2462 			values
   2463 			{
   2464 				input vec3 in0 = [ vec3(0.5, 1.0, 2.0) | vec3(7.4, -1.0, 2.0) | vec3(3.0, 1.6, -2.0) ];
   2465 				output vec3 out0 = [ vec3(2.0, -0.5, 1.0) | vec3(2.0, -7.4, -1.0) | vec3(-2.0, -3.0, 1.6) ];
   2466 			}
   2467 
   2468 			both ""
   2469 				#version 310 es
   2470 				precision mediump float;
   2471 				${DECLARATIONS}
   2472 
   2473 				void func(out float[3][3] x, in vec3 p)
   2474 				{
   2475 					x = float[3][3] ( 	float[3] (p.z, 0.0, 0.0),
   2476 										float[3] (0.0, -p.x, 0.0),
   2477 										float[3] (0.0, 0.0, p.y) );
   2478 				}
   2479 
   2480 				void main()
   2481 				{
   2482 					${SETUP}
   2483 					float[3][3] x;
   2484 					func(x, in0);
   2485 					out0 = vec3(x[0][0], x[1][1], x[2][2]);
   2486 					${OUTPUT}
   2487 				}
   2488 			""
   2489 		end
   2490 
   2491 		case int_2x2x2
   2492 			version 310 es
   2493 			desc "Testing array of arrays as an out-function parameter"
   2494 			values
   2495 			{
   2496 				input ivec2 in0 = [ ivec2(4, 1) | ivec2(7, -1) | ivec2(3, 1) ];
   2497 				output ivec2 out0 =	[ ivec2(1, -4) | ivec2(-1, -7) | ivec2(1, -3) ];
   2498 			}
   2499 
   2500 			both ""
   2501 				#version 310 es
   2502 				precision mediump int;
   2503 				precision mediump float;
   2504 				${DECLARATIONS}
   2505 
   2506 				void func(out int[2][2][2] x, in ivec2 p)
   2507 				{
   2508 					x = int[2][2][2] (	int[2][2] (	int[2] (p.y, -p.x),
   2509 													int[2] (0, 0)),
   2510 										int[2][2] (	int[2] (0, 0),
   2511 													int[2] (p.y, -p.x)) );
   2512 				}
   2513 
   2514 				void main()
   2515 				{
   2516 					${SETUP}
   2517 					int[2][2][2] x;
   2518 					func(x, in0);
   2519 					out0 = ivec2(x[0][0][0], x[1][1][1]);
   2520 					${OUTPUT}
   2521 				}
   2522 			""
   2523 		end
   2524 
   2525 		case bool_3x2x3
   2526 			version 310 es
   2527 			desc "Testing array of arrays as an out-function parameter"
   2528 			values
   2529 			{
   2530 				input bvec3 in0 = 	[ bvec3(false, true, true) ];
   2531 				output bvec3 out0 = [ bvec3(true, false, true) ];
   2532 			}
   2533 
   2534 			both ""
   2535 				#version 310 es
   2536 				precision mediump float;
   2537 				${DECLARATIONS}
   2538 
   2539 				void func(out bool x[3][2][3], in bvec3 p)
   2540 				{
   2541 					x = bool[3][2][3] (	bool[2][3] (bool[3] (p.z, p.x, p.y),
   2542 													bool[3] (p.x, p.y, p.z)),
   2543 										bool[2][3] (bool[3] (p.x, p.y, p.z),
   2544 													bool[3] (p.z, p.x, p.y)),
   2545 										bool[2][3] (bool[3] (p.y, p.z, p.x),
   2546 													bool[3] (p.y, p.z, p.x)) );
   2547 				}
   2548 
   2549 				void main()
   2550 				{
   2551 					${SETUP}
   2552 					bool[3] x[3][2];
   2553 					func(x, in0);
   2554 					out0 = bvec3(x[0][0][0], x[1][1][1], x[2][1][0]);
   2555 					${OUTPUT}
   2556 				}
   2557 			""
   2558 		end
   2559 
   2560 		case vec3_2x3
   2561 			version 310 es
   2562 			desc "Testing array of arrays as an out-function parameter"
   2563 			values
   2564 			{
   2565 				input vec3 in0 = 	[ vec3(0.5, 1.0, 2.0) | vec3(-0.5, 11.2, -1.0) ];
   2566 				output vec3 out0 = [ vec3(1.0, 0.5, -2.0) | vec3(11.2, -0.5, 1.0) ];
   2567 			}
   2568 
   2569 			both ""
   2570 				#version 310 es
   2571 				precision mediump float;
   2572 				${DECLARATIONS}
   2573 
   2574 				void func(out vec3[3] x[2], in vec3 p)
   2575 				{
   2576 					x = vec3[2][3](	vec3[3] (vec3(p.x, p.y, -p.z),
   2577 											vec3(p.y, -p.z, p.x),
   2578 											vec3(-p.z, p.x, p.y)),
   2579 									vec3[3] (vec3(p.y, -p.z, p.x),
   2580 											vec3(p.x, p.y, -p.z),
   2581 											vec3(-p.z, p.x, p.y)) );
   2582 
   2583 					x = vec3[2][3] (vec3[3] (x[0][1], x[0][2], x[0][0]),
   2584 									vec3[3] (x[1][1], x[1][2], x[1][0]) );
   2585 				}
   2586 
   2587 				void main()
   2588 				{
   2589 					${SETUP}
   2590 					vec3[2][3] x;
   2591 					func(x, in0);
   2592 					out0 = vec3(x[0][0].x, x[1][1].y, x[0][2].z);
   2593 					${OUTPUT}
   2594 				}
   2595 			""
   2596 		end
   2597 
   2598 		case struct_3x1x3
   2599 			version 310 es
   2600 			desc "Testing array of arrays as an out-function parameter"
   2601 			values
   2602 			{
   2603 				input vec3 in0 = [ vec3(0.5, 1.0, 2.0) ];
   2604 				output vec3 out0 = [ vec3(-1.0, 2.0, 0.5) ];
   2605 			}
   2606 
   2607 			both ""
   2608 				#version 310 es
   2609 				precision mediump float;
   2610 				${DECLARATIONS}
   2611 
   2612 				struct Test
   2613 				{
   2614 					float f;
   2615 					vec3 v;
   2616 				};
   2617 
   2618 				void func(out Test[3] x[3][1], in vec3 p)
   2619 				{
   2620 					Test a = Test(p.z, vec3(p.x, p.y, p.z));
   2621 					Test b = Test(p.y, vec3(-p.z, -p.x, -p.y));
   2622 					Test c = Test(p.x, vec3(-p.y, p.z, -p.x));
   2623 
   2624 					x = Test[3][1][3] (	Test[1][3] (Test[3] (b, b, b)),
   2625 										Test[1][3] (Test[3] (a, a, a)),
   2626 										Test[1][3] (Test[3] (c, c, c)) );
   2627 				}
   2628 
   2629 				void main()
   2630 				{
   2631 					${SETUP}
   2632 					Test x[3][1][3];
   2633 					func(x, in0);
   2634 					out0 = vec3(x[0][0][0].v.z, x[2][0][2].v.y, x[1][0][1].v.x);
   2635 					${OUTPUT}
   2636 				}
   2637 			""
   2638 		end
   2639 
   2640 		case ivec3_3x3
   2641 			version 310 es
   2642 			desc "Testing array of arrays as an out-function parameter"
   2643 			values
   2644 			{
   2645 				input ivec3 in0 = [ ivec3(5, 1, 2) | ivec3(-5, 11, -1) ];
   2646 				output ivec3 out0 = [ ivec3(1, 5, -2) | ivec3(11, -5, 1) ];
   2647 			}
   2648 
   2649 			both ""
   2650 				#version 310 es
   2651 				precision mediump int;
   2652 				precision mediump float;
   2653 				${DECLARATIONS}
   2654 
   2655 				void func(out ivec3 x[3][3], in ivec3 p)
   2656 				{
   2657 					x = ivec3[3][3] (ivec3[3] (	ivec3(p.x, p.y, -p.z),
   2658 												ivec3(p.x, p.y, -p.z),
   2659 												ivec3(p.x, p.y, -p.z)),
   2660 
   2661 									ivec3[3] (	ivec3(p.y, -p.z, p.x),
   2662 												ivec3(p.y, -p.z, p.x),
   2663 												ivec3(p.y, -p.z, p.x)),
   2664 
   2665 									ivec3[3] (	ivec3(-p.z, p.x, p.y),
   2666 												ivec3(-p.z, p.x, p.y),
   2667 												ivec3(-p.z, p.x, p.y)) );
   2668 				}
   2669 
   2670 
   2671 				void main()
   2672 				{
   2673 					${SETUP}
   2674 					ivec3[3][3] x;
   2675 					func(x, in0);
   2676 					out0 = ivec3(x[1][0].x, x[2][0].y, x[0][2].z);
   2677 					${OUTPUT}
   2678 				}
   2679 			""
   2680 		end
   2681 
   2682 		case bvec4_4x2
   2683 			version 310 es
   2684 			desc "Testing array of arrays as an out-function parameter"
   2685 			values
   2686 			{
   2687 				input bvec4 in0 = 	[ bvec4(true, false, false, true) ];
   2688 				output bvec4 out0 = [ bvec4(true, true, false, true) ];
   2689 			}
   2690 
   2691 			both ""
   2692 				#version 310 es
   2693 				precision mediump int;
   2694 				precision mediump float;
   2695 				${DECLARATIONS}
   2696 
   2697 				void func(out bvec4[4][2] x, in bvec4 p)
   2698 				{
   2699 					bvec4[4] a = bvec4[4](	bvec4(p.x, p.y, p.z, p.w),
   2700 											bvec4(p.w, p.y, p.z, p.x),
   2701 											bvec4(p.z, p.w, p.x, p.y),
   2702 											bvec4(p.y, p.x, p.z, p.w) );
   2703 
   2704 					x = bvec4[4][2] (	bvec4[2] (bvec4(a[0]),
   2705 												  bvec4(a[1])),
   2706 
   2707 										bvec4[2] (bvec4(a[2]),
   2708 												  bvec4(a[3])),
   2709 
   2710 										bvec4[2] (bvec4(a[1]),
   2711 												  bvec4(a[2])),
   2712 
   2713 										bvec4[2] (bvec4(a[3]),
   2714 												  bvec4(a[0])) );
   2715 				}
   2716 
   2717 				void main()
   2718 				{
   2719 					${SETUP}
   2720 					bvec4 x[4][2];
   2721 					func(x, in0);
   2722 					out0 = bvec4(x[0][1].x, x[1][0].y, x[2][0].z, x[3][1].w);
   2723 					${OUTPUT}
   2724 				}
   2725 			""
   2726 		end
   2727 
   2728 		case mat3_3x2
   2729 			version 310 es
   2730 			desc "Testing array of arrays as an out-function parameter"
   2731 			values
   2732 			{
   2733 				input vec3 in0 = [ vec3(0.5, 1.0, 2.0) | vec3(-1.5, 0.0, -2.3) ];
   2734 				output vec3 out0 = [ vec3(0.5, -1.0, 1.0) | vec3(-1.5, 0.0, 0.0) ];
   2735 			}
   2736 
   2737 			both ""
   2738 				#version 310 es
   2739 				precision mediump float;
   2740 				${DECLARATIONS}
   2741 
   2742 				void func(out mat3[2] x[3], in vec3 p)
   2743 				{
   2744 					mat3 a = mat3(	p.x, p.y, p.z,
   2745 									p.x, p.y, p.z,
   2746 									p.x, p.y, p.z);
   2747 
   2748 					mat3 b = mat3(	p.z, p.x, -p.y,
   2749 									p.z, p.x, -p.y,
   2750 									p.z, p.x, -p.y);
   2751 
   2752 					mat3 c = mat3 (	-p.z, -p.z, p.z,
   2753 									-p.y, -p.y, p.y,
   2754 									-p.x, -p.x, p.x);
   2755 
   2756 					x = mat3[3][2] (mat3[2] (a, b),
   2757 									mat3[2] (c, a),
   2758 									mat3[2] (b, c) );
   2759 				}
   2760 
   2761 				void main()
   2762 				{
   2763 					${SETUP}
   2764 
   2765 					mat3[3][2] x;
   2766 					func(x, in0);
   2767 
   2768 					mat3 a0 = x[0][0];
   2769 					mat3 a1 = x[0][1];
   2770 					mat3 a2 = x[2][1];
   2771 
   2772 					float ret0 = a0[2][0];
   2773 					float ret1 = a1[0][2];
   2774 					float ret2 = a2[1][2];
   2775 
   2776 					out0 = vec3(ret0, ret1, ret2);
   2777 
   2778 					${OUTPUT}
   2779 				}
   2780 			""
   2781 		end
   2782 
   2783 		case mat3_3x3x3
   2784 			version 310 es
   2785 			desc "Testing array of arrays as an out-function parameter"
   2786 			values
   2787 			{
   2788 				input ivec3 in0 = [ ivec3(0, 1, 2) | ivec3(-1, 0, -2) ];
   2789 				output ivec3 out0 = [ ivec3(0, -1, 1) | ivec3(-1, 0, 0) ];
   2790 			}
   2791 
   2792 			both ""
   2793 				#version 310 es
   2794 				precision mediump int;
   2795 				precision mediump float;
   2796 				${DECLARATIONS}
   2797 
   2798 				void func(out mat3[3] x[3][3], in ivec3 p)
   2799 				{
   2800 					mat3 a = mat3(	p.x, p.y, p.z,
   2801 									p.x, p.y, p.z,
   2802 									p.x, p.y, p.z);
   2803 					mat3 b = mat3(	p.z, p.x, -p.y,
   2804 									p.z, p.x, -p.y,
   2805 									p.z, p.x, -p.y);
   2806 					mat3 c = mat3(	-p.z, -p.z, p.z,
   2807 									-p.y, -p.y, p.y,
   2808 									-p.x, -p.x, p.x);
   2809 
   2810 					x = mat3[3][3][3] (	mat3[3][3] (mat3[3] (a, a, a),
   2811 													mat3[3] (b, b, b),
   2812 													mat3[3] (c, c, c)),
   2813 
   2814 										mat3[3][3] (mat3[3] (b, b, b),
   2815 													mat3[3] (a, a, a),
   2816 													mat3[3] (c, c, c)),
   2817 
   2818 										mat3[3][3] (mat3[3] (c, c, c),
   2819 													mat3[3] (a, a, a),
   2820 													mat3[3] (b, b, b)) );
   2821 				}
   2822 
   2823 				void main()
   2824 				{
   2825 					${SETUP}
   2826 
   2827 					mat3 x[3][3][3];
   2828 					func(x, in0);
   2829 
   2830 					mat3 x0 = x[0][0][0];
   2831 					mat3 x1 = x[1][0][0];
   2832 					mat3 x2 = x[2][0][0];
   2833 
   2834 					float ret0 = x0[2][0];
   2835 					float ret1 = x1[0][2];
   2836 					float ret2 = x2[1][2];
   2837 
   2838 					out0 = ivec3(ret0, ret1, ret2);
   2839 
   2840 					${OUTPUT}
   2841 				}
   2842 			""
   2843 		end
   2844 
   2845 		case mat3_3x4
   2846 			version 310 es
   2847 			desc "Testing array of arrays as an out-function parameter"
   2848 			values
   2849 			{
   2850 				input bvec3 in0 = [ bvec3(true, false, true) ];
   2851 				output bvec3 out0 = [ bvec3(true, false, false) ];
   2852 			}
   2853 
   2854 			both ""
   2855 				#version 310 es
   2856 				precision mediump float;
   2857 				${DECLARATIONS}
   2858 
   2859 				void func(out mat3[4] x[3], in bvec3 p)
   2860 				{
   2861 					mat3 a = mat3(	p.x, p.y, p.z,
   2862 									p.x, p.y, p.z,
   2863 									p.x, p.y, p.z);
   2864 
   2865 					mat3 b = mat3(	p.z, p.x, p.y,
   2866 									p.z, p.x, p.y,
   2867 									p.z, p.x, p.y);
   2868 
   2869 					mat3 c = mat3(	p.z, p.z, p.z,
   2870 									p.y, p.y, p.y,
   2871 									p.x, p.x, p.x);
   2872 
   2873 					x = mat3[3][4] (mat3[4] (a, b, c, a),
   2874 									mat3[4] (b, c, a, b),
   2875 									mat3[4] (c, a, b, c) );
   2876 				}
   2877 
   2878 				void main()
   2879 				{
   2880 					${SETUP}
   2881 
   2882 					mat3 x[3][4];
   2883 					func(x, in0);
   2884 
   2885 					mat3 x0 = x[0][0];
   2886 					mat3 x1 = x[1][3];
   2887 					mat3 x2 = x[2][0];
   2888 
   2889 					float ret0 = x0[2][0];
   2890 					float ret1 = x1[0][2];
   2891 					float ret2 = x2[1][2];
   2892 
   2893 					out0 = bvec3(ret0, ret1, ret2);
   2894 
   2895 					${OUTPUT}
   2896 				}
   2897 			""
   2898 		end
   2899 
   2900 	end # out
   2901 
   2902 	group unnamed "Array of arrays as unnamed parameter of a function prototype"
   2903 
   2904 		case float_3x3
   2905 			version 310 es
   2906 			desc "Testing array of arrays as unnamed parameter of a function prototype"
   2907 			values
   2908 			{
   2909 				input vec3 in0 = [ vec3(0.5, 1.0, 2.0) | vec3(7.4, -1.0, 2.0) | vec3(3.0, 1.6, -2.0) ];
   2910 				output vec3 out0 = [ vec3(2.0, -0.5, 1.0) | vec3(2.0, -7.4, -1.0) | vec3(-2.0, -3.0, 1.6) ];
   2911 			}
   2912 
   2913 			both ""
   2914 				#version 310 es
   2915 				precision mediump float;
   2916 				${DECLARATIONS}
   2917 
   2918 				vec3 func(in float[3][3]);
   2919 
   2920 				void main()
   2921 				{
   2922 					${SETUP}
   2923 					float[3][3] x = float[3][3] (	float[3] (in0.z, 0.0, 0.0),
   2924 													float[3] (0.0, -in0.x, 0.0),
   2925 													float[3] (0.0, 0.0, in0.y) );
   2926 					out0 = func(x);
   2927 					${OUTPUT}
   2928 				}
   2929 
   2930 				vec3 func(in float[3][3] x)
   2931 				{
   2932 					return vec3(x[0][0], x[1][1], x[2][2]);
   2933 				}
   2934 			""
   2935 		end
   2936 
   2937 		case int_2x2x2
   2938 			version 310 es
   2939 			desc "Testing array of arrays as unnamed parameter of a function prototype"
   2940 			values
   2941 			{
   2942 				input ivec2 in0 = [ ivec2(4, 1) | ivec2(7, -1) | ivec2(3, 1) ];
   2943 				output ivec2 out0 =	[ ivec2(1, -4) | ivec2(-1, -7) | ivec2(1, -3) ];
   2944 			}
   2945 
   2946 			both ""
   2947 				#version 310 es
   2948 				precision mediump int;
   2949 				precision mediump float;
   2950 				${DECLARATIONS}
   2951 
   2952 				ivec2 func(in int[2][2][2]);
   2953 
   2954 				void main()
   2955 				{
   2956 					${SETUP}
   2957 					int[2][2][2] x = int[2][2][2] (	int[2][2] (	int[2] (in0.y, -in0.x),
   2958 																int[2] (0, 0)),
   2959 													int[2][2] (	int[2] (0, 0),
   2960 																int[2] (in0.y, -in0.x)) );
   2961 					out0 = func(x);
   2962 					${OUTPUT}
   2963 				}
   2964 
   2965 				ivec2 func(in int[2][2][2] x)
   2966 				{
   2967 					return ivec2(x[0][0][0], x[1][1][1]);
   2968 				}
   2969 
   2970 			""
   2971 		end
   2972 
   2973 		case bool_3x2x3
   2974 			version 310 es
   2975 			desc "Testing array of arrays as unnamed parameter of a function prototype"
   2976 			values
   2977 			{
   2978 				input bvec3 in0 = 	[ bvec3(false, true, true) ];
   2979 				output bvec3 out0 = [ bvec3(true, false, true) ];
   2980 			}
   2981 
   2982 			both ""
   2983 				#version 310 es
   2984 				precision mediump float;
   2985 				${DECLARATIONS}
   2986 
   2987 				bvec3 func(in bool[3][2][3]);
   2988 
   2989 				void main()
   2990 				{
   2991 					${SETUP}
   2992 					bool[3] x[3][2] = bool[3][2][3] (	bool[2][3] (bool[3] (in0.z, in0.x, in0.y),
   2993 																	bool[3] (in0.x, in0.y, in0.z)),
   2994 														bool[2][3] (bool[3] (in0.x, in0.y, in0.z),
   2995 																	bool[3] (in0.z, in0.x, in0.y)),
   2996 														bool[2][3] (bool[3] (in0.y, in0.z, in0.x),
   2997 																	bool[3] (in0.y, in0.z, in0.x)) );
   2998 					out0 = func(x);
   2999 					${OUTPUT}
   3000 				}
   3001 
   3002 				bvec3 func(in bool x[3][2][3])
   3003 				{
   3004 					return bvec3(x[0][0][0], x[1][1][1], x[2][1][0]);
   3005 				}
   3006 			""
   3007 		end
   3008 
   3009 		case vec3_2x3
   3010 			version 310 es
   3011 			desc "Testing array of arrays as unnamed parameter of a function prototype"
   3012 			values
   3013 			{
   3014 				input vec3 in0 = 	[ vec3(0.5, 1.0, 2.0) | vec3(-0.5, 11.2, -1.0) ];
   3015 				output vec3 out0 = [ vec3(1.0, 0.5, -2.0) | vec3(11.2, -0.5, 1.0) ];
   3016 			}
   3017 
   3018 			both ""
   3019 				#version 310 es
   3020 				precision mediump float;
   3021 				${DECLARATIONS}
   3022 
   3023 				vec3 func(in vec3[2][3]);
   3024 
   3025 				void main()
   3026 				{
   3027 					${SETUP}
   3028 					vec3[2][3] x = vec3[2][3](	vec3[3] (	vec3(in0.x, in0.y, -in0.z),
   3029 															vec3(in0.y, -in0.z, in0.x),
   3030 															vec3(-in0.z, in0.x, in0.y)),
   3031 												vec3[3] (	vec3(in0.y, -in0.z, in0.x),
   3032 															vec3(in0.x, in0.y, -in0.z),
   3033 															vec3(-in0.z, in0.x, in0.y)) );
   3034 
   3035 					x = vec3[2][3] (vec3[3] (x[0][1], x[0][2], x[0][0]),
   3036 									vec3[3] (x[1][1], x[1][2], x[1][0]) );
   3037 					out0 = func(x);
   3038 					${OUTPUT}
   3039 				}
   3040 
   3041 				vec3 func(in vec3[3] x[2])
   3042 				{
   3043 					return vec3(x[0][0].x, x[1][1].y, x[0][2].z);
   3044 				}
   3045 			""
   3046 		end
   3047 
   3048 		case struct_3x1x3
   3049 			version 310 es
   3050 			desc "Testing array of arrays as unnamed parameter of a function prototype"
   3051 			values
   3052 			{
   3053 				input vec3 in0 = [ vec3(0.5, 1.0, 2.0) ];
   3054 				output vec3 out0 = [ vec3(-1.0, 2.0, 0.5) ];
   3055 			}
   3056 
   3057 			both ""
   3058 				#version 310 es
   3059 				precision mediump float;
   3060 				${DECLARATIONS}
   3061 
   3062 				struct Test
   3063 				{
   3064 					float f;
   3065 					vec3 v;
   3066 				};
   3067 
   3068 				vec3 func(in Test[3] x[3][1])
   3069 				{
   3070 					return vec3(x[0][0][0].v.z, x[2][0][2].v.y, x[1][0][1].v.x);
   3071 				}
   3072 
   3073 				void main()
   3074 				{
   3075 					${SETUP}
   3076 					Test a = Test(in0.z, vec3(in0.x, in0.y, in0.z));
   3077 					Test b = Test(in0.y, vec3(-in0.z, -in0.x, -in0.y));
   3078 					Test c = Test(in0.x, vec3(-in0.y, in0.z, -in0.x));
   3079 
   3080 					Test x[3][1][3] = Test[3][1][3] (	Test[1][3] (Test[3] (b, b, b)),
   3081 														Test[1][3] (Test[3] (a, a, a)),
   3082 														Test[1][3] (Test[3] (c, c, c)) );
   3083 
   3084 					out0 = func(x);
   3085 					${OUTPUT}
   3086 				}
   3087 			""
   3088 		end
   3089 
   3090 		case ivec3_3x3
   3091 			version 310 es
   3092 			desc "Testing array of arrays as unnamed parameter of a function prototype"
   3093 			values
   3094 			{
   3095 				input ivec3 in0 = [ ivec3(5, 1, 2) | ivec3(-5, 11, -1) ];
   3096 				output ivec3 out0 = [ ivec3(1, 5, -2) | ivec3(11, -5, 1) ];
   3097 			}
   3098 
   3099 			both ""
   3100 				#version 310 es
   3101 				precision mediump int;
   3102 				precision mediump float;
   3103 				${DECLARATIONS}
   3104 
   3105 				ivec3 func(in ivec3[3][3]);
   3106 
   3107 				void main()
   3108 				{
   3109 					${SETUP}
   3110 					ivec3[3][3] x = ivec3[3][3] (	ivec3[3] (	ivec3(in0.x, in0.y, -in0.z),
   3111 																ivec3(in0.x, in0.y, -in0.z),
   3112 																ivec3(in0.x, in0.y, -in0.z)),
   3113 
   3114 													ivec3[3] (	ivec3(in0.y, -in0.z, in0.x),
   3115 																ivec3(in0.y, -in0.z, in0.x),
   3116 																ivec3(in0.y, -in0.z, in0.x)),
   3117 
   3118 													ivec3[3] (	ivec3(-in0.z, in0.x, in0.y),
   3119 																ivec3(-in0.z, in0.x, in0.y),
   3120 																ivec3(-in0.z, in0.x, in0.y)) );
   3121 					out0 = func(x);
   3122 					${OUTPUT}
   3123 				}
   3124 
   3125 				ivec3 func(in ivec3 x[3][3])
   3126 				{
   3127 					return ivec3(x[1][0].x, x[2][0].y, x[0][2].z);
   3128 				}
   3129 
   3130 			""
   3131 		end
   3132 
   3133 		case bvec4_4x2
   3134 			version 310 es
   3135 			desc "Testing array of arrays as unnamed parameter of a function prototype"
   3136 			values
   3137 			{
   3138 				input bvec4 in0 = 	[ bvec4(true, false, false, true) ];
   3139 				output bvec4 out0 = [ bvec4(true, true, false, true) ];
   3140 			}
   3141 
   3142 			both ""
   3143 				#version 310 es
   3144 				precision mediump int;
   3145 				precision mediump float;
   3146 				${DECLARATIONS}
   3147 
   3148 				bvec4 func(in bvec4[4][2]);
   3149 
   3150 				void main()
   3151 				{
   3152 					${SETUP}
   3153 					bvec4[4] a = bvec4[4](	bvec4(in0.x, in0.y, in0.z, in0.w),
   3154 											bvec4(in0.w, in0.y, in0.z, in0.x),
   3155 											bvec4(in0.z, in0.w, in0.x, in0.y),
   3156 											bvec4(in0.y, in0.x, in0.z, in0.w) );
   3157 
   3158 					bvec4 x[4][2] = bvec4[4][2] (	bvec4[2] (bvec4(a[0]),
   3159 															  bvec4(a[1])),
   3160 
   3161 													bvec4[2] (bvec4(a[2]),
   3162 															  bvec4(a[3])),
   3163 
   3164 													bvec4[2] (bvec4(a[1]),
   3165 															  bvec4(a[2])),
   3166 
   3167 													bvec4[2] (bvec4(a[3]),
   3168 															  bvec4(a[0])) );
   3169 
   3170 					out0 = func(x);
   3171 					${OUTPUT}
   3172 				}
   3173 
   3174 				bvec4 func(in bvec4[4][2] x)
   3175 				{
   3176 					return bvec4(x[0][1].x, x[1][0].y, x[2][0].z, x[3][1].w);
   3177 				}
   3178 			""
   3179 		end
   3180 
   3181 		case mat3_3x2
   3182 			version 310 es
   3183 			desc "Testing array of arrays as unnamed parameter of a function prototype"
   3184 			values
   3185 			{
   3186 				input vec3 in0 = [ vec3(0.5, 1.0, 2.0) | vec3(-1.5, 0.0, -2.3) ];
   3187 				output vec3 out0 = [ vec3(0.5, -1.0, 1.0) | vec3(-1.5, 0.0, 0.0) ];
   3188 			}
   3189 
   3190 			both ""
   3191 				#version 310 es
   3192 				precision mediump float;
   3193 				${DECLARATIONS}
   3194 
   3195 				vec3 func(in mat3[3][2]);
   3196 
   3197 				void main()
   3198 				{
   3199 					${SETUP}
   3200 
   3201 					mat3 a = mat3(	in0.x, in0.y, in0.z,
   3202 									in0.x, in0.y, in0.z,
   3203 									in0.x, in0.y, in0.z);
   3204 
   3205 					mat3 b = mat3(	in0.z, in0.x, -in0.y,
   3206 									in0.z, in0.x, -in0.y,
   3207 									in0.z, in0.x, -in0.y);
   3208 
   3209 					mat3 c = mat3 (	-in0.z, -in0.z, in0.z,
   3210 									-in0.y, -in0.y, in0.y,
   3211 									-in0.x, -in0.x, in0.x);
   3212 
   3213 					mat3[3][2] x = mat3[3][2] (	mat3[2] (a, b),
   3214 												mat3[2] (c, a),
   3215 												mat3[2] (b, c) );
   3216 
   3217 					out0 = func(x);
   3218 					${OUTPUT}
   3219 				}
   3220 
   3221 				vec3 func(in mat3[2] x[3])
   3222 				{
   3223 					mat3 a0 = x[0][0];
   3224 					mat3 a1 = x[0][1];
   3225 					mat3 a2 = x[2][1];
   3226 
   3227 					float ret0 = a0[2][0];
   3228 					float ret1 = a1[0][2];
   3229 					float ret2 = a2[1][2];
   3230 
   3231 					return vec3(ret0, ret1, ret2);
   3232 				}
   3233 			""
   3234 		end
   3235 
   3236 		case mat3_3x3x3
   3237 			version 310 es
   3238 			desc "Testing array of arrays as unnamed parameter of a function prototype"
   3239 			values
   3240 			{
   3241 				input ivec3 in0 = [ ivec3(0, 1, 2) | ivec3(-1, 0, -2) ];
   3242 				output ivec3 out0 = [ ivec3(0, -1, 1) | ivec3(-1, 0, 0) ];
   3243 			}
   3244 
   3245 			both ""
   3246 				#version 310 es
   3247 				precision mediump int;
   3248 				precision mediump float;
   3249 				${DECLARATIONS}
   3250 
   3251 				ivec3 func(in mat3[3][3][3]);
   3252 
   3253 				void main()
   3254 				{
   3255 					${SETUP}
   3256 
   3257 					mat3 a = mat3(	in0.x, in0.y, in0.z,
   3258 									in0.x, in0.y, in0.z,
   3259 									in0.x, in0.y, in0.z);
   3260 					mat3 b = mat3(	in0.z, in0.x, -in0.y,
   3261 									in0.z, in0.x, -in0.y,
   3262 									in0.z, in0.x, -in0.y);
   3263 					mat3 c = mat3(	-in0.z, -in0.z, in0.z,
   3264 									-in0.y, -in0.y, in0.y,
   3265 									-in0.x, -in0.x, in0.x);
   3266 
   3267 					mat3 x[3][3][3] = mat3[3][3][3] (mat3[3][3] (mat3[3] (a, a, a),
   3268 																mat3[3] (b, b, b),
   3269 																mat3[3] (c, c, c)),
   3270 
   3271 													mat3[3][3] (mat3[3] (b, b, b),
   3272 																mat3[3] (a, a, a),
   3273 																mat3[3] (c, c, c)),
   3274 
   3275 													mat3[3][3] (mat3[3] (c, c, c),
   3276 																mat3[3] (a, a, a),
   3277 																mat3[3] (b, b, b)) );
   3278 
   3279 					out0 = func(x);
   3280 					${OUTPUT}
   3281 				}
   3282 
   3283 				ivec3 func(in mat3[3][3] x[3])
   3284 				{
   3285 					mat3 x0 = x[0][0][0];
   3286 					mat3 x1 = x[1][0][0];
   3287 					mat3 x2 = x[2][0][0];
   3288 
   3289 					float ret0 = x0[2][0];
   3290 					float ret1 = x1[0][2];
   3291 					float ret2 = x2[1][2];
   3292 
   3293 					return ivec3(ret0, ret1, ret2);
   3294 				}
   3295 			""
   3296 		end
   3297 
   3298 		case mat3_3x4
   3299 			version 310 es
   3300 			desc "Testing array of arrays as unnamed parameter of a function prototype"
   3301 			values
   3302 			{
   3303 				input bvec3 in0 = [ bvec3(true, false, true) ];
   3304 				output bvec3 out0 = [ bvec3(true, false, false) ];
   3305 			}
   3306 
   3307 			both ""
   3308 				#version 310 es
   3309 				precision mediump float;
   3310 				${DECLARATIONS}
   3311 
   3312 				bvec3 func(in mat3[3][4]);
   3313 
   3314 				void main()
   3315 				{
   3316 					${SETUP}
   3317 
   3318 					mat3 a = mat3(	in0.x, in0.y, in0.z,
   3319 									in0.x, in0.y, in0.z,
   3320 									in0.x, in0.y, in0.z);
   3321 
   3322 					mat3 b = mat3(	in0.z, in0.x, in0.y,
   3323 									in0.z, in0.x, in0.y,
   3324 									in0.z, in0.x, in0.y);
   3325 
   3326 					mat3 c = mat3(	in0.z, in0.z, in0.z,
   3327 									in0.y, in0.y, in0.y,
   3328 									in0.x, in0.x, in0.x);
   3329 
   3330 					mat3 x[3][4] = mat3[3][4] (	mat3[4] (a, b, c, a),
   3331 												mat3[4] (b, c, a, b),
   3332 												mat3[4] (c, a, b, c) );
   3333 
   3334 					out0 = func(x);
   3335 
   3336 					${OUTPUT}
   3337 				}
   3338 
   3339 				bvec3 func(in mat3[4] x[3])
   3340 				{
   3341 					mat3 x0 = x[0][0];
   3342 					mat3 x1 = x[1][3];
   3343 					mat3 x2 = x[2][0];
   3344 
   3345 					float ret0 = x0[2][0];
   3346 					float ret1 = x1[0][2];
   3347 					float ret2 = x2[1][2];
   3348 
   3349 					return bvec3(ret0, ret1, ret2);
   3350 				}
   3351 			""
   3352 		end
   3353 
   3354 	end # unnamed_parameter
   3355 
   3356 end # parameter
   3357 
   3358 group implicit_size "Declaring arrays of arrays with implicit size"
   3359 
   3360 	case float_3x3
   3361 		version 310 es
   3362 		desc "Testing declaring arrays of arrays with implicit size"
   3363 		values
   3364 		{
   3365 			input vec3 in0 = [ vec3(0.5, 1.0, 2.0) | vec3(7.4, -1.0, 2.0) | vec3(3.0, 1.6, -2.0) ];
   3366 			output vec3 out0 = [ vec3(2.0, 0.5, 1.0) | vec3(2.0, 7.4, -1.0) | vec3(-2.0, 3.0, 1.6) ];
   3367 		}
   3368 
   3369 		both ""
   3370 			#version 310 es
   3371 			precision mediump float;
   3372 			${DECLARATIONS}
   3373 
   3374 			void main()
   3375 			{
   3376 				${SETUP}
   3377 				float x[][] = float[][] ( 	float[] (in0.z, in0.x, in0.y),
   3378 											float[] (in0.z, in0.x, in0.y),
   3379 											float[] (in0.z, in0.x, in0.y) );
   3380 
   3381 				out0 = vec3(x[0][0], x[1][1], x[2][2]);
   3382 				${OUTPUT}
   3383 			}
   3384 		""
   3385 	end
   3386 
   3387 	case int_2x3
   3388 		version 310 es
   3389 		desc "Testing declaring arrays of arrays with implicit size"
   3390 		values
   3391 		{
   3392 			input ivec3 in0 = [ ivec3(0, 1, 2) | ivec3(7, -1, 2) | ivec3(3, 1, -2) ];
   3393 			output ivec3 out0 = [ ivec3(2, 0, 1) | ivec3(2, 7, -1) | ivec3(-2, 3, 1) ];
   3394 		}
   3395 
   3396 		both ""
   3397 			#version 310 es
   3398 			precision mediump int;
   3399 			precision mediump float;
   3400 			${DECLARATIONS}
   3401 
   3402 			void main()
   3403 			{
   3404 				${SETUP}
   3405 				int[][] x = int[][] ( 	int[] (in0.z, in0.x, in0.y),
   3406 										int[] (in0.z, in0.x, in0.y) );;
   3407 
   3408 				out0 = ivec3(x[0][0], x[1][1], x[0][2]);
   3409 				${OUTPUT}
   3410 			}
   3411 		""
   3412 	end
   3413 
   3414 	case bool_3x3x3
   3415 		version 310 es
   3416 		desc "Testing declaring arrays of arrays with implicit size"
   3417 		values
   3418 		{
   3419 			input bvec3 in0 = [ bvec3(false, true, true) ];
   3420 			output bvec3 out0 = [ bvec3(true, false, true) ];
   3421 		}
   3422 
   3423 		both ""
   3424 			#version 310 es
   3425 			precision mediump float;
   3426 			${DECLARATIONS}
   3427 
   3428 			void main()
   3429 			{
   3430 				${SETUP}
   3431 				bool[][] x[] = bool[][][] ( bool[][] (	bool[](in0.z, in0.z, in0.z),
   3432 														bool[](in0.z, in0.z, in0.z),
   3433 														bool[](in0.z, in0.z, in0.z)),
   3434 
   3435 											bool[][] (	bool[](in0.x, in0.x, in0.x),
   3436 														bool[](in0.x, in0.x, in0.x),
   3437 														bool[](in0.x, in0.x, in0.x)),
   3438 
   3439 											bool[][] (	bool[](in0.y, in0.y, in0.y),
   3440 														bool[](in0.y, in0.y, in0.y),
   3441 														bool[](in0.y, in0.y, in0.y)) );
   3442 
   3443 				out0 = bvec3(x[0][0][0], x[1][1][1], x[2][2][2]);
   3444 				${OUTPUT}
   3445 			}
   3446 		""
   3447 	end
   3448 
   3449 	case struct_5x5x4
   3450 		version 310 es
   3451 		desc "Testing declaring arrays of arrays with implicit size"
   3452 		values
   3453 		{
   3454 			input vec3 in0 = [ vec3(0.5, 1.0, 2.0) ];
   3455 			output vec3 out0 = [ vec3(-1.0, -0.5, 2.0) ];
   3456 		}
   3457 
   3458 		both ""
   3459 			#version 310 es
   3460 			precision mediump float;
   3461 			${DECLARATIONS}
   3462 
   3463 			struct Test
   3464 			{
   3465 				float f;
   3466 				vec3 v;
   3467 			};
   3468 
   3469 			void main()
   3470 			{
   3471 				${SETUP}
   3472 
   3473 				Test a = Test(in0.z, vec3(in0.x, in0.y, in0.z));
   3474 				Test b = Test(in0.y, vec3(-in0.z, -in0.x, -in0.y));
   3475 				Test c = Test(in0.x, vec3(-in0.y, in0.z, -in0.x));
   3476 
   3477 				Test[] x[][] = Test[][][] (	Test[][] (	Test[] (c, c, c, c),
   3478 														Test[] (b, b, b, b),
   3479 														Test[] (a, a, a, a),
   3480 														Test[] (c, c, c, c),
   3481 														Test[] (b, b, b, b) ),
   3482 
   3483 											Test[][] (	Test[] (a, a, a, a),
   3484 														Test[] (b, b, b, b),
   3485 														Test[] (c, c, c, c),
   3486 														Test[] (a, a, a, a),
   3487 														Test[] (b, b, b, b) ),
   3488 
   3489 											Test[][] (	Test[] (b, b, b, b),
   3490 														Test[] (c, c, c, c),
   3491 														Test[] (a, a, a, a),
   3492 														Test[] (b, b, b, b),
   3493 														Test[] (c, c, c, c) ),
   3494 
   3495 											Test[][] (	Test[] (c, c, c, c),
   3496 														Test[] (b, b, b, b),
   3497 														Test[] (a, a, a, a),
   3498 														Test[] (c, c, c, c),
   3499 														Test[] (b, b, b, b) ),
   3500 
   3501 											Test[][] (	Test[] (a, a, a, a),
   3502 														Test[] (b, b, b, b),
   3503 														Test[] (c, c, c, c),
   3504 														Test[] (a, a, a, a),
   3505 														Test[] (b, b, b, b) ) );
   3506 
   3507 				out0 = vec3(x[0][0][0].v.x, x[1][1][1].v.y, x[4][3][3].v.z);
   3508 				${OUTPUT}
   3509 			}
   3510 		""
   3511 	end
   3512 
   3513 	case vec3_1x3
   3514 		version 310 es
   3515 		desc "Testing declaring arrays of arrays with implicit size"
   3516 		values
   3517 		{
   3518 			input vec3 in0 = 	[ vec3(0.5, 1.0, 2.0) | vec3(-0.5, 11.2, -1.0) ];
   3519 			output vec3 out0 = [ vec3(0.5, -2.0, 1.0) | vec3(-0.5, 1.0, 11.2) ];
   3520 		}
   3521 
   3522 		both ""
   3523 			#version 310 es
   3524 			precision mediump float;
   3525 			${DECLARATIONS}
   3526 
   3527 			void main()
   3528 			{
   3529 				${SETUP}
   3530 				vec3 x[][] = vec3[][] (	vec3[] (vec3(in0.x, in0.y, -in0.z)	,
   3531 												vec3(in0.y, -in0.z, in0.x)	,
   3532 												vec3(-in0.z, in0.x, in0.y)) );
   3533 
   3534 				out0 = vec3(x[0][0].x, x[0][1].y, x[0][2].z);
   3535 				${OUTPUT}
   3536 			}
   3537 		""
   3538 	end
   3539 
   3540 	case ivec3_3x1x3
   3541 		version 310 es
   3542 		desc "Testing declaring arrays of arrays with implicit size"
   3543 		values
   3544 		{
   3545 			input ivec3 in0 = 	[ ivec3(0, 1, 2) | ivec3(5, 11, -1) ];
   3546 			output ivec3 out0 = [ ivec3(0, -2, 1) | ivec3(5, 1, 11) ];
   3547 		}
   3548 
   3549 		both ""
   3550 			#version 310 es
   3551 			precision mediump int;
   3552 			precision mediump float;
   3553 			${DECLARATIONS}
   3554 
   3555 			void main()
   3556 			{
   3557 				${SETUP}
   3558 				ivec3[][][] x = ivec3[][][] (	ivec3[][] (	ivec3[] (	ivec3(in0.x, in0.y, -in0.z),
   3559 																		ivec3(0.0, 0.0, 0.0),
   3560 																		ivec3(0.0, 0.0, 0.0)) ),
   3561 
   3562 												ivec3[][] ( ivec3[] (	ivec3(0.0, 0.0, 0.0),
   3563 																		ivec3(in0.y, -in0.z, in0.x),
   3564 																		ivec3(0.0, 0.0, 0.0)) ),
   3565 
   3566 												ivec3[][] (	ivec3[] (	ivec3(0.0, 0.0, 0.0),
   3567 																		ivec3(0.0, 0.0, 0.0),
   3568 																		ivec3(-in0.z, in0.x, in0.y)) ) );
   3569 
   3570 				out0 = ivec3(x[0][0][0].x, x[1][0][1].y, x[2][0][2].z);
   3571 				${OUTPUT}
   3572 			}
   3573 		""
   3574 	end
   3575 
   3576 	case bvec3_3x1
   3577 		version 310 es
   3578 		desc "Testing declaring arrays of arrays with implicit size"
   3579 		values
   3580 		{
   3581 			input bvec3 in0 = 	[ bvec3(true, false, true) ];
   3582 			output bvec3 out0 = [ bvec3(true, true, false) ];
   3583 		}
   3584 
   3585 		both ""
   3586 			#version 310 es
   3587 			precision mediump float;
   3588 			${DECLARATIONS}
   3589 
   3590 			void main()
   3591 			{
   3592 				${SETUP}
   3593 				bvec3[][] x = bvec3[][] (	bvec3[] ( bvec3(in0.x, in0.y, in0.z)),
   3594 											bvec3[] ( bvec3(in0.y, in0.z, in0.x)),
   3595 											bvec3[] ( bvec3(in0.z, in0.x, in0.y)) );
   3596 
   3597 				out0 = bvec3(x[0][0].x, x[1][0].y, x[2][0].z);
   3598 				${OUTPUT}
   3599 			}
   3600 		""
   3601 	end
   3602 
   3603 	case mat3_3x2
   3604 		version 310 es
   3605 		desc "Testing declaring arrays of arrays with implicit size"
   3606 		values
   3607 		{
   3608 			input vec3 in0 = [ vec3(0.5, 1.0, 2.0) | vec3(-1.5, 0.0, -2.3) ];
   3609 			output vec3 out0 = [ vec3(0.5, -1.0, 1.0) | vec3(-1.5, 0.0, 0.0) ];
   3610 		}
   3611 
   3612 		both ""
   3613 			#version 310 es
   3614 			precision mediump float;
   3615 			${DECLARATIONS}
   3616 
   3617 			void main()
   3618 			{
   3619 				${SETUP}
   3620 				mat3[][] a = mat3[][] (	mat3[] ( mat3(	in0.x, in0.y, in0.z,
   3621 														in0.x, in0.y, in0.z,
   3622 														in0.x, in0.y, in0.z),
   3623 												 mat3(	in0.z, in0.x, -in0.y,
   3624 														in0.z, in0.x, -in0.y,
   3625 														in0.z, in0.x, -in0.y)),
   3626 
   3627 										mat3[] ( mat3(	-in0.z, -in0.z, in0.z,
   3628 														-in0.y, -in0.y, in0.y,
   3629 														-in0.x, -in0.x, in0.x),
   3630 												 mat3(	in0.x, in0.y, in0.z,
   3631 														in0.x, in0.y, in0.z,
   3632 														in0.x, in0.y, in0.z)),
   3633 
   3634 										mat3[] ( mat3(	in0.z, in0.x, -in0.y,
   3635 														in0.z, in0.x, -in0.y,
   3636 														in0.z, in0.x, -in0.y),
   3637 												 mat3(	-in0.z, -in0.z, in0.z,
   3638 														-in0.y, -in0.y, in0.y,
   3639 														-in0.x, -in0.x, in0.x)) );
   3640 
   3641 				mat3 a0 = a[0][0];
   3642 				mat3 a1 = a[0][1];
   3643 				mat3 a2 = a[2][1];
   3644 
   3645 				float ret0 = a0[2][0];
   3646 				float ret1 = a1[0][2];
   3647 				float ret2 = a2[1][2];
   3648 
   3649 				out0 = vec3(ret0, ret1, ret2);
   3650 				${OUTPUT}
   3651 			}
   3652 		""
   3653 	end
   3654 
   3655 	case mat3_3x3x3
   3656 		version 310 es
   3657 		desc "Testing declaring arrays of arrays with implicit size"
   3658 		values
   3659 		{
   3660 			input ivec3 in0 = [ ivec3(0, 1, 2) | ivec3(-1, 0, -2) ];
   3661 			output ivec3 out0 = [ ivec3(0, -1, 1) | ivec3(-1, 0, 0) ];
   3662 		}
   3663 
   3664 		both ""
   3665 			#version 310 es
   3666 			precision mediump int;
   3667 			precision mediump float;
   3668 			${DECLARATIONS}
   3669 
   3670 			void main()
   3671 			{
   3672 				${SETUP}
   3673 
   3674 				mat3 a = mat3(	in0.x, in0.y, in0.z,
   3675 								in0.x, in0.y, in0.z,
   3676 								in0.x, in0.y, in0.z);
   3677 				mat3 b = mat3(	in0.z, in0.x, -in0.y,
   3678 								in0.z, in0.x, -in0.y,
   3679 								in0.z, in0.x, -in0.y);
   3680 				mat3 c = mat3(	-in0.z, -in0.z, in0.z,
   3681 								-in0.y, -in0.y, in0.y,
   3682 								-in0.x, -in0.x, in0.x);
   3683 
   3684 				mat3[][][] x = mat3[][][] (	mat3[][] ( 	mat3[] (a, a, a),
   3685 														mat3[] (b, b, b),
   3686 														mat3[] (c, c, c)),
   3687 
   3688 											mat3[][] ( 	mat3[] (b, b, b),
   3689 														mat3[] (a, a, a),
   3690 														mat3[] (c, c, c)),
   3691 
   3692 											mat3[][] ( 	mat3[] (c, c, c),
   3693 														mat3[] (a, a, a),
   3694 														mat3[] (b, b, b)) );
   3695 
   3696 				mat3 x0 = x[0][0][0];
   3697 				mat3 x1 = x[1][0][0];
   3698 				mat3 x2 = x[2][0][0];
   3699 
   3700 				float ret0 = x0[2][0];
   3701 				float ret1 = x1[0][2];
   3702 				float ret2 = x2[1][2];
   3703 
   3704 				out0 = ivec3(ret0, ret1, ret2);
   3705 				${OUTPUT}
   3706 			}
   3707 		""
   3708 	end
   3709 
   3710 	case mat3_3x4
   3711 		version 310 es
   3712 		desc "Testing declaring arrays of arrays with implicit size"
   3713 		values
   3714 		{
   3715 			input bvec3 in0 = [ bvec3(true, false, true) ];
   3716 			output bvec3 out0 = [ bvec3(true, false, false) ];
   3717 		}
   3718 
   3719 		both ""
   3720 			#version 310 es
   3721 			precision mediump float;
   3722 			${DECLARATIONS}
   3723 
   3724 			void main()
   3725 			{
   3726 				${SETUP}
   3727 
   3728 				mat3 a = mat3(	in0.x, in0.y, in0.z,
   3729 								in0.x, in0.y, in0.z,
   3730 								in0.x, in0.y, in0.z);
   3731 
   3732 				mat3 b = mat3(	in0.z, in0.x, in0.y,
   3733 								in0.z, in0.x, in0.y,
   3734 								in0.z, in0.x, in0.y);
   3735 
   3736 				mat3 c = mat3(	in0.z, in0.z, in0.z,
   3737 								in0.y, in0.y, in0.y,
   3738 								in0.x, in0.x, in0.x);
   3739 
   3740 				mat3[] x[] = mat3[][] (	mat3[] (a, b, c, a),
   3741 										mat3[] (b, c, a, b),
   3742 										mat3[] (c, a, b, c) );
   3743 
   3744 				mat3 x0 = x[0][0];
   3745 				mat3 x1 = x[1][3];
   3746 				mat3 x2 = x[2][0];
   3747 
   3748 				float ret0 = x0[2][0];
   3749 				float ret1 = x1[0][2];
   3750 				float ret2 = x2[1][2];
   3751 
   3752 				out0 = bvec3(ret0, ret1, ret2);
   3753 				${OUTPUT}
   3754 			}
   3755 		""
   3756 	end
   3757 
   3758 end # implicit_size
   3759 
   3760 group assignment "Testing assignment of arrays of arrays"
   3761 
   3762 	group explicit_to_explicit "Declaring an array of arrays with explicit size and assigning it to another array of arrays with explicit size"
   3763 
   3764 		case float_3x3
   3765 			version 310 es
   3766 			desc "Testing assignment of arrays of arrays with explicit size"
   3767 			values
   3768 			{
   3769 				input vec3 in0 = [ vec3(0.5, 1.0, 2.0) | vec3(7.4, -1.0, 2.0) | vec3(3.0, 1.6, -2.0) ];
   3770 				output vec3 out0 = [ vec3(2.0, 0.5, 1.0) | vec3(2.0, 7.4, -1.0) | vec3(-2.0, 3.0, 1.6) ];
   3771 			}
   3772 
   3773 			both ""
   3774 				#version 310 es
   3775 				precision mediump float;
   3776 				${DECLARATIONS}
   3777 
   3778 				void main()
   3779 				{
   3780 					${SETUP}
   3781 					float x[3][3] = float[3][3] ( 	float[3] (in0.z, in0.x, in0.y),
   3782 													float[3] (in0.z, in0.x, in0.y),
   3783 													float[3] (in0.z, in0.x, in0.y) );
   3784 
   3785 					float[3] y[3] = x;
   3786 
   3787 					out0 = vec3(y[0][0], y[1][1], y[2][2]);
   3788 					${OUTPUT}
   3789 				}
   3790 			""
   3791 		end
   3792 
   3793 		case int_2x3
   3794 			version 310 es
   3795 			desc "Testing assignment of arrays of arrays with explicit size"
   3796 			values
   3797 			{
   3798 				input ivec3 in0 = [ ivec3(0, 1, 2) | ivec3(7, -1, 2) | ivec3(3, 1, -2) ];
   3799 				output ivec3 out0 = [ ivec3(2, 0, 1) | ivec3(2, 7, -1) | ivec3(-2, 3, 1) ];
   3800 			}
   3801 
   3802 			both ""
   3803 				#version 310 es
   3804 				precision mediump int;
   3805 				precision mediump float;
   3806 				${DECLARATIONS}
   3807 
   3808 				void main()
   3809 				{
   3810 					${SETUP}
   3811 					int[2][3] x = int[2][3] (	int[3] (in0.z, in0.x, in0.y),
   3812 												int[3] (in0.z, in0.x, in0.y) );;
   3813 					int y[2][3] = x;
   3814 
   3815 					out0 = ivec3(y[0][0], y[1][1], y[0][2]);
   3816 					${OUTPUT}
   3817 				}
   3818 			""
   3819 		end
   3820 
   3821 		case bool_3x3x3
   3822 			version 310 es
   3823 			desc "Testing assignment of arrays of arrays with explicit size"
   3824 			values
   3825 			{
   3826 				input bvec3 in0 = [ bvec3(false, true, true) ];
   3827 				output bvec3 out0 = [ bvec3(true, false, true) ];
   3828 			}
   3829 
   3830 			both ""
   3831 				#version 310 es
   3832 				precision mediump float;
   3833 				${DECLARATIONS}
   3834 
   3835 				void main()
   3836 				{
   3837 					${SETUP}
   3838 					bool[3][3] x[3] = bool[3][3][3] (bool[3][3] (bool[3](in0.z, in0.z, in0.z),
   3839 																bool[3](in0.z, in0.z, in0.z),
   3840 																bool[3](in0.z, in0.z, in0.z)),
   3841 
   3842 													bool[3][3] (bool[3](in0.x, in0.x, in0.x),
   3843 																bool[3](in0.x, in0.x, in0.x),
   3844 																bool[3](in0.x, in0.x, in0.x)),
   3845 
   3846 													bool[3][3] (bool[3](in0.y, in0.y, in0.y),
   3847 																bool[3](in0.y, in0.y, in0.y),
   3848 																bool[3](in0.y, in0.y, in0.y)) );
   3849 
   3850 					bool[3] y[3][3] = x;
   3851 
   3852 					out0 = bvec3(y[0][0][0], y[1][1][1], y[2][2][2]);
   3853 					${OUTPUT}
   3854 				}
   3855 			""
   3856 		end
   3857 
   3858 		case struct_5x5x4
   3859 			version 310 es
   3860 			desc "Testing assignment of arrays of arrays with explicit size"
   3861 			values
   3862 			{
   3863 				input vec3 in0 = [ vec3(0.5, 1.0, 2.0) ];
   3864 				output vec3 out0 = [ vec3(-1.0, -0.5, 2.0) ];
   3865 			}
   3866 
   3867 			both ""
   3868 				#version 310 es
   3869 				precision mediump float;
   3870 				${DECLARATIONS}
   3871 
   3872 				struct Test
   3873 				{
   3874 					float f;
   3875 					vec3 v;
   3876 				};
   3877 
   3878 				void main()
   3879 				{
   3880 					${SETUP}
   3881 
   3882 					Test a = Test(in0.z, vec3(in0.x, in0.y, in0.z));
   3883 					Test b = Test(in0.y, vec3(-in0.z, -in0.x, -in0.y));
   3884 					Test c = Test(in0.x, vec3(-in0.y, in0.z, -in0.x));
   3885 
   3886 					Test[4] x[5][5] = Test[5][5][4] (	Test[5][4] (Test[4] (c, c, c, c),
   3887 																	Test[4] (b, b, b, b),
   3888 																	Test[4] (a, a, a, a),
   3889 																	Test[4] (c, c, c, c),
   3890 																	Test[4] (b, b, b, b) ),
   3891 
   3892 														Test[5][4] (Test[4] (a, a, a, a),
   3893 																	Test[4] (b, b, b, b),
   3894 																	Test[4] (c, c, c, c),
   3895 																	Test[4] (a, a, a, a),
   3896 																	Test[4] (b, b, b, b) ),
   3897 
   3898 														Test[5][4] (Test[4] (b, b, b, b),
   3899 																	Test[4] (c, c, c, c),
   3900 																	Test[4] (a, a, a, a),
   3901 																	Test[4] (b, b, b, b),
   3902 																	Test[4] (c, c, c, c) ),
   3903 
   3904 														Test[5][4] (Test[4] (c, c, c, c),
   3905 																	Test[4] (b, b, b, b),
   3906 																	Test[4] (a, a, a, a),
   3907 																	Test[4] (c, c, c, c),
   3908 																	Test[4] (b, b, b, b) ),
   3909 
   3910 														Test[5][4] (Test[4] (a, a, a, a),
   3911 																	Test[4] (b, b, b, b),
   3912 																	Test[4] (c, c, c, c),
   3913 																	Test[4] (a, a, a, a),
   3914 																	Test[4] (b, b, b, b) ) );
   3915 
   3916 					Test y[5][5][4] = x;
   3917 
   3918 					out0 = vec3(y[0][0][0].v.x, y[1][1][1].v.y, y[4][3][3].v.z);
   3919 					${OUTPUT}
   3920 				}
   3921 			""
   3922 		end
   3923 
   3924 		case vec3_1x3
   3925 			version 310 es
   3926 			desc "Testing assignment of arrays of arrays with explicit size"
   3927 			values
   3928 			{
   3929 				input vec3 in0 = 	[ vec3(0.5, 1.0, 2.0) | vec3(-0.5, 11.2, -1.0) ];
   3930 				output vec3 out0 = [ vec3(0.5, -2.0, 1.0) | vec3(-0.5, 1.0, 11.2) ];
   3931 			}
   3932 
   3933 			both ""
   3934 				#version 310 es
   3935 				precision mediump float;
   3936 				${DECLARATIONS}
   3937 
   3938 				void main()
   3939 				{
   3940 					${SETUP}
   3941 					vec3 x[1][3] = vec3[1][3] (	vec3[3] (vec3(in0.x, in0.y, -in0.z),
   3942 														vec3(in0.y, -in0.z, in0.x),
   3943 														vec3(-in0.z, in0.x, in0.y)) );
   3944 
   3945 					vec3 y[1][3] = x;
   3946 
   3947 					out0 = vec3(y[0][0].x, y[0][1].y, y[0][2].z);
   3948 					${OUTPUT}
   3949 				}
   3950 			""
   3951 		end
   3952 
   3953 		case ivec3_3x1x3
   3954 			version 310 es
   3955 			desc "Testing assignment of arrays of arrays with explicit size"
   3956 			values
   3957 			{
   3958 				input ivec3 in0 = 	[ ivec3(0, 1, 2) | ivec3(5, 11, -1) ];
   3959 				output ivec3 out0 = [ ivec3(0, -2, 1) | ivec3(5, 1, 11) ];
   3960 			}
   3961 
   3962 			both ""
   3963 				#version 310 es
   3964 				precision mediump int;
   3965 				precision mediump float;
   3966 				${DECLARATIONS}
   3967 
   3968 				void main()
   3969 				{
   3970 					${SETUP}
   3971 					ivec3[3][1][3] x = ivec3[3][1][3] (	ivec3[1][3] (ivec3[3] (	ivec3(in0.x, in0.y, -in0.z),
   3972 																				ivec3(0.0, 0.0, 0.0),
   3973 																				ivec3(0.0, 0.0, 0.0)) ),
   3974 
   3975 														ivec3[1][3] (ivec3[3] (	ivec3(0.0, 0.0, 0.0),
   3976 																				ivec3(in0.y, -in0.z, in0.x),
   3977 																				ivec3(0.0, 0.0, 0.0)) ),
   3978 
   3979 														ivec3[1][3] (ivec3[3] (	ivec3(0.0, 0.0, 0.0),
   3980 																				ivec3(0.0, 0.0, 0.0),
   3981 																				ivec3(-in0.z, in0.x, in0.y)) ) );
   3982 
   3983 					ivec3[3] y[3][1] = x;
   3984 
   3985 					out0 = ivec3(y[0][0][0].x, y[1][0][1].y, y[2][0][2].z);
   3986 					${OUTPUT}
   3987 				}
   3988 			""
   3989 		end
   3990 
   3991 		case bvec3_3x1
   3992 			version 310 es
   3993 			desc "Testing assignment of arrays of arrays with explicit size"
   3994 			values
   3995 			{
   3996 				input bvec3 in0 = 	[ bvec3(true, false, true) ];
   3997 				output bvec3 out0 = [ bvec3(true, true, false) ];
   3998 			}
   3999 
   4000 			both ""
   4001 				#version 310 es
   4002 				precision mediump float;
   4003 				${DECLARATIONS}
   4004 
   4005 				void main()
   4006 				{
   4007 					${SETUP}
   4008 					bvec3[3][1] x = bvec3[3][1] (	bvec3[1] ( bvec3(in0.x, in0.y, in0.z)),
   4009 													bvec3[1] ( bvec3(in0.y, in0.z, in0.x)),
   4010 													bvec3[1] ( bvec3(in0.z, in0.x, in0.y)) );
   4011 
   4012 					bvec3[3][1] y = x;
   4013 
   4014 					out0 = bvec3(y[0][0].x, y[1][0].y, y[2][0].z);
   4015 					${OUTPUT}
   4016 				}
   4017 			""
   4018 		end
   4019 
   4020 		case mat3_3x2
   4021 			version 310 es
   4022 			desc "Testing assignment of arrays of arrays with explicit size"
   4023 			values
   4024 			{
   4025 				input vec3 in0 = [ vec3(0.5, 1.0, 2.0) | vec3(-1.5, 0.0, -2.3) ];
   4026 				output vec3 out0 = [ vec3(0.5, -1.0, 1.0) | vec3(-1.5, 0.0, 0.0) ];
   4027 			}
   4028 
   4029 			both ""
   4030 				#version 310 es
   4031 				precision mediump float;
   4032 				${DECLARATIONS}
   4033 
   4034 				void main()
   4035 				{
   4036 					${SETUP}
   4037 					mat3[3][2] a = mat3[3][2] (	mat3[2] (mat3(	in0.x, in0.y, in0.z,
   4038 																in0.x, in0.y, in0.z,
   4039 																in0.x, in0.y, in0.z),
   4040 														 mat3(	in0.z, in0.x, -in0.y,
   4041 																in0.z, in0.x, -in0.y,
   4042 																in0.z, in0.x, -in0.y)),
   4043 
   4044 												mat3[2] (mat3(	-in0.z, -in0.z, in0.z,
   4045 																-in0.y, -in0.y, in0.y,
   4046 																-in0.x, -in0.x, in0.x),
   4047 														 mat3(	in0.x, in0.y, in0.z,
   4048 																in0.x, in0.y, in0.z,
   4049 																in0.x, in0.y, in0.z)),
   4050 
   4051 												mat3[2] (mat3(	in0.z, in0.x, -in0.y,
   4052 																in0.z, in0.x, -in0.y,
   4053 																in0.z, in0.x, -in0.y),
   4054 														 mat3(	-in0.z, -in0.z, in0.z,
   4055 																-in0.y, -in0.y, in0.y,
   4056 																-in0.x, -in0.x, in0.x)) );
   4057 
   4058 					mat3[2] y[3] = a;
   4059 
   4060 					mat3 a0 = y[0][0];
   4061 					mat3 a1 = y[0][1];
   4062 					mat3 a2 = y[2][1];
   4063 
   4064 					float ret0 = a0[2][0];
   4065 					float ret1 = a1[0][2];
   4066 					float ret2 = a2[1][2];
   4067 
   4068 					out0 = vec3(ret0, ret1, ret2);
   4069 					${OUTPUT}
   4070 				}
   4071 			""
   4072 		end
   4073 
   4074 		case mat3_3x3x3
   4075 			version 310 es
   4076 			desc "Testing assignment of arrays of arrays with explicit size"
   4077 			values
   4078 			{
   4079 				input ivec3 in0 = [ ivec3(0, 1, 2) | ivec3(-1, 0, -2) ];
   4080 				output ivec3 out0 = [ ivec3(0, -1, 1) | ivec3(-1, 0, 0) ];
   4081 			}
   4082 
   4083 			both ""
   4084 				#version 310 es
   4085 				precision mediump int;
   4086 				precision mediump float;
   4087 				${DECLARATIONS}
   4088 
   4089 				void main()
   4090 				{
   4091 					${SETUP}
   4092 
   4093 					mat3 a = mat3(	in0.x, in0.y, in0.z,
   4094 									in0.x, in0.y, in0.z,
   4095 									in0.x, in0.y, in0.z);
   4096 					mat3 b = mat3(	in0.z, in0.x, -in0.y,
   4097 									in0.z, in0.x, -in0.y,
   4098 									in0.z, in0.x, -in0.y);
   4099 					mat3 c = mat3(	-in0.z, -in0.z, in0.z,
   4100 									-in0.y, -in0.y, in0.y,
   4101 									-in0.x, -in0.x, in0.x);
   4102 
   4103 					mat3[3][3][3] x = mat3[3][3][3] (mat3[3][3] (mat3[3] (a, a, a),
   4104 																mat3[3] (b, b, b),
   4105 																mat3[3] (c, c, c)),
   4106 
   4107 													mat3[3][3] (mat3[3] (b, b, b),
   4108 																mat3[3] (a, a, a),
   4109 																mat3[3] (c, c, c)),
   4110 
   4111 													mat3[3][3] (mat3[3] (c, c, c),
   4112 																mat3[3] (a, a, a),
   4113 																mat3[3] (b, b, b)) );
   4114 
   4115 					mat3 y[3][3][3] = x;
   4116 
   4117 					mat3 x0 = y[0][0][0];
   4118 					mat3 x1 = y[1][0][0];
   4119 					mat3 x2 = y[2][0][0];
   4120 
   4121 					float ret0 = x0[2][0];
   4122 					float ret1 = x1[0][2];
   4123 					float ret2 = x2[1][2];
   4124 
   4125 					out0 = ivec3(ret0, ret1, ret2);
   4126 					${OUTPUT}
   4127 				}
   4128 			""
   4129 		end
   4130 
   4131 		case mat3_3x4
   4132 			version 310 es
   4133 			desc "Testing assignment of arrays of arrays with explicit size"
   4134 			values
   4135 			{
   4136 				input bvec3 in0 = [ bvec3(true, false, true) ];
   4137 				output bvec3 out0 = [ bvec3(true, false, false) ];
   4138 			}
   4139 
   4140 			both ""
   4141 				#version 310 es
   4142 				precision mediump float;
   4143 				${DECLARATIONS}
   4144 
   4145 				void main()
   4146 				{
   4147 					${SETUP}
   4148 
   4149 					mat3 a = mat3(	in0.x, in0.y, in0.z,
   4150 									in0.x, in0.y, in0.z,
   4151 									in0.x, in0.y, in0.z);
   4152 
   4153 					mat3 b = mat3(	in0.z, in0.x, in0.y,
   4154 									in0.z, in0.x, in0.y,
   4155 									in0.z, in0.x, in0.y);
   4156 
   4157 					mat3 c = mat3(	in0.z, in0.z, in0.z,
   4158 									in0.y, in0.y, in0.y,
   4159 									in0.x, in0.x, in0.x);
   4160 
   4161 					mat3[4] x[3] = mat3[3][4] (	mat3[4] (a, b, c, a),
   4162 												mat3[4] (b, c, a, b),
   4163 												mat3[4] (c, a, b, c) );
   4164 
   4165 					mat3 y[3][4] = x;
   4166 
   4167 					mat3 x0 = y[0][0];
   4168 					mat3 x1 = y[1][3];
   4169 					mat3 x2 = y[2][0];
   4170 
   4171 					float ret0 = x0[2][0];
   4172 					float ret1 = x1[0][2];
   4173 					float ret2 = x2[1][2];
   4174 
   4175 					out0 = bvec3(ret0, ret1, ret2);
   4176 					${OUTPUT}
   4177 				}
   4178 			""
   4179 		end
   4180 
   4181 	end # explicit_to_explicit
   4182 
   4183 	group explicit_to_implicit "Declaring an array of arrays with explicit size and assigning it to another array of arrays with implicit size"
   4184 
   4185 		case float_3x3
   4186 			version 310 es
   4187 			desc "Testing assignment of arrays of arrays from explicitly sized to implicitly sized"
   4188 			values
   4189 			{
   4190 				input vec3 in0 = [ vec3(0.5, 1.0, 2.0) | vec3(7.4, -1.0, 2.0) | vec3(3.0, 1.6, -2.0) ];
   4191 				output vec3 out0 = [ vec3(2.0, 0.5, 1.0) | vec3(2.0, 7.4, -1.0) | vec3(-2.0, 3.0, 1.6) ];
   4192 			}
   4193 
   4194 			both ""
   4195 				#version 310 es
   4196 				precision mediump float;
   4197 				${DECLARATIONS}
   4198 
   4199 				void main()
   4200 				{
   4201 					${SETUP}
   4202 					float x[3][3] = float[3][3] ( 	float[3] (in0.z, in0.x, in0.y),
   4203 													float[3] (in0.z, in0.x, in0.y),
   4204 													float[3] (in0.z, in0.x, in0.y) );
   4205 
   4206 					float[] y[] = x;
   4207 
   4208 					out0 = vec3(y[0][0], y[1][1], y[2][2]);
   4209 					${OUTPUT}
   4210 				}
   4211 			""
   4212 		end
   4213 
   4214 		case int_2x3
   4215 			version 310 es
   4216 			desc "Testing assignment of arrays of arrays from explicitly sized to implicitly sized"
   4217 			values
   4218 			{
   4219 				input ivec3 in0 = [ ivec3(0, 1, 2) | ivec3(7, -1, 2) | ivec3(3, 1, -2) ];
   4220 				output ivec3 out0 = [ ivec3(2, 0, 1) | ivec3(2, 7, -1) | ivec3(-2, 3, 1) ];
   4221 			}
   4222 
   4223 			both ""
   4224 				#version 310 es
   4225 				precision mediump int;
   4226 				precision mediump float;
   4227 				${DECLARATIONS}
   4228 
   4229 				void main()
   4230 				{
   4231 					${SETUP}
   4232 					int[2][3] x = int[2][3] ( 	int[3] (in0.z, in0.x, in0.y),
   4233 												int[3] (in0.z, in0.x, in0.y) );;
   4234 					int y[][] = x;
   4235 
   4236 					out0 = ivec3(y[0][0], y[1][1], y[0][2]);
   4237 					${OUTPUT}
   4238 				}
   4239 			""
   4240 		end
   4241 
   4242 		case bool_3x3x3
   4243 			version 310 es
   4244 			desc "Testing assignment of arrays of arrays from explicitly sized to implicitly sized"
   4245 			values
   4246 			{
   4247 				input bvec3 in0 = [ bvec3(false, true, true) ];
   4248 				output bvec3 out0 = [ bvec3(true, false, true) ];
   4249 			}
   4250 
   4251 			both ""
   4252 				#version 310 es
   4253 				precision mediump float;
   4254 				${DECLARATIONS}
   4255 
   4256 				void main()
   4257 				{
   4258 					${SETUP}
   4259 					bool[3][3] x[3] = bool[3][3][3] (bool[3][3] (bool[3](in0.z, in0.z, in0.z),
   4260 																bool[3](in0.z, in0.z, in0.z),
   4261 																bool[3](in0.z, in0.z, in0.z)),
   4262 
   4263 													bool[3][3] (bool[3](in0.x, in0.x, in0.x),
   4264 																bool[3](in0.x, in0.x, in0.x),
   4265 																bool[3](in0.x, in0.x, in0.x)),
   4266 
   4267 													bool[3][3] (bool[3](in0.y, in0.y, in0.y),
   4268 																bool[3](in0.y, in0.y, in0.y),
   4269 																bool[3](in0.y, in0.y, in0.y)) );
   4270 
   4271 					bool[] y[][] = x;
   4272 
   4273 					out0 = bvec3(y[0][0][0], y[1][1][1], y[2][2][2]);
   4274 					${OUTPUT}
   4275 				}
   4276 			""
   4277 		end
   4278 
   4279 		case struct_5x5x4
   4280 			version 310 es
   4281 			desc "Testing assignment of arrays of arrays from explicitly sized to implicitly sized"
   4282 			values
   4283 			{
   4284 				input vec3 in0 = [ vec3(0.5, 1.0, 2.0) ];
   4285 				output vec3 out0 = [ vec3(-1.0, -0.5, 2.0) ];
   4286 			}
   4287 
   4288 			both ""
   4289 				#version 310 es
   4290 				precision mediump float;
   4291 				${DECLARATIONS}
   4292 
   4293 				struct Test
   4294 				{
   4295 					float f;
   4296 					vec3 v;
   4297 				};
   4298 
   4299 				void main()
   4300 				{
   4301 					${SETUP}
   4302 
   4303 					Test a = Test(in0.z, vec3(in0.x, in0.y, in0.z));
   4304 					Test b = Test(in0.y, vec3(-in0.z, -in0.x, -in0.y));
   4305 					Test c = Test(in0.x, vec3(-in0.y, in0.z, -in0.x));
   4306 
   4307 					Test[4] x[5][5] = Test[5][5][4] (Test[5][4] (Test[4] (c, c, c, c),
   4308 																Test[4] (b, b, b, b),
   4309 																Test[4] (a, a, a, a),
   4310 																Test[4] (c, c, c, c),
   4311 																Test[4] (b, b, b, b) ),
   4312 
   4313 													Test[5][4] (Test[4] (a, a, a, a),
   4314 																Test[4] (b, b, b, b),
   4315 																Test[4] (c, c, c, c),
   4316 																Test[4] (a, a, a, a),
   4317 																Test[4] (b, b, b, b) ),
   4318 
   4319 													Test[5][4] (Test[4] (b, b, b, b),
   4320 																Test[4] (c, c, c, c),
   4321 																Test[4] (a, a, a, a),
   4322 																Test[4] (b, b, b, b),
   4323 																Test[4] (c, c, c, c) ),
   4324 
   4325 													Test[5][4] (Test[4] (c, c, c, c),
   4326 																Test[4] (b, b, b, b),
   4327 																Test[4] (a, a, a, a),
   4328 																Test[4] (c, c, c, c),
   4329 																Test[4] (b, b, b, b) ),
   4330 
   4331 													Test[5][4] (Test[4] (a, a, a, a),
   4332 																Test[4] (b, b, b, b),
   4333 																Test[4] (c, c, c, c),
   4334 																Test[4] (a, a, a, a),
   4335 																Test[4] (b, b, b, b) ) );
   4336 
   4337 					Test y[][][] = x;
   4338 
   4339 					out0 = vec3(y[0][0][0].v.x, y[1][1][1].v.y, y[4][3][3].v.z);
   4340 					${OUTPUT}
   4341 				}
   4342 			""
   4343 		end
   4344 
   4345 		case vec3_1x3
   4346 			version 310 es
   4347 			desc "Testing assignment of arrays of arrays from explicitly sized to implicitly sized"
   4348 			values
   4349 			{
   4350 				input vec3 in0 = 	[ vec3(0.5, 1.0, 2.0) | vec3(-0.5, 11.2, -1.0) ];
   4351 				output vec3 out0 = [ vec3(0.5, -2.0, 1.0) | vec3(-0.5, 1.0, 11.2) ];
   4352 			}
   4353 
   4354 			both ""
   4355 				#version 310 es
   4356 				precision mediump float;
   4357 				${DECLARATIONS}
   4358 
   4359 				void main()
   4360 				{
   4361 					${SETUP}
   4362 					vec3 x[1][3] = vec3[1][3] (	vec3[3] (vec3(in0.x, in0.y, -in0.z),
   4363 														vec3(in0.y, -in0.z, in0.x),
   4364 														vec3(-in0.z, in0.x, in0.y)) );
   4365 
   4366 					vec3 y[][] = x;
   4367 
   4368 					out0 = vec3(y[0][0].x, y[0][1].y, y[0][2].z);
   4369 					${OUTPUT}
   4370 				}
   4371 			""
   4372 		end
   4373 
   4374 		case ivec3_3x1x3
   4375 			version 310 es
   4376 			desc "Testing assignment of arrays of arrays from explicitly sized to implicitly sized"
   4377 			values
   4378 			{
   4379 				input ivec3 in0 = 	[ ivec3(0, 1, 2) | ivec3(5, 11, -1) ];
   4380 				output ivec3 out0 = [ ivec3(0, -2, 1) | ivec3(5, 1, 11) ];
   4381 			}
   4382 
   4383 			both ""
   4384 				#version 310 es
   4385 				precision mediump int;
   4386 				precision mediump float;
   4387 				${DECLARATIONS}
   4388 
   4389 				void main()
   4390 				{
   4391 					${SETUP}
   4392 					ivec3[3][1][3] x = ivec3[3][1][3] (	ivec3[1][3] (ivec3[3] (	ivec3(in0.x, in0.y, -in0.z),
   4393 																				ivec3(0.0, 0.0, 0.0),
   4394 																				ivec3(0.0, 0.0, 0.0)) ),
   4395 
   4396 														ivec3[1][3] (ivec3[3] (	ivec3(0.0, 0.0, 0.0),
   4397 																				ivec3(in0.y, -in0.z, in0.x),
   4398 																				ivec3(0.0, 0.0, 0.0)) ),
   4399 
   4400 														ivec3[1][3] (ivec3[3] (	ivec3(0.0, 0.0, 0.0),
   4401 																				ivec3(0.0, 0.0, 0.0),
   4402 																				ivec3(-in0.z, in0.x, in0.y)) ) );
   4403 
   4404 					ivec3[] y[][] = x;
   4405 
   4406 					out0 = ivec3(y[0][0][0].x, y[1][0][1].y, y[2][0][2].z);
   4407 					${OUTPUT}
   4408 				}
   4409 			""
   4410 		end
   4411 
   4412 		case bvec3_3x1
   4413 			version 310 es
   4414 			desc "Testing assignment of arrays of arrays from explicitly sized to implicitly sized"
   4415 			values
   4416 			{
   4417 				input bvec3 in0 = 	[ bvec3(true, false, true) ];
   4418 				output bvec3 out0 = [ bvec3(true, true, false) ];
   4419 			}
   4420 
   4421 			both ""
   4422 				#version 310 es
   4423 				precision mediump float;
   4424 				${DECLARATIONS}
   4425 
   4426 				void main()
   4427 				{
   4428 					${SETUP}
   4429 					bvec3[3][1] x = bvec3[3][1] (	bvec3[1] ( bvec3(in0.x, in0.y, in0.z)),
   4430 													bvec3[1] ( bvec3(in0.y, in0.z, in0.x)),
   4431 													bvec3[1] ( bvec3(in0.z, in0.x, in0.y)) );
   4432 
   4433 					bvec3[][] y = x;
   4434 
   4435 					out0 = bvec3(y[0][0].x, y[1][0].y, y[2][0].z);
   4436 					${OUTPUT}
   4437 				}
   4438 			""
   4439 		end
   4440 
   4441 		case mat3_3x2
   4442 			version 310 es
   4443 			desc "Testing assignment of arrays of arrays from explicitly sized to implicitly sized"
   4444 			values
   4445 			{
   4446 				input vec3 in0 = [ vec3(0.5, 1.0, 2.0) | vec3(-1.5, 0.0, -2.3) ];
   4447 				output vec3 out0 = [ vec3(0.5, -1.0, 1.0) | vec3(-1.5, 0.0, 0.0) ];
   4448 			}
   4449 
   4450 			both ""
   4451 				#version 310 es
   4452 				precision mediump float;
   4453 				${DECLARATIONS}
   4454 
   4455 				void main()
   4456 				{
   4457 					${SETUP}
   4458 					mat3[3][2] a = mat3[3][2] (	mat3[2] (mat3(	in0.x, in0.y, in0.z,
   4459 																in0.x, in0.y, in0.z,
   4460 																in0.x, in0.y, in0.z),
   4461 														 mat3(	in0.z, in0.x, -in0.y,
   4462 																in0.z, in0.x, -in0.y,
   4463 																in0.z, in0.x, -in0.y)),
   4464 
   4465 												mat3[2] (mat3(	-in0.z, -in0.z, in0.z,
   4466 																-in0.y, -in0.y, in0.y,
   4467 																-in0.x, -in0.x, in0.x),
   4468 														 mat3(	in0.x, in0.y, in0.z,
   4469 																in0.x, in0.y, in0.z,
   4470 																in0.x, in0.y, in0.z)),
   4471 
   4472 												mat3[2] (mat3(	in0.z, in0.x, -in0.y,
   4473 																in0.z, in0.x, -in0.y,
   4474 																in0.z, in0.x, -in0.y),
   4475 														 mat3(	-in0.z, -in0.z, in0.z,
   4476 																-in0.y, -in0.y, in0.y,
   4477 																-in0.x, -in0.x, in0.x)) );
   4478 
   4479 					mat3[] y[] = a;
   4480 
   4481 					mat3 a0 = y[0][0];
   4482 					mat3 a1 = y[0][1];
   4483 					mat3 a2 = y[2][1];
   4484 
   4485 					float ret0 = a0[2][0];
   4486 					float ret1 = a1[0][2];
   4487 					float ret2 = a2[1][2];
   4488 
   4489 					out0 = vec3(ret0, ret1, ret2);
   4490 					${OUTPUT}
   4491 				}
   4492 			""
   4493 		end
   4494 
   4495 		case mat3_3x3x3
   4496 			version 310 es
   4497 			desc "Testing assignment of arrays of arrays from explicitly sized to implicitly sized"
   4498 			values
   4499 			{
   4500 				input ivec3 in0 = [ ivec3(0, 1, 2) | ivec3(-1, 0, -2) ];
   4501 				output ivec3 out0 = [ ivec3(0, -1, 1) | ivec3(-1, 0, 0) ];
   4502 			}
   4503 
   4504 			both ""
   4505 				#version 310 es
   4506 				precision mediump int;
   4507 				precision mediump float;
   4508 				${DECLARATIONS}
   4509 
   4510 				void main()
   4511 				{
   4512 					${SETUP}
   4513 
   4514 					mat3 a = mat3(	in0.x, in0.y, in0.z,
   4515 									in0.x, in0.y, in0.z,
   4516 									in0.x, in0.y, in0.z);
   4517 					mat3 b = mat3(	in0.z, in0.x, -in0.y,
   4518 									in0.z, in0.x, -in0.y,
   4519 									in0.z, in0.x, -in0.y);
   4520 					mat3 c = mat3(	-in0.z, -in0.z, in0.z,
   4521 									-in0.y, -in0.y, in0.y,
   4522 									-in0.x, -in0.x, in0.x);
   4523 
   4524 					mat3[3][3][3] x = mat3[3][3][3] (mat3[3][3] (mat3[3] (a, a, a),
   4525 																mat3[3] (b, b, b),
   4526 																mat3[3] (c, c, c)),
   4527 
   4528 													mat3[3][3] (mat3[3] (b, b, b),
   4529 																mat3[3] (a, a, a),
   4530 																mat3[3] (c, c, c)),
   4531 
   4532 													mat3[3][3] (mat3[3] (c, c, c),
   4533 																mat3[3] (a, a, a),
   4534 																mat3[3] (b, b, b)) );
   4535 
   4536 					mat3 y[][][] = x;
   4537 
   4538 					mat3 x0 = y[0][0][0];
   4539 					mat3 x1 = y[1][0][0];
   4540 					mat3 x2 = y[2][0][0];
   4541 
   4542 					float ret0 = x0[2][0];
   4543 					float ret1 = x1[0][2];
   4544 					float ret2 = x2[1][2];
   4545 
   4546 					out0 = ivec3(ret0, ret1, ret2);
   4547 					${OUTPUT}
   4548 				}
   4549 			""
   4550 		end
   4551 
   4552 		case mat3_3x4
   4553 			version 310 es
   4554 			desc "Testing assignment of arrays of arrays from explicitly sized to implicitly sized"
   4555 			values
   4556 			{
   4557 				input bvec3 in0 = [ bvec3(true, false, true) ];
   4558 				output bvec3 out0 = [ bvec3(true, false, false) ];
   4559 			}
   4560 
   4561 			both ""
   4562 				#version 310 es
   4563 				precision mediump float;
   4564 				${DECLARATIONS}
   4565 
   4566 				void main()
   4567 				{
   4568 					${SETUP}
   4569 
   4570 					mat3 a = mat3(	in0.x, in0.y, in0.z,
   4571 									in0.x, in0.y, in0.z,
   4572 									in0.x, in0.y, in0.z);
   4573 
   4574 					mat3 b = mat3(	in0.z, in0.x, in0.y,
   4575 									in0.z, in0.x, in0.y,
   4576 									in0.z, in0.x, in0.y);
   4577 
   4578 					mat3 c = mat3(	in0.z, in0.z, in0.z,
   4579 									in0.y, in0.y, in0.y,
   4580 									in0.x, in0.x, in0.x);
   4581 
   4582 					mat3[4] x[3] = mat3[3][4] (	mat3[4] (a, b, c, a),
   4583 												mat3[4] (b, c, a, b),
   4584 												mat3[4] (c, a, b, c) );
   4585 
   4586 					mat3 y[][] = x;
   4587 
   4588 					mat3 x0 = y[0][0];
   4589 					mat3 x1 = y[1][3];
   4590 					mat3 x2 = y[2][0];
   4591 
   4592 					float ret0 = x0[2][0];
   4593 					float ret1 = x1[0][2];
   4594 					float ret2 = x2[1][2];
   4595 
   4596 					out0 = bvec3(ret0, ret1, ret2);
   4597 					${OUTPUT}
   4598 				}
   4599 			""
   4600 		end
   4601 
   4602 	end # explicit_to_implicit
   4603 
   4604 	group implicit_to_explicit "Declaring an array of arrays with implicit size and assigning it to another array of arrays with explicit size"
   4605 
   4606 		case float_3x3
   4607 			version 310 es
   4608 			desc "Testing assignment of arrays of arrays from implicitly sized to explicitly sized"
   4609 			values
   4610 			{
   4611 				input vec3 in0 = [ vec3(0.5, 1.0, 2.0) | vec3(7.4, -1.0, 2.0) | vec3(3.0, 1.6, -2.0) ];
   4612 				output vec3 out0 = [ vec3(2.0, 0.5, 1.0) | vec3(2.0, 7.4, -1.0) | vec3(-2.0, 3.0, 1.6) ];
   4613 			}
   4614 
   4615 			both ""
   4616 				#version 310 es
   4617 				precision mediump float;
   4618 				${DECLARATIONS}
   4619 
   4620 				void main()
   4621 				{
   4622 					${SETUP}
   4623 					float x[][] = float[][] ( 	float[] (in0.z, in0.x, in0.y),
   4624 												float[] (in0.z, in0.x, in0.y),
   4625 												float[] (in0.z, in0.x, in0.y) );
   4626 
   4627 					float[3] y[3] = x;
   4628 
   4629 					out0 = vec3(y[0][0], y[1][1], y[2][2]);
   4630 					${OUTPUT}
   4631 				}
   4632 			""
   4633 		end
   4634 
   4635 		case int_2x3
   4636 			version 310 es
   4637 			desc "Testing assignment of arrays of arrays from implicitly sized to explicitly sized"
   4638 			values
   4639 			{
   4640 				input ivec3 in0 = [ ivec3(0, 1, 2) | ivec3(7, -1, 2) | ivec3(3, 1, -2) ];
   4641 				output ivec3 out0 = [ ivec3(2, 0, 1) | ivec3(2, 7, -1) | ivec3(-2, 3, 1) ];
   4642 			}
   4643 
   4644 			both ""
   4645 				#version 310 es
   4646 				precision mediump int;
   4647 				precision mediump float;
   4648 				${DECLARATIONS}
   4649 
   4650 				void main()
   4651 				{
   4652 					${SETUP}
   4653 					int[][] x = int[][] ( 	int[] (in0.z, in0.x, in0.y),
   4654 											int[] (in0.z, in0.x, in0.y) );;
   4655 					int y[2][3] = x;
   4656 
   4657 					out0 = ivec3(y[0][0], y[1][1], y[0][2]);
   4658 					${OUTPUT}
   4659 				}
   4660 			""
   4661 		end
   4662 
   4663 		case bool_3x3x3
   4664 			version 310 es
   4665 			desc "Testing assignment of arrays of arrays from implicitly sized to explicitly sized"
   4666 			values
   4667 			{
   4668 				input bvec3 in0 = [ bvec3(false, true, true) ];
   4669 				output bvec3 out0 = [ bvec3(true, false, true) ];
   4670 			}
   4671 
   4672 			both ""
   4673 				#version 310 es
   4674 				precision mediump float;
   4675 				${DECLARATIONS}
   4676 
   4677 				void main()
   4678 				{
   4679 					${SETUP}
   4680 					bool[][] x[] = bool[][][] ( bool[][] (	bool[](in0.z, in0.z, in0.z),
   4681 															bool[](in0.z, in0.z, in0.z),
   4682 															bool[](in0.z, in0.z, in0.z)),
   4683 
   4684 												bool[][] (	bool[](in0.x, in0.x, in0.x),
   4685 															bool[](in0.x, in0.x, in0.x),
   4686 															bool[](in0.x, in0.x, in0.x)),
   4687 
   4688 												bool[][] (	bool[](in0.y, in0.y, in0.y),
   4689 															bool[](in0.y, in0.y, in0.y),
   4690 															bool[](in0.y, in0.y, in0.y)) );
   4691 
   4692 					bool[3] y[3][3] = x;
   4693 
   4694 					out0 = bvec3(y[0][0][0], y[1][1][1], y[2][2][2]);
   4695 					${OUTPUT}
   4696 				}
   4697 			""
   4698 		end
   4699 
   4700 		case struct_5x5x4
   4701 			version 310 es
   4702 			desc "Testing assignment of arrays of arrays from implicitly sized to explicitly sized"
   4703 			values
   4704 			{
   4705 				input vec3 in0 = [ vec3(0.5, 1.0, 2.0) ];
   4706 				output vec3 out0 = [ vec3(-1.0, -0.5, 2.0) ];
   4707 			}
   4708 
   4709 			both ""
   4710 				#version 310 es
   4711 				precision mediump float;
   4712 				${DECLARATIONS}
   4713 
   4714 				struct Test
   4715 				{
   4716 					float f;
   4717 					vec3 v;
   4718 				};
   4719 
   4720 				void main()
   4721 				{
   4722 					${SETUP}
   4723 
   4724 					Test a = Test(in0.z, vec3(in0.x, in0.y, in0.z));
   4725 					Test b = Test(in0.y, vec3(-in0.z, -in0.x, -in0.y));
   4726 					Test c = Test(in0.x, vec3(-in0.y, in0.z, -in0.x));
   4727 
   4728 					Test[] x[][] = Test[][][] (	Test[][] (	Test[] (c, c, c, c),
   4729 															Test[] (b, b, b, b),
   4730 															Test[] (a, a, a, a),
   4731 															Test[] (c, c, c, c),
   4732 															Test[] (b, b, b, b) ),
   4733 
   4734 												Test[][] (	Test[] (a, a, a, a),
   4735 															Test[] (b, b, b, b),
   4736 															Test[] (c, c, c, c),
   4737 															Test[] (a, a, a, a),
   4738 															Test[] (b, b, b, b) ),
   4739 
   4740 												Test[][] (	Test[] (b, b, b, b),
   4741 															Test[] (c, c, c, c),
   4742 															Test[] (a, a, a, a),
   4743 															Test[] (b, b, b, b),
   4744 															Test[] (c, c, c, c) ),
   4745 
   4746 												Test[][] (	Test[] (c, c, c, c),
   4747 															Test[] (b, b, b, b),
   4748 															Test[] (a, a, a, a),
   4749 															Test[] (c, c, c, c),
   4750 															Test[] (b, b, b, b) ),
   4751 
   4752 												Test[][] (	Test[] (a, a, a, a),
   4753 															Test[] (b, b, b, b),
   4754 															Test[] (c, c, c, c),
   4755 															Test[] (a, a, a, a),
   4756 															Test[] (b, b, b, b) ) );
   4757 
   4758 					Test y[5][5][4] = x;
   4759 
   4760 					out0 = vec3(y[0][0][0].v.x, y[1][1][1].v.y, y[4][3][3].v.z);
   4761 					${OUTPUT}
   4762 				}
   4763 			""
   4764 		end
   4765 
   4766 		case vec3_1x3
   4767 			version 310 es
   4768 			desc "Testing assignment of arrays of arrays from implicitly sized to explicitly sized"
   4769 			values
   4770 			{
   4771 				input vec3 in0 = 	[ vec3(0.5, 1.0, 2.0) | vec3(-0.5, 11.2, -1.0) ];
   4772 				output vec3 out0 = [ vec3(0.5, -2.0, 1.0) | vec3(-0.5, 1.0, 11.2) ];
   4773 			}
   4774 
   4775 			both ""
   4776 				#version 310 es
   4777 				precision mediump float;
   4778 				${DECLARATIONS}
   4779 
   4780 				void main()
   4781 				{
   4782 					${SETUP}
   4783 					vec3 x[][] = vec3[][] (	vec3[] (vec3(in0.x, in0.y, -in0.z),
   4784 													vec3(in0.y, -in0.z, in0.x),
   4785 													vec3(-in0.z, in0.x, in0.y)) );
   4786 
   4787 					vec3 y[1][3] = x;
   4788 
   4789 					out0 = vec3(y[0][0].x, y[0][1].y, y[0][2].z);
   4790 					${OUTPUT}
   4791 				}
   4792 			""
   4793 		end
   4794 
   4795 		case ivec3_3x1x3
   4796 			version 310 es
   4797 			desc "Testing assignment of arrays of arrays from implicitly sized to explicitly sized"
   4798 			values
   4799 			{
   4800 				input ivec3 in0 = 	[ ivec3(0, 1, 2) | ivec3(5, 11, -1) ];
   4801 				output ivec3 out0 = [ ivec3(0, -2, 1) | ivec3(5, 1, 11) ];
   4802 			}
   4803 
   4804 			both ""
   4805 				#version 310 es
   4806 				precision mediump int;
   4807 				precision mediump float;
   4808 				${DECLARATIONS}
   4809 
   4810 				void main()
   4811 				{
   4812 					${SETUP}
   4813 					ivec3[][][] x = ivec3[][][] (	ivec3[][] (	ivec3[] (	ivec3(in0.x, in0.y, -in0.z),
   4814 																				ivec3(0.0, 0.0, 0.0),
   4815 																				ivec3(0.0, 0.0, 0.0)) ),
   4816 
   4817 														ivec3[][] ( ivec3[] (	ivec3(0.0, 0.0, 0.0),
   4818 																				ivec3(in0.y, -in0.z, in0.x),
   4819 																				ivec3(0.0, 0.0, 0.0)) ),
   4820 
   4821 														ivec3[][] (	ivec3[] (	ivec3(0.0, 0.0, 0.0),
   4822 																				ivec3(0.0, 0.0, 0.0),
   4823 																				ivec3(-in0.z, in0.x, in0.y)) ) );
   4824 
   4825 					ivec3[3] y[3][1] = x;
   4826 
   4827 					out0 = ivec3(y[0][0][0].x, y[1][0][1].y, y[2][0][2].z);
   4828 					${OUTPUT}
   4829 				}
   4830 			""
   4831 		end
   4832 
   4833 		case bvec3_3x1
   4834 			version 310 es
   4835 			desc "Testing assignment of arrays of arrays from implicitly sized to explicitly sized"
   4836 			values
   4837 			{
   4838 				input bvec3 in0 = 	[ bvec3(true, false, true) ];
   4839 				output bvec3 out0 = [ bvec3(true, true, false) ];
   4840 			}
   4841 
   4842 			both ""
   4843 				#version 310 es
   4844 				precision mediump float;
   4845 				${DECLARATIONS}
   4846 
   4847 				void main()
   4848 				{
   4849 					${SETUP}
   4850 					bvec3[][] x = bvec3[][] (	bvec3[] ( bvec3(in0.x, in0.y, in0.z)),
   4851 												bvec3[] ( bvec3(in0.y, in0.z, in0.x)),
   4852 												bvec3[] ( bvec3(in0.z, in0.x, in0.y)) );
   4853 
   4854 					bvec3[3][1] y = x;
   4855 
   4856 					out0 = bvec3(y[0][0].x, y[1][0].y, y[2][0].z);
   4857 					${OUTPUT}
   4858 				}
   4859 			""
   4860 		end
   4861 
   4862 		case mat3_3x2
   4863 			version 310 es
   4864 			desc "Testing assignment of arrays of arrays from implicitly sized to explicitly sized"
   4865 			values
   4866 			{
   4867 				input vec3 in0 = [ vec3(0.5, 1.0, 2.0) | vec3(-1.5, 0.0, -2.3) ];
   4868 				output vec3 out0 = [ vec3(0.5, -1.0, 1.0) | vec3(-1.5, 0.0, 0.0) ];
   4869 			}
   4870 
   4871 			both ""
   4872 				#version 310 es
   4873 				precision mediump float;
   4874 				${DECLARATIONS}
   4875 
   4876 				void main()
   4877 				{
   4878 					${SETUP}
   4879 					mat3[][] a = mat3[][] (	mat3[] ( mat3(	in0.x, in0.y, in0.z,
   4880 															in0.x, in0.y, in0.z,
   4881 															in0.x, in0.y, in0.z),
   4882 													 mat3(	in0.z, in0.x, -in0.y,
   4883 															in0.z, in0.x, -in0.y,
   4884 															in0.z, in0.x, -in0.y)),
   4885 
   4886 											mat3[] ( mat3(	-in0.z, -in0.z, in0.z,
   4887 															-in0.y, -in0.y, in0.y,
   4888 															-in0.x, -in0.x, in0.x),
   4889 													 mat3(	in0.x, in0.y, in0.z,
   4890 															in0.x, in0.y, in0.z,
   4891 															in0.x, in0.y, in0.z)),
   4892 
   4893 											mat3[] ( mat3(	in0.z, in0.x, -in0.y,
   4894 															in0.z, in0.x, -in0.y,
   4895 															in0.z, in0.x, -in0.y),
   4896 													 mat3(	-in0.z, -in0.z, in0.z,
   4897 															-in0.y, -in0.y, in0.y,
   4898 															-in0.x, -in0.x, in0.x)) );
   4899 
   4900 					mat3[2] y[3] = a;
   4901 
   4902 					mat3 a0 = y[0][0];
   4903 					mat3 a1 = y[0][1];
   4904 					mat3 a2 = y[2][1];
   4905 
   4906 					float ret0 = a0[2][0];
   4907 					float ret1 = a1[0][2];
   4908 					float ret2 = a2[1][2];
   4909 
   4910 					out0 = vec3(ret0, ret1, ret2);
   4911 					${OUTPUT}
   4912 				}
   4913 			""
   4914 		end
   4915 
   4916 		case mat3_3x3x3
   4917 			version 310 es
   4918 			desc "Testing assignment of arrays of arrays from implicitly sized to explicitly sized"
   4919 			values
   4920 			{
   4921 				input ivec3 in0 = [ ivec3(0, 1, 2) | ivec3(-1, 0, -2) ];
   4922 				output ivec3 out0 = [ ivec3(0, -1, 1) | ivec3(-1, 0, 0) ];
   4923 			}
   4924 
   4925 			both ""
   4926 				#version 310 es
   4927 				precision mediump int;
   4928 				precision mediump float;
   4929 				${DECLARATIONS}
   4930 
   4931 				void main()
   4932 				{
   4933 					${SETUP}
   4934 
   4935 					mat3 a = mat3(	in0.x, in0.y, in0.z,
   4936 									in0.x, in0.y, in0.z,
   4937 									in0.x, in0.y, in0.z);
   4938 					mat3 b = mat3(	in0.z, in0.x, -in0.y,
   4939 									in0.z, in0.x, -in0.y,
   4940 									in0.z, in0.x, -in0.y);
   4941 					mat3 c = mat3(	-in0.z, -in0.z, in0.z,
   4942 									-in0.y, -in0.y, in0.y,
   4943 									-in0.x, -in0.x, in0.x);
   4944 
   4945 					mat3[][][] x = mat3[][][] (	mat3[][] ( 	mat3[] (a, a, a),
   4946 															mat3[] (b, b, b),
   4947 															mat3[] (c, c, c)),
   4948 
   4949 												mat3[][] ( 	mat3[] (b, b, b),
   4950 															mat3[] (a, a, a),
   4951 															mat3[] (c, c, c)),
   4952 
   4953 												mat3[][] ( 	mat3[] (c, c, c),
   4954 															mat3[] (a, a, a),
   4955 															mat3[] (b, b, b)) );
   4956 
   4957 					mat3 y[3][3][3] = x;
   4958 
   4959 					mat3 x0 = y[0][0][0];
   4960 					mat3 x1 = y[1][0][0];
   4961 					mat3 x2 = y[2][0][0];
   4962 
   4963 					float ret0 = x0[2][0];
   4964 					float ret1 = x1[0][2];
   4965 					float ret2 = x2[1][2];
   4966 
   4967 					out0 = ivec3(ret0, ret1, ret2);
   4968 					${OUTPUT}
   4969 				}
   4970 			""
   4971 		end
   4972 
   4973 		case mat3_3x4
   4974 			version 310 es
   4975 			desc "Testing assignment of arrays of arrays from implicitly sized to explicitly sized"
   4976 			values
   4977 			{
   4978 				input bvec3 in0 = [ bvec3(true, false, true) ];
   4979 				output bvec3 out0 = [ bvec3(true, false, false) ];
   4980 			}
   4981 
   4982 			both ""
   4983 				#version 310 es
   4984 				precision mediump float;
   4985 				${DECLARATIONS}
   4986 
   4987 				void main()
   4988 				{
   4989 					${SETUP}
   4990 
   4991 					mat3 a = mat3(	in0.x, in0.y, in0.z,
   4992 									in0.x, in0.y, in0.z,
   4993 									in0.x, in0.y, in0.z);
   4994 
   4995 					mat3 b = mat3(	in0.z, in0.x, in0.y,
   4996 									in0.z, in0.x, in0.y,
   4997 									in0.z, in0.x, in0.y);
   4998 
   4999 					mat3 c = mat3(	in0.z, in0.z, in0.z,
   5000 									in0.y, in0.y, in0.y,
   5001 									in0.x, in0.x, in0.x);
   5002 
   5003 					mat3[] x[] = mat3[][] (	mat3[] (a, b, c, a),
   5004 											mat3[] (b, c, a, b),
   5005 											mat3[] (c, a, b, c) );
   5006 
   5007 					mat3 y[3][4] = x;
   5008 
   5009 					mat3 x0 = y[0][0];
   5010 					mat3 x1 = y[1][3];
   5011 					mat3 x2 = y[2][0];
   5012 
   5013 					float ret0 = x0[2][0];
   5014 					float ret1 = x1[0][2];
   5015 					float ret2 = x2[1][2];
   5016 
   5017 					out0 = bvec3(ret0, ret1, ret2);
   5018 					${OUTPUT}
   5019 				}
   5020 			""
   5021 		end
   5022 
   5023 	end # implicit_to_explicit
   5024 
   5025 	group implicit_to_implicit "Declaring an array of arrays with implicit size and assigning it to another array of arrays with implicit size"
   5026 
   5027 		case float_3x3
   5028 			version 310 es
   5029 			desc "Testing assignment of arrays of arrays with implicit sizes"
   5030 			values
   5031 			{
   5032 				input vec3 in0 = [ vec3(0.5, 1.0, 2.0) | vec3(7.4, -1.0, 2.0) | vec3(3.0, 1.6, -2.0) ];
   5033 				output vec3 out0 = [ vec3(2.0, 0.5, 1.0) | vec3(2.0, 7.4, -1.0) | vec3(-2.0, 3.0, 1.6) ];
   5034 			}
   5035 
   5036 			both ""
   5037 				#version 310 es
   5038 				precision mediump float;
   5039 				${DECLARATIONS}
   5040 
   5041 				void main()
   5042 				{
   5043 					${SETUP}
   5044 					float x[][] = float[][] ( 	float[] (in0.z, in0.x, in0.y),
   5045 												float[] (in0.z, in0.x, in0.y),
   5046 												float[] (in0.z, in0.x, in0.y) );
   5047 
   5048 					float[] y[] = x;
   5049 
   5050 					out0 = vec3(y[0][0], y[1][1], y[2][2]);
   5051 					${OUTPUT}
   5052 				}
   5053 			""
   5054 		end
   5055 
   5056 		case int_2x3
   5057 			version 310 es
   5058 			desc "Testing assignment of arrays of arrays with implicit sizes"
   5059 			values
   5060 			{
   5061 				input ivec3 in0 = [ ivec3(0, 1, 2) | ivec3(7, -1, 2) | ivec3(3, 1, -2) ];
   5062 				output ivec3 out0 = [ ivec3(2, 0, 1) | ivec3(2, 7, -1) | ivec3(-2, 3, 1) ];
   5063 			}
   5064 
   5065 			both ""
   5066 				#version 310 es
   5067 				precision mediump int;
   5068 				precision mediump float;
   5069 				${DECLARATIONS}
   5070 
   5071 				void main()
   5072 				{
   5073 					${SETUP}
   5074 					int[][] x = int[][] ( 	int[] (in0.z, in0.x, in0.y),
   5075 											int[] (in0.z, in0.x, in0.y) );;
   5076 					int y[][] = x;
   5077 
   5078 					out0 = ivec3(y[0][0], y[1][1], y[0][2]);
   5079 					${OUTPUT}
   5080 				}
   5081 			""
   5082 		end
   5083 
   5084 		case bool_3x3x3
   5085 			version 310 es
   5086 			desc "Testing assignment of arrays of arrays with implicit sizes"
   5087 			values
   5088 			{
   5089 				input bvec3 in0 = [ bvec3(false, true, true) ];
   5090 				output bvec3 out0 = [ bvec3(true, false, true) ];
   5091 			}
   5092 
   5093 			both ""
   5094 				#version 310 es
   5095 				precision mediump float;
   5096 				${DECLARATIONS}
   5097 
   5098 				void main()
   5099 				{
   5100 					${SETUP}
   5101 					bool[][] x[] = bool[][][] ( bool[][] (	bool[](in0.z, in0.z, in0.z),
   5102 															bool[](in0.z, in0.z, in0.z),
   5103 															bool[](in0.z, in0.z, in0.z)),
   5104 
   5105 												bool[][] (	bool[](in0.x, in0.x, in0.x),
   5106 															bool[](in0.x, in0.x, in0.x),
   5107 															bool[](in0.x, in0.x, in0.x)),
   5108 
   5109 												bool[][] (	bool[](in0.y, in0.y, in0.y),
   5110 															bool[](in0.y, in0.y, in0.y),
   5111 															bool[](in0.y, in0.y, in0.y)) );
   5112 
   5113 					bool[] y[][] = x;
   5114 
   5115 					out0 = bvec3(y[0][0][0], y[1][1][1], y[2][2][2]);
   5116 					${OUTPUT}
   5117 				}
   5118 			""
   5119 		end
   5120 
   5121 		case struct_5x5x4
   5122 			version 310 es
   5123 			desc "Testing assignment of arrays of arrays with implicit sizes"
   5124 			values
   5125 			{
   5126 				input vec3 in0 = [ vec3(0.5, 1.0, 2.0) ];
   5127 				output vec3 out0 = [ vec3(-1.0, -0.5, 2.0) ];
   5128 			}
   5129 
   5130 			both ""
   5131 				#version 310 es
   5132 				precision mediump float;
   5133 				${DECLARATIONS}
   5134 
   5135 				struct Test
   5136 				{
   5137 					float f;
   5138 					vec3 v;
   5139 				};
   5140 
   5141 				void main()
   5142 				{
   5143 					${SETUP}
   5144 
   5145 					Test a = Test(in0.z, vec3(in0.x, in0.y, in0.z));
   5146 					Test b = Test(in0.y, vec3(-in0.z, -in0.x, -in0.y));
   5147 					Test c = Test(in0.x, vec3(-in0.y, in0.z, -in0.x));
   5148 
   5149 					Test[] x[][] = Test[][][] (	Test[][] (	Test[] (c, c, c, c),
   5150 															Test[] (b, b, b, b),
   5151 															Test[] (a, a, a, a),
   5152 															Test[] (c, c, c, c),
   5153 															Test[] (b, b, b, b) ),
   5154 
   5155 												Test[][] (	Test[] (a, a, a, a),
   5156 															Test[] (b, b, b, b),
   5157 															Test[] (c, c, c, c),
   5158 															Test[] (a, a, a, a),
   5159 															Test[] (b, b, b, b) ),
   5160 
   5161 												Test[][] (	Test[] (b, b, b, b),
   5162 															Test[] (c, c, c, c),
   5163 															Test[] (a, a, a, a),
   5164 															Test[] (b, b, b, b),
   5165 															Test[] (c, c, c, c) ),
   5166 
   5167 												Test[][] (	Test[] (c, c, c, c),
   5168 															Test[] (b, b, b, b),
   5169 															Test[] (a, a, a, a),
   5170 															Test[] (c, c, c, c),
   5171 															Test[] (b, b, b, b) ),
   5172 
   5173 												Test[][] (	Test[] (a, a, a, a),
   5174 															Test[] (b, b, b, b),
   5175 															Test[] (c, c, c, c),
   5176 															Test[] (a, a, a, a),
   5177 															Test[] (b, b, b, b) ) );
   5178 
   5179 					Test y[][][] = x;
   5180 
   5181 					out0 = vec3(y[0][0][0].v.x, y[1][1][1].v.y, y[4][3][3].v.z);
   5182 					${OUTPUT}
   5183 				}
   5184 			""
   5185 		end
   5186 
   5187 		case vec3_1x3
   5188 			version 310 es
   5189 			desc "Testing assignment of arrays of arrays with implicit sizes"
   5190 			values
   5191 			{
   5192 				input vec3 in0 = 	[ vec3(0.5, 1.0, 2.0) | vec3(-0.5, 11.2, -1.0) ];
   5193 				output vec3 out0 = [ vec3(0.5, -2.0, 1.0) | vec3(-0.5, 1.0, 11.2) ];
   5194 			}
   5195 
   5196 			both ""
   5197 				#version 310 es
   5198 				precision mediump float;
   5199 				${DECLARATIONS}
   5200 
   5201 				void main()
   5202 				{
   5203 					${SETUP}
   5204 					vec3 x[][] = vec3[][] (	vec3[] (vec3(in0.x, in0.y, -in0.z)	,
   5205 													vec3(in0.y, -in0.z, in0.x)	,
   5206 													vec3(-in0.z, in0.x, in0.y)) );
   5207 
   5208 					vec3 y[][] = x;
   5209 
   5210 					out0 = vec3(y[0][0].x, y[0][1].y, y[0][2].z);
   5211 					${OUTPUT}
   5212 				}
   5213 			""
   5214 		end
   5215 
   5216 		case ivec3_3x1x3
   5217 			version 310 es
   5218 			desc "Testing assignment of arrays of arrays with implicit sizes"
   5219 			values
   5220 			{
   5221 				input ivec3 in0 = 	[ ivec3(0, 1, 2) | ivec3(5, 11, -1) ];
   5222 				output ivec3 out0 = [ ivec3(0, -2, 1) | ivec3(5, 1, 11) ];
   5223 			}
   5224 
   5225 			both ""
   5226 				#version 310 es
   5227 				precision mediump int;
   5228 				precision mediump float;
   5229 				${DECLARATIONS}
   5230 
   5231 				void main()
   5232 				{
   5233 					${SETUP}
   5234 					ivec3[][][] x = ivec3[][][] (	ivec3[][] (	ivec3[] (	ivec3(in0.x, in0.y, -in0.z),
   5235 																			ivec3(0.0, 0.0, 0.0),
   5236 																			ivec3(0.0, 0.0, 0.0)) ),
   5237 
   5238 													ivec3[][] ( ivec3[] (	ivec3(0.0, 0.0, 0.0),
   5239 																			ivec3(in0.y, -in0.z, in0.x),
   5240 																			ivec3(0.0, 0.0, 0.0)) ),
   5241 
   5242 													ivec3[][] (	ivec3[] (	ivec3(0.0, 0.0, 0.0),
   5243 																			ivec3(0.0, 0.0, 0.0),
   5244 																			ivec3(-in0.z, in0.x, in0.y)) ) );
   5245 
   5246 					ivec3[] y[][] = x;
   5247 
   5248 					out0 = ivec3(y[0][0][0].x, y[1][0][1].y, y[2][0][2].z);
   5249 					${OUTPUT}
   5250 				}
   5251 			""
   5252 		end
   5253 
   5254 		case bvec3_3x1
   5255 			version 310 es
   5256 			desc "Testing assignment of arrays of arrays with implicit sizes"
   5257 			values
   5258 			{
   5259 				input bvec3 in0 = 	[ bvec3(true, false, true) ];
   5260 				output bvec3 out0 = [ bvec3(true, true, false) ];
   5261 			}
   5262 
   5263 			both ""
   5264 				#version 310 es
   5265 				precision mediump float;
   5266 				${DECLARATIONS}
   5267 
   5268 				void main()
   5269 				{
   5270 					${SETUP}
   5271 					bvec3[][] x = bvec3[][] (	bvec3[] ( bvec3(in0.x, in0.y, in0.z)),
   5272 												bvec3[] ( bvec3(in0.y, in0.z, in0.x)),
   5273 												bvec3[] ( bvec3(in0.z, in0.x, in0.y)) );
   5274 
   5275 					bvec3[][] y = x;
   5276 
   5277 					out0 = bvec3(y[0][0].x, y[1][0].y, y[2][0].z);
   5278 					${OUTPUT}
   5279 				}
   5280 			""
   5281 		end
   5282 
   5283 		case mat3_3x2
   5284 			version 310 es
   5285 			desc "Testing assignment of arrays of arrays with implicit sizes"
   5286 			values
   5287 			{
   5288 				input vec3 in0 = [ vec3(0.5, 1.0, 2.0) | vec3(-1.5, 0.0, -2.3) ];
   5289 				output vec3 out0 = [ vec3(0.5, -1.0, 1.0) | vec3(-1.5, 0.0, 0.0) ];
   5290 			}
   5291 
   5292 			both ""
   5293 				#version 310 es
   5294 				precision mediump float;
   5295 				${DECLARATIONS}
   5296 
   5297 				void main()
   5298 				{
   5299 					${SETUP}
   5300 					mat3[][] a = mat3[][] (	mat3[] ( mat3(	in0.x, in0.y, in0.z,
   5301 															in0.x, in0.y, in0.z,
   5302 															in0.x, in0.y, in0.z),
   5303 													 mat3(	in0.z, in0.x, -in0.y,
   5304 															in0.z, in0.x, -in0.y,
   5305 															in0.z, in0.x, -in0.y)),
   5306 
   5307 											mat3[] ( mat3(	-in0.z, -in0.z, in0.z,
   5308 															-in0.y, -in0.y, in0.y,
   5309 															-in0.x, -in0.x, in0.x),
   5310 													 mat3(	in0.x, in0.y, in0.z,
   5311 															in0.x, in0.y, in0.z,
   5312 															in0.x, in0.y, in0.z)),
   5313 
   5314 											mat3[] ( mat3(	in0.z, in0.x, -in0.y,
   5315 															in0.z, in0.x, -in0.y,
   5316 															in0.z, in0.x, -in0.y),
   5317 													 mat3(	-in0.z, -in0.z, in0.z,
   5318 															-in0.y, -in0.y, in0.y,
   5319 															-in0.x, -in0.x, in0.x)) );
   5320 
   5321 					mat3[] y[] = a;
   5322 
   5323 					mat3 a0 = y[0][0];
   5324 					mat3 a1 = y[0][1];
   5325 					mat3 a2 = y[2][1];
   5326 
   5327 					float ret0 = a0[2][0];
   5328 					float ret1 = a1[0][2];
   5329 					float ret2 = a2[1][2];
   5330 
   5331 					out0 = vec3(ret0, ret1, ret2);
   5332 					${OUTPUT}
   5333 				}
   5334 			""
   5335 		end
   5336 
   5337 		case mat3_3x3x3
   5338 			version 310 es
   5339 			desc "Testing assignment of arrays of arrays with implicit sizes"
   5340 			values
   5341 			{
   5342 				input ivec3 in0 = [ ivec3(0, 1, 2) | ivec3(-1, 0, -2) ];
   5343 				output ivec3 out0 = [ ivec3(0, -1, 1) | ivec3(-1, 0, 0) ];
   5344 			}
   5345 
   5346 			both ""
   5347 				#version 310 es
   5348 				precision mediump int;
   5349 				precision mediump float;
   5350 				${DECLARATIONS}
   5351 
   5352 				void main()
   5353 				{
   5354 					${SETUP}
   5355 
   5356 					mat3 a = mat3(	in0.x, in0.y, in0.z,
   5357 									in0.x, in0.y, in0.z,
   5358 									in0.x, in0.y, in0.z);
   5359 					mat3 b = mat3(	in0.z, in0.x, -in0.y,
   5360 									in0.z, in0.x, -in0.y,
   5361 									in0.z, in0.x, -in0.y);
   5362 					mat3 c = mat3(	-in0.z, -in0.z, in0.z,
   5363 									-in0.y, -in0.y, in0.y,
   5364 									-in0.x, -in0.x, in0.x);
   5365 
   5366 					mat3[][][] x = mat3[][][] (	mat3[][] ( 	mat3[] (a, a, a),
   5367 															mat3[] (b, b, b),
   5368 															mat3[] (c, c, c)),
   5369 
   5370 												mat3[][] ( 	mat3[] (b, b, b),
   5371 															mat3[] (a, a, a),
   5372 															mat3[] (c, c, c)),
   5373 
   5374 												mat3[][] ( 	mat3[] (c, c, c),
   5375 															mat3[] (a, a, a),
   5376 															mat3[] (b, b, b)) );
   5377 
   5378 					mat3 y[][][] = x;
   5379 
   5380 					mat3 x0 = y[0][0][0];
   5381 					mat3 x1 = y[1][0][0];
   5382 					mat3 x2 = y[2][0][0];
   5383 
   5384 					float ret0 = x0[2][0];
   5385 					float ret1 = x1[0][2];
   5386 					float ret2 = x2[1][2];
   5387 
   5388 					out0 = ivec3(ret0, ret1, ret2);
   5389 					${OUTPUT}
   5390 				}
   5391 			""
   5392 		end
   5393 
   5394 		case mat3_3x4
   5395 			version 310 es
   5396 			desc "Testing assignment of arrays of arrays with implicit sizes"
   5397 			values
   5398 			{
   5399 				input bvec3 in0 = [ bvec3(true, false, true) ];
   5400 				output bvec3 out0 = [ bvec3(true, false, false) ];
   5401 			}
   5402 
   5403 			both ""
   5404 				#version 310 es
   5405 				precision mediump float;
   5406 				${DECLARATIONS}
   5407 
   5408 				void main()
   5409 				{
   5410 					${SETUP}
   5411 
   5412 					mat3 a = mat3(	in0.x, in0.y, in0.z,
   5413 									in0.x, in0.y, in0.z,
   5414 									in0.x, in0.y, in0.z);
   5415 
   5416 					mat3 b = mat3(	in0.z, in0.x, in0.y,
   5417 									in0.z, in0.x, in0.y,
   5418 									in0.z, in0.x, in0.y);
   5419 
   5420 					mat3 c = mat3(	in0.z, in0.z, in0.z,
   5421 									in0.y, in0.y, in0.y,
   5422 									in0.x, in0.x, in0.x);
   5423 
   5424 					mat3[] x[] = mat3[][] (	mat3[] (a, b, c, a),
   5425 											mat3[] (b, c, a, b),
   5426 											mat3[] (c, a, b, c) );
   5427 
   5428 					mat3 y[][] = x;
   5429 
   5430 					mat3 x0 = y[0][0];
   5431 					mat3 x1 = y[1][3];
   5432 					mat3 x2 = y[2][0];
   5433 
   5434 					float ret0 = x0[2][0];
   5435 					float ret1 = x1[0][2];
   5436 					float ret2 = x2[1][2];
   5437 
   5438 					out0 = bvec3(ret0, ret1, ret2);
   5439 					${OUTPUT}
   5440 				}
   5441 			""
   5442 		end
   5443 
   5444 	end # implicit_to_implicit
   5445 
   5446 end # assignment
   5447 
   5448 group length "Testing the array length property with arrays of arrays"
   5449 
   5450 	case float
   5451 		version 310 es
   5452 		desc "Testing the array length property with arrays of arrays"
   5453 		values
   5454 		{
   5455 			input vec3 in0 = [ vec3(0.5, 1.0, 2.0) ];
   5456 			output ivec2 out0 = [ ivec2(3, 5) ];
   5457 			output ivec3 out1 = [ ivec3(3, 4, 5) ];
   5458 			output ivec3 out2 = [ ivec3(1, 2, 13) ];
   5459 		}
   5460 
   5461 		both ""
   5462 			#version 310 es
   5463 			precision mediump float;
   5464 			${DECLARATIONS}
   5465 
   5466 			void main()
   5467 			{
   5468 				${SETUP}
   5469 				float[][] x = float[3][5] (	float[5] (in0.z, in0.x, in0.y, in0.x, in0.y),
   5470 											float[5] (in0.z, in0.x, in0.y, in0.x, in0.y),
   5471 											float[5] (in0.z, in0.x, in0.y, in0.x, in0.y) );
   5472 
   5473 				float[][] y[] = float[][][] (	float[][] ( float[] (in0.z, in0.x, in0.y, in0.x, in0.y),
   5474 															float[] (in0.z, in0.x, in0.y, in0.x, in0.y),
   5475 															float[] (in0.z, in0.x, in0.y, in0.x, in0.y),
   5476 															float[] (in0.z, in0.x, in0.y, in0.x, in0.y) ),
   5477 
   5478 												float[][] ( float[] (in0.z, in0.x, in0.y, in0.x, in0.y),
   5479 															float[] (in0.z, in0.x, in0.y, in0.x, in0.y),
   5480 															float[] (in0.z, in0.x, in0.y, in0.x, in0.y),
   5481 															float[] (in0.z, in0.x, in0.y, in0.x, in0.y) ),
   5482 
   5483 												float[][] ( float[] (in0.z, in0.x, in0.y, in0.x, in0.y),
   5484 															float[] (in0.z, in0.x, in0.y, in0.x, in0.y),
   5485 															float[] (in0.z, in0.x, in0.y, in0.x, in0.y),
   5486 															float[] (in0.z, in0.x, in0.y, in0.x, in0.y) ) );
   5487 
   5488 				float[1][2][13] z;
   5489 
   5490 				out0 = ivec2(x.length(), x[0].length());
   5491 				out1 = ivec3(y.length(), y[0].length(), y[0][0].length());
   5492 				out2 = ivec3(z.length(), z[0].length(), z[0][0].length());
   5493 				${OUTPUT}
   5494 			}
   5495 		""
   5496 	end
   5497 
   5498 	case int
   5499 		version 310 es
   5500 		desc "Testing the array length property with arrays of arrays"
   5501 		values
   5502 		{
   5503 			input ivec3 in0 = [ ivec3(0, 1, 2) ];
   5504 			output ivec2 out0 = [ ivec2(2, 7) ];
   5505 			output ivec3 out1 = [ ivec3(1, 2, 3) ];
   5506 			output ivec3 out2 = [ ivec3(13, 7, 1) ];
   5507 		}
   5508 
   5509 		both ""
   5510 			#version 310 es
   5511 			precision mediump int;
   5512 			precision mediump float;
   5513 			${DECLARATIONS}
   5514 
   5515 			void main()
   5516 			{
   5517 				${SETUP}
   5518 
   5519 				int[] x[] = int[][] (	int[] (in0.z, in0.x, in0.y, in0.x, in0.y, in0.z, in0.x),
   5520 										int[] (in0.z, in0.x, in0.y, in0.x, in0.y, in0.z, in0.x) );
   5521 
   5522 				int[] y[][] = int[1][2][3] ( int[2][3] ( 	int[3] (in0.z, in0.x, in0.y),
   5523 															int[3] (in0.z, in0.x, in0.y) ));
   5524 
   5525 				int z[13][7][1];
   5526 
   5527 				out0 = ivec2(x.length(), x[0].length());
   5528 				out1 = ivec3(y.length(), y[0].length(), y[0][0].length());
   5529 				out2 = ivec3(z.length(), z[0].length(), z[0][0].length());
   5530 				${OUTPUT}
   5531 			}
   5532 		""
   5533 	end
   5534 
   5535 	case bool
   5536 		version 310 es
   5537 		desc "Testing the array length property with arrays of arrays"
   5538 		values
   5539 		{
   5540 			input bvec3 in0 = [ bvec3(true, false, true) ];
   5541 			output ivec2 out0 = [ ivec2(4, 3) ];
   5542 			output ivec3 out1 = [ ivec3(2, 1, 3) ];
   5543 			output ivec3 out2 = [ ivec3(7, 8, 9) ];
   5544 		}
   5545 
   5546 		both ""
   5547 			#version 310 es
   5548 			precision mediump float;
   5549 			${DECLARATIONS}
   5550 
   5551 			void main()
   5552 			{
   5553 				${SETUP}
   5554 				bool x[4][3] = bool[][] (	bool[] (in0.z, in0.x, in0.y),
   5555 											bool[] (in0.z, in0.x, in0.y),
   5556 											bool[] (in0.z, in0.x, in0.y),
   5557 											bool[] (in0.z, in0.x, in0.y) );
   5558 
   5559 				bool y[2][1][3] = bool[][][] ( 	bool[][] (	bool[] (in0.z, in0.x, in0.y) ),
   5560 												bool[][] (	bool[] (in0.z, in0.x, in0.y) ) );
   5561 
   5562 				int z[7][8][9];
   5563 
   5564 				out0 = ivec2(x.length(), x[0].length());
   5565 				out1 = ivec3(y.length(), y[0].length(), y[0][0].length());
   5566 				out2 = ivec3(z.length(), z[0].length(), z[0][0].length());
   5567 				${OUTPUT}
   5568 			}
   5569 		""
   5570 	end
   5571 
   5572 	case struct
   5573 		version 310 es
   5574 		desc "Testing the array length property with arrays of arrays"
   5575 		values
   5576 		{
   5577 			input vec3 in0 = [ vec3(0.5, 1.0, 2.0) ];
   5578 			output ivec2 out0 = [ ivec2(5, 1) ];
   5579 			output ivec3 out1 = [ ivec3(5, 4, 2) ];
   5580 			output ivec3 out2 = [ ivec3(100, 101, 102) ];
   5581 		}
   5582 
   5583 		both ""
   5584 			#version 310 es
   5585 			precision mediump float;
   5586 			${DECLARATIONS}
   5587 
   5588 			struct Test
   5589 			{
   5590 				float f;
   5591 				vec3 v;
   5592 			};
   5593 
   5594 			void main()
   5595 			{
   5596 				${SETUP}
   5597 
   5598 				Test a = Test(in0.z, vec3(in0.x, in0.y, in0.z));
   5599 				Test b = Test(in0.y, vec3(-in0.z, -in0.x, -in0.y));
   5600 				Test c = Test(in0.x, vec3(-in0.y, in0.z, -in0.x));
   5601 
   5602 				Test x[5][1] = Test[5][1] (	Test[1] (a),
   5603 											Test[1] (b),
   5604 											Test[1] (c),
   5605 											Test[1] (a),
   5606 											Test[1] (b) );
   5607 
   5608 				Test y[][][] = Test[][][] ( Test[][] (	Test[] (a, b),
   5609 														Test[] (a, b),
   5610 														Test[] (a, b),
   5611 														Test[] (a, b) ),
   5612 											Test[][] (	Test[] (a, b),
   5613 														Test[] (a, b),
   5614 														Test[] (a, b),
   5615 														Test[] (a, b) ),
   5616 											Test[][] (	Test[] (a, b),
   5617 														Test[] (a, b),
   5618 														Test[] (a, b),
   5619 														Test[] (a, b) ),
   5620 											Test[][] (	Test[] (a, b),
   5621 														Test[] (a, b),
   5622 														Test[] (a, b),
   5623 														Test[] (a, b) ),
   5624 											Test[][] (	Test[] (a, b),
   5625 														Test[] (a, b),
   5626 														Test[] (a, b),
   5627 														Test[] (a, b) ) );
   5628 
   5629 				int z[100][101][102];
   5630 
   5631 				out0 = ivec2(x.length(), x[0].length());
   5632 				out1 = ivec3(y.length(), y[0].length(), y[0][0].length());
   5633 				out2 = ivec3(z.length(), z[0].length(), z[0][0].length());
   5634 				${OUTPUT}
   5635 			}
   5636 		""
   5637 	end
   5638 
   5639 	case mat3
   5640 		version 310 es
   5641 		desc "Testing the array length property with arrays of arrays"
   5642 		values
   5643 		{
   5644 			input ivec3 in0 = [ ivec3(0, 1, 2)];
   5645 			output ivec2 out0 = [ ivec2(3, 4) ];
   5646 			output ivec3 out1 = [ ivec3(1, 2, 4) ];
   5647 			output ivec3 out2 = [ ivec3(3, 101, 88) ];
   5648 		}
   5649 
   5650 		both ""
   5651 			#version 310 es
   5652 			precision mediump int;
   5653 			precision mediump float;
   5654 			${DECLARATIONS}
   5655 
   5656 			void main()
   5657 			{
   5658 				${SETUP}
   5659 
   5660 				mat3 a = mat3(	in0.x, in0.y, in0.z,
   5661 								in0.x, in0.y, in0.z,
   5662 								in0.x, in0.y, in0.z);
   5663 				mat3 b = mat3(	in0.z, in0.x, -in0.y,
   5664 								in0.z, in0.x, -in0.y,
   5665 								in0.z, in0.x, -in0.y);
   5666 				mat3 c = mat3(	-in0.z, -in0.z, in0.z,
   5667 								-in0.y, -in0.y, in0.y,
   5668 								-in0.x, -in0.x, in0.x);
   5669 
   5670 				mat3[3][4] x = mat3[][] (	mat3[] (a, a, a, a),
   5671 											mat3[] (b, b, b, b),
   5672 											mat3[] (c, c, c, c) );
   5673 
   5674 				mat3 y[][][] = mat3[][][] ( mat3[][] (	mat3[] (a, a, a, a),
   5675 														mat3[] (b, b, b, b) ) );
   5676 
   5677 
   5678 				mat3 z[3][101][88];
   5679 
   5680 				out0 = ivec2(x.length(), x[0].length());
   5681 				out1 = ivec3(y.length(), y[0].length(), y[0][0].length());
   5682 				out2 = ivec3(z.length(), z[0].length(), z[0][0].length());
   5683 				${OUTPUT}
   5684 			}
   5685 		""
   5686 	end
   5687 
   5688 	case constant_expression
   5689 		version 310 es
   5690 		desc "Testing the array length property with arrays of arrays"
   5691 		values
   5692 		{
   5693 			input ivec3 in0 = [ ivec3(0, 1, 2) ];
   5694 			output ivec3 out0 = [ ivec3(2, 7, 3) ];
   5695 		}
   5696 
   5697 		both ""
   5698 			#version 310 es
   5699 			precision mediump int;
   5700 			precision mediump float;
   5701 			${DECLARATIONS}
   5702 
   5703 			void main()
   5704 			{
   5705 				${SETUP}
   5706 
   5707 				int[] x[] = int[][] (	int[] (in0.z, in0.x, in0.y, in0.x, in0.y, in0.z, in0.x),
   5708 										int[] (in0.z, in0.x, in0.y, in0.x, in0.y, in0.z, in0.x) );
   5709 
   5710 				int[] y[][] = int[1][2][3] ( int[2][3] ( 	int[3] (in0.z, in0.x, in0.y),
   5711 															int[3] (in0.z, in0.x, in0.y) ));
   5712 
   5713 				int z[13][7][1];
   5714 
   5715 				int ret[x.length()][z[0].length()][y[0][0].length()];
   5716 				out0 = ivec3(ret.length(), ret[0].length(), ret[0][0].length());
   5717 				${OUTPUT}
   5718 			}
   5719 		""
   5720 	end
   5721 
   5722 end # length
   5723 
   5724 group array_access "Test accessing arrays of arrays"
   5725 
   5726 	case constant_expression_access
   5727 		version 310 es
   5728 		desc "Testing accessing arrays of arrays"
   5729 		values
   5730 		{
   5731 			input vec3 in0 = [ vec3(0.5, 1.0, 2.0) ];
   5732 			output vec3 out0 = [ vec3(-1.0, 0.5, -0.5) ];
   5733 		}
   5734 
   5735 		both ""
   5736 			#version 310 es
   5737 			precision mediump float;
   5738 			${DECLARATIONS}
   5739 
   5740 			const int a = 1;
   5741 
   5742 			void main ()
   5743 			{
   5744 				${SETUP}
   5745 				const int b = 2;
   5746 				float x = float[2][6] ( float[] (in0.x, in0.y, in0.z, -in0.z, -in0.y, -in0.x),
   5747 										float[] (-in0.z, -in0.y, -in0.x, in0.x, in0.y, in0.z) ) [a][a];
   5748 
   5749 				float y = float[][][] (	float[][] ( 	float[] (in0.x, in0.y, in0.z, -in0.z, -in0.y, -in0.x),
   5750 														float[] (-in0.z, -in0.y, -in0.x, in0.x, in0.y, in0.z) ),
   5751 										float[][] (		float[] (in0.x, in0.y, in0.z, -in0.z, -in0.y, -in0.x),
   5752 														float[] (-in0.z, -in0.y, -in0.x, in0.x, in0.y, in0.z) ),
   5753 										float[][] (		float[] (in0.x, in0.y, in0.z, -in0.z, -in0.y, -in0.x),
   5754 														float[] (-in0.z, -in0.y, -in0.x, in0.x, in0.y, in0.z) ),
   5755 										float[][] (		float[] (in0.x, in0.y, in0.z, -in0.z, -in0.y, -in0.x),
   5756 														float[] (-in0.z, -in0.y, -in0.x, in0.x, in0.y, in0.z) ),
   5757 										float[][] (		float[] (in0.x, in0.y, in0.z, -in0.z, -in0.y, -in0.x),
   5758 														float[] (-in0.z, -in0.y, -in0.x, in0.x, in0.y, in0.z) )) [b+2][b-1][b+1];
   5759 
   5760 				float z = float[][] (	float[] (-in0.z, -in0.y, -in0.x, in0.x, in0.y, in0.z),
   5761 										float[] (0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
   5762 										float[] (in0.x, in0.y, in0.z, -in0.z, -in0.y, -in0.x) ) [2][5];
   5763 
   5764 				out0 = vec3(x, y, z);
   5765 				${OUTPUT}
   5766 			}
   5767 		""
   5768 	end # constant_expression_access
   5769 
   5770 	case dynamic_expression_access
   5771 		version 310 es
   5772 		desc "Testing accessing arrays of arrays"
   5773 		values
   5774 		{
   5775 			input vec3 in0 = [ vec3(0.5, 1.0, 2.0) ];
   5776 			input ivec3 in1 = ivec3(3, 2, 1);
   5777 			output vec3 out0 = [ vec3(0.5, 2.0, -1.0) ];
   5778 		}
   5779 
   5780 		both ""
   5781 			#version 310 es
   5782 			precision mediump float;
   5783 			${DECLARATIONS}
   5784 
   5785 			void main ()
   5786 			{
   5787 				${SETUP}
   5788 				float x = float[2][6] ( float[] (in0.x, in0.y, in0.z, -in0.z, -in0.y, -in0.x),
   5789 										float[] (-in0.z, -in0.y, -in0.x, in0.x, in0.y, in0.z) ) [in1.z][in1.x];
   5790 
   5791 				float y = float[][][] (	float[][] ( float[] (in0.x, in0.y, in0.z, -in0.z, -in0.y, -in0.x),
   5792 													float[] (-in0.z, -in0.y, -in0.x, in0.x, in0.y, in0.z) ),
   5793 										float[][] ( float[] (in0.x, in0.y, in0.z, -in0.z, -in0.y, -in0.x),
   5794 													float[] (-in0.z, -in0.y, -in0.x, in0.x, in0.y, in0.z) ),
   5795 										float[][] ( float[] (in0.x, in0.y, in0.z, -in0.z, -in0.y, -in0.x),
   5796 													float[] (-in0.z, -in0.y, -in0.x, in0.x, in0.y, in0.z) ),
   5797 										float[][] ( float[] (in0.x, in0.y, in0.z, -in0.z, -in0.y, -in0.x),
   5798 													float[] (-in0.z, -in0.y, -in0.x, in0.x, in0.y, in0.z) ),
   5799 										float[][] ( float[] (in0.x, in0.y, in0.z, -in0.z, -in0.y, -in0.x),
   5800 													float[] (-in0.z, -in0.y, -in0.x, in0.x, in0.y, in0.z) )) [in1.x+1][in1.y-1][in1.z+4];
   5801 
   5802 				float z = float[][] ( 	float[] (0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
   5803 										float[] (-in0.z, -in0.y, -in0.x, in0.x, in0.y, in0.z),
   5804 										float[] (in0.x, in0.y, in0.z, -in0.z, -in0.y, -in0.x) ) [in1.x-in1.y][in1.z];
   5805 
   5806 				out0 = vec3(x, y, z);
   5807 				${OUTPUT}
   5808 			}
   5809 		""
   5810 	end # dynamic_expression_access
   5811 
   5812 end # array_access
   5813 
   5814 
   5815 group single_statement_multiple_declarations "Testing multiple arrays of arrays declarations in a single statement"
   5816 
   5817 	group explicit_constructor "Testing single statement with multiple arrays of arrays with explicit constructor"
   5818 
   5819 		case float_2_dimensions
   5820 			version 310 es
   5821 			desc "Testing multiple two dimensional array declarations in a single statement"
   5822 			values
   5823 			{
   5824 				input vec4 in0 = [ vec4(0.5, 1.0, 2.0, 0.2) | vec4(7.4, -1.0, 2.0, -1.3) | vec4(3.0, 1.6, -2.0, 0.5) ];
   5825 				output vec4 out0 = [ vec4(2.5, 0.7, 2.0, 2.5) | vec4(9.4, 6.1, -2.0, 9.4) | vec4(1.0, 3.5, 3.2, 1.0) ];
   5826 			}
   5827 
   5828 			both ""
   5829 				#version 310 es
   5830 				precision mediump float;
   5831 				${DECLARATIONS}
   5832 
   5833 				void main()
   5834 				{
   5835 					${SETUP}
   5836 					float[][] x = float[3][3] (	float[3] (in0.z, in0.x, in0.y),
   5837 												float[3] (in0.z, in0.x, in0.y),
   5838 												float[3] (in0.z, in0.x, in0.y) ),
   5839 
   5840 							  y = float[3][4] ( float[4] (in0.z, in0.x, in0.w, in0.y),
   5841 												float[4] (in0.z, in0.x, in0.w, in0.y),
   5842 												float[4] (in0.z, in0.x, in0.w, in0.y) );
   5843 
   5844 					out0 = vec4(x[0][0]+y[1][1], x[1][1]+y[2][2], x[2][2]+y[2][3], x[0][1]+y[0][0]);
   5845 					${OUTPUT}
   5846 				}
   5847 			""
   5848 		end
   5849 
   5850 		case int_3_dimensions
   5851 			version 310 es
   5852 			desc "Testing multiple three dimensional array declarations in a single statement"
   5853 			values
   5854 			{
   5855 				input ivec4 in0 = [ ivec4(0, 1, 2, 0) | ivec4(7, -1, 2, -1) | ivec4(3, 1, -2, 0) ];
   5856 				output ivec4 out0 = [ ivec4(2, 1, 2, 1) | ivec4(9, 6, 1, -2) | ivec4(1, 4, -2, 1) ];
   5857 			}
   5858 
   5859 			both ""
   5860 				#version 310 es
   5861 				precision mediump int;
   5862 				precision mediump float;
   5863 				${DECLARATIONS}
   5864 
   5865 				void main()
   5866 				{
   5867 					${SETUP}
   5868 					int[][][] x = int[4][4][4] (int[4][4] (	(int[4] (in0.z, in0.x, in0.w, in0.y)),
   5869 															(int[4] (in0.z, in0.x, in0.w, in0.y)),
   5870 															(int[4] (in0.z, in0.x, in0.w, in0.y)),
   5871 															(int[4] (in0.z, in0.x, in0.w, in0.y))),
   5872 
   5873 												int[4][4] (	(int[4] (in0.z, in0.x, in0.w, in0.y)),
   5874 															(int[4] (in0.z, in0.x, in0.w, in0.y)),
   5875 															(int[4] (in0.z, in0.x, in0.w, in0.y)),
   5876 															(int[4] (in0.z, in0.x, in0.w, in0.y))),
   5877 
   5878 												int[4][4] (	(int[4] (in0.z, in0.x, in0.w, in0.y)),
   5879 															(int[4] (in0.z, in0.x, in0.w, in0.y)),
   5880 															(int[4] (in0.z, in0.x, in0.w, in0.y)),
   5881 															(int[4] (in0.z, in0.x, in0.w, in0.y))),
   5882 
   5883 												int[4][4] (	(int[4] (in0.z, in0.x, in0.w, in0.y)),
   5884 															(int[4] (in0.z, in0.x, in0.w, in0.y)),
   5885 															(int[4] (in0.z, in0.x, in0.w, in0.y)),
   5886 															(int[4] (in0.z, in0.x, in0.w, in0.y))) ),
   5887 
   5888 							  y = int[2][2][4] (int[2][4] (	(int[4] (in0.x, in0.y, in0.z, in0.w)),
   5889 															(int[4] (in0.x, in0.y, in0.z, in0.w))),
   5890 
   5891 												int[2][4] (	(int[4] (in0.x, in0.y, in0.z, in0.w)),
   5892 															(int[4] (in0.x, in0.y, in0.z, in0.w))) );
   5893 
   5894 					out0 = ivec4(x[0][0][0] + y[0][0][0], x[1][1][1] + y[1][1][1], x[2][2][2] + y[0][0][2], x[3][3][3] + y[0][0][3]);
   5895 					${OUTPUT}
   5896 				}
   5897 			""
   5898 		end
   5899 
   5900 	end # explicit_constructor
   5901 
   5902 	group implicit_constructor "Testing single statement with multiple arrays of arrays with implicit constructor"
   5903 
   5904 		case float_2_dimensions
   5905 			version 310 es
   5906 			desc "Testing multiple two dimensional array declarations in a single statement"
   5907 			values
   5908 			{
   5909 				input vec4 in0 = [ vec4(0.5, 1.0, 2.0, 0.2) | vec4(7.4, -1.0, 2.0, -1.3) | vec4(3.0, 1.6, -2.0, 0.5) ];
   5910 				output vec4 out0 = [ vec4(2.5, 0.7, 2.0, 2.5) | vec4(9.4, 6.1, -2.0, 9.4) | vec4(1.0, 3.5, 3.2, 1.0) ];
   5911 			}
   5912 
   5913 			both ""
   5914 				#version 310 es
   5915 				precision mediump float;
   5916 				${DECLARATIONS}
   5917 
   5918 				void main()
   5919 				{
   5920 					${SETUP}
   5921 					float[][] x = float[][] (float[] (in0.z, in0.x, in0.y),
   5922 											float[] (in0.z, in0.x, in0.y),
   5923 											float[] (in0.z, in0.x, in0.y) ),
   5924 
   5925 							  y = float[][] (float[] (in0.z, in0.x, in0.w, in0.y),
   5926 											float[] (in0.z, in0.x, in0.w, in0.y),
   5927 											float[] (in0.z, in0.x, in0.w, in0.y) );
   5928 
   5929 					out0 = vec4(x[0][0]+y[1][1], x[1][1]+y[2][2], x[2][2]+y[2][3], x[0][1]+y[0][0]);
   5930 					${OUTPUT}
   5931 				}
   5932 			""
   5933 		end
   5934 
   5935 		case int_3_dimensions
   5936 			version 310 es
   5937 			desc "Testing multiple three dimensional array declarations in a single statement"
   5938 			values
   5939 			{
   5940 				input ivec4 in0 = [ ivec4(0, 1, 2, 0) | ivec4(7, -1, 2, -1) | ivec4(3, 1, -2, 0) ];
   5941 				output ivec4 out0 = [ ivec4(2, 1, 2, 1) | ivec4(9, 6, 1, -2) | ivec4(1, 4, -2, 1) ];
   5942 			}
   5943 
   5944 			both ""
   5945 				#version 310 es
   5946 				precision mediump int;
   5947 				precision mediump float;
   5948 				${DECLARATIONS}
   5949 
   5950 				void main()
   5951 				{
   5952 					${SETUP}
   5953 					int[][][] x = int[][][] (int[][] (	(int[] (in0.z, in0.x, in0.w, in0.y)),
   5954 														(int[] (in0.z, in0.x, in0.w, in0.y)),
   5955 														(int[] (in0.z, in0.x, in0.w, in0.y)),
   5956 														(int[] (in0.z, in0.x, in0.w, in0.y))),
   5957 
   5958 											int[][] (	(int[] (in0.z, in0.x, in0.w, in0.y)),
   5959 														(int[] (in0.z, in0.x, in0.w, in0.y)),
   5960 														(int[] (in0.z, in0.x, in0.w, in0.y)),
   5961 														(int[] (in0.z, in0.x, in0.w, in0.y))),
   5962 
   5963 											int[][] (	(int[] (in0.z, in0.x, in0.w, in0.y)),
   5964 														(int[] (in0.z, in0.x, in0.w, in0.y)),
   5965 														(int[] (in0.z, in0.x, in0.w, in0.y)),
   5966 														(int[] (in0.z, in0.x, in0.w, in0.y))),
   5967 
   5968 											int[][] (	(int[] (in0.z, in0.x, in0.w, in0.y)),
   5969 														(int[] (in0.z, in0.x, in0.w, in0.y)),
   5970 														(int[] (in0.z, in0.x, in0.w, in0.y)),
   5971 														(int[] (in0.z, in0.x, in0.w, in0.y))) ),
   5972 
   5973 							  y = int[][][] (int[][] (	(int[] (in0.x, in0.y, in0.z, in0.w)),
   5974 														(int[] (in0.x, in0.y, in0.z, in0.w))),
   5975 
   5976 												int[][] ((int[] (in0.x, in0.y, in0.z, in0.w)),
   5977 														(int[] (in0.x, in0.y, in0.z, in0.w))) );
   5978 
   5979 					out0 = ivec4(x[0][0][0] + y[0][0][0], x[1][1][1] + y[1][1][1], x[2][2][2] + y[0][0][2], x[3][3][3] + y[0][0][3]);
   5980 					${OUTPUT}
   5981 				}
   5982 			""
   5983 		end
   5984 
   5985 	end # implicit_constructor
   5986 
   5987 end # single_statement_multiple_declarations
   5988 
   5989 
   5990 group invalid "Invalid functions"
   5991 
   5992 	case dynamic_expression_array_size
   5993 		version 310 es
   5994 		desc "Testing that compiler doesn't allow dynamic expressions in arrays of arrays sizes"
   5995 		expect compile_fail
   5996 
   5997 		both ""
   5998 			#version 310 es
   5999 			precision mediump float;
   6000 			${DECLARATIONS}
   6001 
   6002 			void main ()
   6003 			{
   6004 				int a = 5;
   6005 				float[a][a] array;
   6006 				${POSITION_FRAG_COLOR} = vec4(1.0);
   6007 			}
   6008 		""
   6009 	end # dynamic_expression_array_size
   6010 
   6011 	case empty_declaration_without_var_name
   6012 		version 310 es
   6013 		desc "Testing that compiler doesn't allow only an empty declaration"
   6014 		expect compile_or_link_fail
   6015 
   6016 		both ""
   6017 			#version 310 es
   6018 			precision mediump float;
   6019 			${DECLARATIONS}
   6020 
   6021 			void main ()
   6022 			{
   6023 				float[][];
   6024 				${POSITION_FRAG_COLOR} = vec4(1.0);
   6025 			}
   6026 		""
   6027 	end # empty_declaration_without_var_name
   6028 
   6029 	case empty_declaration_with_var_name
   6030 		version 310 es
   6031 		desc "Testing that compiler doesn't allow only an empty declaration"
   6032 		expect compile_or_link_fail
   6033 
   6034 		both ""
   6035 			#version 310 es
   6036 			precision mediump float;
   6037 			${DECLARATIONS}
   6038 
   6039 			void main ()
   6040 			{
   6041 				int[][] a;
   6042 				${POSITION_FRAG_COLOR} = vec4(1.0);
   6043 			}
   6044 		""
   6045 	end # empty_declaration_with_var_name
   6046 
   6047 	case uniform_block
   6048 		version 310 es
   6049 		desc "Testing that compiler doesn't allow arrays of arrays of uniform blocks"
   6050 		expect compile_or_link_fail
   6051 
   6052 		both ""
   6053 			#version 310 es
   6054 			precision mediump float;
   6055 			${DECLARATIONS}
   6056 
   6057 			layout(std140) uniform Transform {
   6058 				mat4 modelViewMatrix;
   6059 				mat4 modelViewProjectionMatrix;
   6060 				mat3 normalMatrix;
   6061 				float deformation;
   6062 			} TransformInstance [2][2];
   6063 
   6064 			void main ()
   6065 			{
   6066 				${POSITION_FRAG_COLOR} = vec4(1.0);
   6067 			}
   6068 		""
   6069 	end # uniform_block
   6070 
   6071 	case storage_block
   6072 		version 310 es
   6073 		desc "Testing that compiler doesn't allow arrays of arrays of SSBOs"
   6074 		expect compile_or_link_fail
   6075 
   6076 		both ""
   6077 			#version 310 es
   6078 			precision mediump float;
   6079 			${DECLARATIONS}
   6080 
   6081 			layout(std430) buffer Transform {
   6082 				mat4 modelViewMatrix;
   6083 				mat4 modelViewProjectionMatrix;
   6084 				mat3 normalMatrix;
   6085 				float deformation;
   6086 			} TransformInstance [2][2];
   6087 
   6088 			void main ()
   6089 			{
   6090 				${POSITION_FRAG_COLOR} = vec4(1.0);
   6091 			}
   6092 		""
   6093 	end # storage_block
   6094 
   6095 end # negative
   6096