Home | History | Annotate | Download | only in shaders
      1 # Tests todo:
      2 # - inout with varyings, attributes, uniforms (and arrays of 'em)
      3 # - inout with arrays, array elements
      4 # - inout with array elements
      5 # - inout by-value semantics (arrays & elements & structs)
      6 
      7 # Done:
      8 # - control flow: return, return in loop, etc.
      9 
     10 group datatypes "Function Parameter Data Types"
     11 
     12 	case float_float
     13 		values
     14 		{
     15 			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
     16 			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
     17 		}
     18 
     19 		both ""
     20 			precision mediump float;
     21 			${DECLARATIONS}
     22 
     23 			float func (float a)
     24 			{
     25 				return -a;
     26 			}
     27 
     28 			void main()
     29 			{
     30 				out0 = func(in0);
     31 				${OUTPUT}
     32 			}
     33 		""
     34 	end
     35 
     36 	case float_vec2
     37 		values
     38 		{
     39 			input vec2 in0		= [ vec2(0.0, 1.0) | vec2(2.0, 2.5) ];
     40 			output float out0	= [ -1.0 | -4.5 ];
     41 		}
     42 
     43 		both ""
     44 			precision mediump float;
     45 			${DECLARATIONS}
     46 
     47 			float func (vec2 a)
     48 			{
     49 				return -(a.x + a.y);
     50 			}
     51 
     52 			void main()
     53 			{
     54 				out0 = func(in0);
     55 				${OUTPUT}
     56 			}
     57 		""
     58 	end
     59 
     60 	case float_vec3
     61 		values
     62 		{
     63 			input vec3 in0		= [ vec3(0.0, 1.0, -2.0) | vec3(2.0, 2.5, -4.0) ];
     64 			output float out0	= [ 1.0 | -0.5 ];
     65 		}
     66 
     67 		both ""
     68 			precision mediump float;
     69 			${DECLARATIONS}
     70 
     71 			float func (vec3 a)
     72 			{
     73 				return -(a.x + a.y + a.z);
     74 			}
     75 
     76 			void main()
     77 			{
     78 				out0 = func(in0);
     79 				${OUTPUT}
     80 			}
     81 		""
     82 	end
     83 
     84 	case float_vec4
     85 		values
     86 		{
     87 			input vec4 in0		= [ vec4(0.0, 1.0, -2.0, 0.5) | vec4(2.0, 2.5, 4.0, -7.0) ];
     88 			output float out0	= [ 0.5 | -1.5 ];
     89 		}
     90 
     91 		both ""
     92 			precision mediump float;
     93 			${DECLARATIONS}
     94 
     95 			float func (vec4 a)
     96 			{
     97 				return -(a.x + a.y + a.z + a.w);
     98 			}
     99 
    100 			void main()
    101 			{
    102 				out0 = func(in0);
    103 				${OUTPUT}
    104 			}
    105 		""
    106 	end
    107 
    108 	case float_mat2
    109 		values
    110 		{
    111 			input mat2 in0		= [ mat2(0.0, 1.0, -2.0, 0.5) | mat2(2.0, 2.5, 4.0, -7.0) ];
    112 			output float out0	= [ 0.5 | -1.5 ];
    113 		}
    114 
    115 		both ""
    116 			precision mediump float;
    117 			${DECLARATIONS}
    118 
    119 			float func (mat2 a)
    120 			{
    121 				return -(a[0][0] + a[0][1] + a[1][0] + a[1][1]);
    122 			}
    123 
    124 			void main()
    125 			{
    126 				out0 = func(in0);
    127 				${OUTPUT}
    128 			}
    129 		""
    130 	end
    131 
    132 	case float_mat3
    133 		values
    134 		{
    135 			input mat3 in0		= [ mat3(0.0, 1.0, -2.0, 0.5, 1.0, -1.0, 2.0, 4.0, -1.0) | mat3(2.0, 2.5, 4.0, -7.0, 2.5, 3.0, 0.5, -3.5, 1.0) ];
    136 			output float out0	= [ -4.5 | -5.0 ];
    137 		}
    138 
    139 		both ""
    140 			precision mediump float;
    141 			${DECLARATIONS}
    142 
    143 			float func (mat3 a)
    144 			{
    145 				return -(a[0][0] + a[0][1] + a[0][2] + a[1][0] + a[1][1] + a[1][2] + a[2][0] + a[2][1] + a[2][2]);
    146 			}
    147 
    148 			void main()
    149 			{
    150 				out0 = func(in0);
    151 				${OUTPUT}
    152 			}
    153 		""
    154 	end
    155 
    156 	case float_mat4
    157 		values
    158 		{
    159 			input mat4 in0		= [ mat4(0.0, 1.0, -2.0, 0.5, 1.0, -1.0, 2.0, 4.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -2.0, -2.0) | mat4(2.0, 2.5, 4.0, -7.0, 2.5, 3.0, 0.5, -3.5, 1.0, 0.0, 2.0, -1.0, 1.0, 0.0, -1.0, 3.0) ];
    160 			output float out0	= [ -5.5 | -9.0 ];
    161 		}
    162 
    163 		both ""
    164 			precision mediump float;
    165 			${DECLARATIONS}
    166 
    167 			float func (mat4 a)
    168 			{
    169 				return -(a[0][0] + a[0][1] + a[0][2] + a[0][3] + a[1][0] + a[1][1] + a[1][2] + a[1][3] + a[2][0] + a[2][1] + a[2][2] + a[2][3] + a[3][0] + a[3][1] + a[3][2] + a[3][3]);
    170 			}
    171 
    172 			void main()
    173 			{
    174 				out0 = func(in0);
    175 				${OUTPUT}
    176 			}
    177 		""
    178 	end
    179 
    180 	case int_int
    181 		values
    182 		{
    183 			input int in0		= [ -1 | 0 | 1 | 4 ];
    184 			output int out0		= [ 1 | 0 | -1 | -4 ];
    185 		}
    186 
    187 		both ""
    188 			precision mediump float;
    189 			precision mediump int;
    190 			${DECLARATIONS}
    191 
    192 			int func (int a)
    193 			{
    194 				return -a;
    195 			}
    196 
    197 			void main()
    198 			{
    199 				${SETUP}
    200 				out0 = func(in0);
    201 				${OUTPUT}
    202 			}
    203 		""
    204 	end
    205 
    206 	case int_ivec2
    207 		values
    208 		{
    209 			input ivec2 in0		= [ ivec2(-1, 0) | ivec2(1, 4) ];
    210 			output int out0		= [ 1 | -5 ];
    211 		}
    212 
    213 		both ""
    214 			precision mediump float;
    215 			precision mediump int;
    216 			${DECLARATIONS}
    217 
    218 			int func (ivec2 a)
    219 			{
    220 				return -(a.x + a.y);
    221 			}
    222 
    223 			void main()
    224 			{
    225 				${SETUP}
    226 				out0 = func(in0);
    227 				${OUTPUT}
    228 			}
    229 		""
    230 	end
    231 
    232 	case int_ivec3
    233 		values
    234 		{
    235 			input ivec3 in0		= [ ivec3(-1, 0, 2) | ivec3(1, 4, -8) ];
    236 			output int out0		= [ -1 | 3 ];
    237 		}
    238 
    239 		both ""
    240 			precision mediump float;
    241 			precision mediump int;
    242 			${DECLARATIONS}
    243 
    244 			int func (ivec3 a)
    245 			{
    246 				return -(a.x + a.y + a.z);
    247 			}
    248 
    249 			void main()
    250 			{
    251 				${SETUP}
    252 				out0 = func(in0);
    253 				${OUTPUT}
    254 			}
    255 		""
    256 	end
    257 
    258 	case int_ivec4
    259 		values
    260 		{
    261 			input ivec4 in0		= [ ivec4(-1, 0, 2, 2) | ivec4(1, 4, -8, 2) ];
    262 			output int out0		= [ -3 | 1 ];
    263 		}
    264 
    265 		both ""
    266 			precision mediump float;
    267 			precision mediump int;
    268 			${DECLARATIONS}
    269 
    270 			int func (ivec4 a)
    271 			{
    272 				return -(a.x + a.y + a.z + a.w);
    273 			}
    274 
    275 			void main()
    276 			{
    277 				${SETUP}
    278 				out0 = func(in0);
    279 				${OUTPUT}
    280 			}
    281 		""
    282 	end
    283 
    284 	case bool_bool
    285 		values
    286 		{
    287 			input bool in0		= [ true | false ];
    288 			output bool out0	= [ false | true ];
    289 		}
    290 
    291 		both ""
    292 			precision mediump float;
    293 			${DECLARATIONS}
    294 
    295 			bool func (bool a)
    296 			{
    297 				return !a;
    298 			}
    299 
    300 			void main()
    301 			{
    302 				${SETUP}
    303 				out0 = func(in0);
    304 				${OUTPUT}
    305 			}
    306 		""
    307 	end
    308 
    309 	case bool_bvec2
    310 		values
    311 		{
    312 			input bvec2 in0		= [ bvec2(true, true) | bvec2(false, true) ];
    313 			output bool out0	= [ false | true ];
    314 		}
    315 
    316 		both ""
    317 			precision mediump float;
    318 			${DECLARATIONS}
    319 
    320 			bool func (bvec2 a)
    321 			{
    322 				return !(a.x == a.y);
    323 			}
    324 
    325 			void main()
    326 			{
    327 				${SETUP}
    328 				out0 = func(in0);
    329 				${OUTPUT}
    330 			}
    331 		""
    332 	end
    333 
    334 	case bool_bvec3
    335 		values
    336 		{
    337 			input bvec3 in0		= [ bvec3(true, true, false) | bvec3(true, false, false) ];
    338 			output bool out0	= [ false | true ];
    339 		}
    340 
    341 		both ""
    342 			precision mediump float;
    343 			${DECLARATIONS}
    344 
    345 			bool func (bvec3 a)
    346 			{
    347 				return (a.x == a.y) == a.z;
    348 			}
    349 
    350 			void main()
    351 			{
    352 				${SETUP}
    353 				out0 = func(in0);
    354 				${OUTPUT}
    355 			}
    356 		""
    357 	end
    358 
    359 	case bool_bvec4
    360 		values
    361 		{
    362 			input bvec4 in0		= [ bvec4(true, true, true, false) | bvec4(false, false, true, true) | bvec4(true, false, false, true) ];
    363 			output bool out0	= [ false | true | true ];
    364 		}
    365 
    366 		both ""
    367 			precision mediump float;
    368 			${DECLARATIONS}
    369 
    370 			bool func (bvec4 a)
    371 			{
    372 				return ((a.x == a.y) == (a.z == a.w));
    373 			}
    374 
    375 			void main()
    376 			{
    377 				${SETUP}
    378 				out0 = func(in0);
    379 				${OUTPUT}
    380 			}
    381 		""
    382 	end
    383 
    384 	case mat2
    385 		values
    386 		{
    387 			input mat2 in0	= [ mat2(-2.0, 0.5, -1.0, 1.0) | mat2(1.0, -3.5, -3.5, 2.5) | mat2(-2.0, -2.0, 3.5, 0.0) ];
    388 			output mat2 out0	= [ mat2(4.0, -1.0, 2.0, -2.0) | mat2(-2.0, 7.0, 7.0, -5.0) | mat2(4.0, 4.0, -7.0, -0.0) ];
    389 		}
    390 
    391 		both ""
    392 			precision mediump float;
    393 			${DECLARATIONS}
    394 
    395 			mat2 func (mat2 a)
    396 			{
    397 				return -2.0*a;
    398 			}
    399 
    400 			void main()
    401 			{
    402 				${SETUP}
    403 				out0 = func(in0);
    404 				${OUTPUT}
    405 			}
    406 		""
    407 	end
    408 
    409 
    410 	case mat3
    411 		values
    412 		{
    413 			input mat3 in0	= [ mat3(2.5, 0.0, 1.0, -2.5, 1.0, 3.0, 0.0, 2.0, 1.5) | mat3(-3.5, 2.0, 0.5, -1.5, -3.5, 2.5, 0.0, 1.5, 3.0) | mat3(1.5, 3.0, -1.0, 2.5, -0.5, 3.5, 3.0, -3.0, -2.5) ];
    414 			output mat3 out0	= [ mat3(-5.0, -0.0, -2.0, 5.0, -2.0, -6.0, -0.0, -4.0, -3.0) | mat3(7.0, -4.0, -1.0, 3.0, 7.0, -5.0, -0.0, -3.0, -6.0) | mat3(-3.0, -6.0, 2.0, -5.0, 1.0, -7.0, -6.0, 6.0, 5.0) ];
    415 		}
    416 
    417 		both ""
    418 			precision mediump float;
    419 			${DECLARATIONS}
    420 
    421 			mat3 func (mat3 a)
    422 			{
    423 				return -2.0*a;
    424 			}
    425 
    426 			void main()
    427 			{
    428 				${SETUP}
    429 				out0 = func(in0);
    430 				${OUTPUT}
    431 			}
    432 		""
    433 	end
    434 
    435 
    436 	case mat4
    437 		values
    438 		{
    439 			input mat4 in0	= [ mat4(-2.0, 3.5, -0.5, 1.0, -1.5, 0.0, -1.0, -1.0, 0.5, 0.5, 3.0, 1.5, 3.0, 2.5, 3.5, 1.5) | mat4(-2.5, 2.5, 3.5, 3.0, 0.5, 1.5, -2.0, 2.5, 0.5, -1.5, -3.5, 2.5, 3.5, -3.0, 2.5, -0.5) | mat4(-2.5, -1.5, 2.0, 3.0, -3.5, 1.0, -3.5, 1.5, -1.5, 3.0, 3.5, 0.0, 3.5, -1.5, -3.0, 0.5) ];
    440 			output mat4 out0	= [ mat4(4.0, -7.0, 1.0, -2.0, 3.0, -0.0, 2.0, 2.0, -1.0, -1.0, -6.0, -3.0, -6.0, -5.0, -7.0, -3.0) | mat4(5.0, -5.0, -7.0, -6.0, -1.0, -3.0, 4.0, -5.0, -1.0, 3.0, 7.0, -5.0, -7.0, 6.0, -5.0, 1.0) | mat4(5.0, 3.0, -4.0, -6.0, 7.0, -2.0, 7.0, -3.0, 3.0, -6.0, -7.0, -0.0, -7.0, 3.0, 6.0, -1.0) ];
    441 		}
    442 
    443 		both ""
    444 			precision mediump float;
    445 			${DECLARATIONS}
    446 
    447 			mat4 func (mat4 a)
    448 			{
    449 				return -2.0*a;
    450 			}
    451 
    452 			void main()
    453 			{
    454 				${SETUP}
    455 				out0 = func(in0);
    456 				${OUTPUT}
    457 			}
    458 		""
    459 	end
    460 
    461 	case float_struct
    462 		values
    463 		{
    464 			input vec3 in0		= [ vec3(0.0, 1.0, -2.0) | vec3(2.0, 2.5, -4.0) ];
    465 			output float out0	= [ 1.0 | -0.5 ];
    466 		}
    467 
    468 		both ""
    469 			precision mediump float;
    470 			${DECLARATIONS}
    471 
    472 			struct Pos { float a, b, c; };
    473 
    474 			float func (Pos p)
    475 			{
    476 				return -(p.a + p.b + p.c);
    477 			}
    478 
    479 			void main()
    480 			{
    481 				Pos p = Pos(in0.x, in0.y, in0.z);
    482 				out0 = func(p);
    483 				${OUTPUT}
    484 			}
    485 		""
    486 	end
    487 
    488 	case struct_struct
    489 		values
    490 		{
    491 			input vec3 in0		= [ vec3(0.0, 1.0, -2.0) | vec3(2.0, 2.5, -4.0) ];
    492 			output float out0	= [ 1.0 | -0.5 ];
    493 		}
    494 
    495 		both ""
    496 			precision mediump float;
    497 			${DECLARATIONS}
    498 
    499 			struct Pos { float a, b, c; };
    500 
    501 			Pos func (Pos p)
    502 			{
    503 				return Pos(-p.a, -p.b, -p.c);
    504 			}
    505 
    506 			void main()
    507 			{
    508 				Pos p = Pos(in0.x, in0.y, in0.z);
    509 				p = func(p);
    510 				out0 = p.a + p.b + p.c;
    511 				${OUTPUT}
    512 			}
    513 		""
    514 	end
    515 
    516 	case struct_nested_struct
    517 		values
    518 		{
    519 			input vec3 in0		= [ vec3(0.0, 1.0, -2.0) | vec3(2.0, 2.5, -4.0) ];
    520 			output float out0	= [ 1.0 | -0.5 ];
    521 		}
    522 
    523 		both ""
    524 			precision mediump float;
    525 			${DECLARATIONS}
    526 
    527 			struct Pos { float a, b, c; };
    528 			struct Line { Pos start, end; };
    529 
    530 			Line func (Pos p)
    531 			{
    532 				return Line(p, Pos(-p.a, -p.b, -p.c));
    533 			}
    534 
    535 			float sum (Pos p)
    536 			{
    537 				return (p.a + p.b + p.c);
    538 			}
    539 
    540 			void main()
    541 			{
    542 				Pos p = Pos(in0.x, in0.y, in0.z);
    543 				Line line = func(p);
    544 				out0 = sum(line.start) + (2.0 * sum(line.end));
    545 				${OUTPUT}
    546 			}
    547 		""
    548 	end
    549 
    550 
    551 end # datatypes
    552 
    553 group qualifiers "Function Parameter Qualifiers"
    554 
    555 	case in_float
    556 		values
    557 		{
    558 			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
    559 			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
    560 		}
    561 
    562 		both ""
    563 			precision mediump float;
    564 			precision mediump int;
    565 			${DECLARATIONS}
    566 
    567 			float func (in float a)
    568 			{
    569 				a = -a;
    570 				return 2.0 * a;
    571 			}
    572 
    573 			void main()
    574 			{
    575 				${SETUP}
    576 				float f = in0;
    577 				float g = func(f);
    578 				out0 = f + g;
    579 				${OUTPUT}
    580 			}
    581 		""
    582 	end
    583 
    584 	case out_float
    585 		values
    586 		{
    587 			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
    588 			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
    589 		}
    590 
    591 		both ""
    592 			precision mediump float;
    593 			precision mediump int;
    594 			${DECLARATIONS}
    595 
    596 			void func (out float a)
    597 			{
    598 				a = -1.0;
    599 			}
    600 
    601 			void main()
    602 			{
    603 				${SETUP}
    604 				float f = 1.0;
    605 				func(f);
    606 				out0 = f * in0;
    607 				${OUTPUT}
    608 			}
    609 		""
    610 	end
    611 
    612 	case inout_float
    613 		values
    614 		{
    615 			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
    616 			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
    617 		}
    618 
    619 		both ""
    620 			precision mediump float;
    621 			precision mediump int;
    622 			${DECLARATIONS}
    623 
    624 			void func (inout float a)
    625 			{
    626 				a = -a;
    627 			}
    628 
    629 			void main()
    630 			{
    631 				${SETUP}
    632 				float f = 1.0;
    633 				func(f);
    634 				out0 = f * in0;
    635 				${OUTPUT}
    636 			}
    637 		""
    638 	end
    639 
    640 	case in_lowp_float
    641 		values
    642 		{
    643 			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
    644 			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
    645 		}
    646 
    647 		both ""
    648 			precision mediump float;
    649 			precision mediump int;
    650 			${DECLARATIONS}
    651 
    652 			float func (in lowp float a)
    653 			{
    654 				a = -a;
    655 				return 2.0 * a;
    656 			}
    657 
    658 			void main()
    659 			{
    660 				${SETUP}
    661 				float f = in0;
    662 				float g = func(f);
    663 				out0 = f + g;
    664 				${OUTPUT}
    665 			}
    666 		""
    667 	end
    668 
    669 	case out_lowp_float
    670 		values
    671 		{
    672 			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
    673 			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
    674 		}
    675 
    676 		both ""
    677 			precision mediump float;
    678 			precision mediump int;
    679 			${DECLARATIONS}
    680 
    681 			void func (out lowp float a)
    682 			{
    683 				a = -1.0;
    684 			}
    685 
    686 			void main()
    687 			{
    688 				${SETUP}
    689 				float f = 1.0;
    690 				func(f);
    691 				out0 = f * in0;
    692 				${OUTPUT}
    693 			}
    694 		""
    695 	end
    696 
    697 	case inout_lowp_float
    698 		values
    699 		{
    700 			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
    701 			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
    702 		}
    703 
    704 		both ""
    705 			precision mediump float;
    706 			precision mediump int;
    707 			${DECLARATIONS}
    708 
    709 			void func (inout lowp float a)
    710 			{
    711 				a = -a;
    712 			}
    713 
    714 			void main()
    715 			{
    716 				${SETUP}
    717 				float f = 1.0;
    718 				func(f);
    719 				out0 = f * in0;
    720 				${OUTPUT}
    721 			}
    722 		""
    723 	end
    724 
    725 	case in_highp_float
    726 		values
    727 		{
    728 			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
    729 			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
    730 		}
    731 
    732 		both ""
    733 			precision mediump float;
    734 			precision mediump int;
    735 			${DECLARATIONS}
    736 
    737 			float func (in highp float a)
    738 			{
    739 				a = -a;
    740 				return 2.0 * a;
    741 			}
    742 
    743 			void main()
    744 			{
    745 				${SETUP}
    746 				float f = in0;
    747 				float g = func(f);
    748 				out0 = f + g;
    749 				${OUTPUT}
    750 			}
    751 		""
    752 	end
    753 
    754 	case out_highp_float
    755 		values
    756 		{
    757 			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
    758 			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
    759 		}
    760 
    761 		both ""
    762 			precision mediump float;
    763 			precision mediump int;
    764 			${DECLARATIONS}
    765 
    766 			void func (out highp float a)
    767 			{
    768 				a = -1.0;
    769 			}
    770 
    771 			void main()
    772 			{
    773 				${SETUP}
    774 				float f = 1.0;
    775 				func(f);
    776 				out0 = f * in0;
    777 				${OUTPUT}
    778 			}
    779 		""
    780 	end
    781 
    782 	case inout_highp_float
    783 		values
    784 		{
    785 			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
    786 			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
    787 		}
    788 
    789 		both ""
    790 			precision mediump float;
    791 			precision mediump int;
    792 			${DECLARATIONS}
    793 
    794 			void func (inout highp float a)
    795 			{
    796 				a = -a;
    797 			}
    798 
    799 			void main()
    800 			{
    801 				${SETUP}
    802 				float f = 1.0;
    803 				func(f);
    804 				out0 = f * in0;
    805 				${OUTPUT}
    806 			}
    807 		""
    808 	end
    809 
    810 	case const_float
    811 		values
    812 		{
    813 			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
    814 			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
    815 		}
    816 
    817 		both ""
    818 			precision mediump float;
    819 			precision mediump int;
    820 			${DECLARATIONS}
    821 
    822 			float func (const float a)
    823 			{
    824 				float b = -a;
    825 				return 2.0 * b;
    826 			}
    827 
    828 			void main()
    829 			{
    830 				${SETUP}
    831 				float f = in0;
    832 				float g = func(f);
    833 				out0 = f + g;
    834 				${OUTPUT}
    835 			}
    836 		""
    837 	end
    838 
    839 	case const_in_float
    840 		values
    841 		{
    842 			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
    843 			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
    844 		}
    845 
    846 		both ""
    847 			precision mediump float;
    848 			precision mediump int;
    849 			${DECLARATIONS}
    850 
    851 			float func (const in float a)
    852 			{
    853 				float b = -a;
    854 				return 2.0 * b;
    855 			}
    856 
    857 			void main()
    858 			{
    859 				${SETUP}
    860 				float f = in0;
    861 				float g = func(f);
    862 				out0 = f + g;
    863 				${OUTPUT}
    864 			}
    865 		""
    866 	end
    867 
    868 	case in_int
    869 		values
    870 		{
    871 			input int in0		= [ 0 | 1 | -2 | 4 ];
    872 			output int out0		= [ 0 | -1 | 2 | -4 ];
    873 		}
    874 
    875 		both ""
    876 			precision mediump float;
    877 			precision mediump int;
    878 			${DECLARATIONS}
    879 
    880 			int func (in int a)
    881 			{
    882 				a = -a;
    883 				return 2 * a;
    884 			}
    885 
    886 			void main()
    887 			{
    888 				${SETUP}
    889 				int f = in0;
    890 				int g = func(f);
    891 				out0 = f + g;
    892 				${OUTPUT}
    893 			}
    894 		""
    895 	end
    896 
    897 	case out_int
    898 		values
    899 		{
    900 			input int in0		= [ 0 | 1 | -2 | 6 ];
    901 			output int out0		= [ 0 | -1 | 2 | -6 ];
    902 		}
    903 
    904 		both ""
    905 			precision mediump float;
    906 			precision mediump int;
    907 			${DECLARATIONS}
    908 
    909 			void func (out int a)
    910 			{
    911 				a = -1;
    912 			}
    913 
    914 			void main()
    915 			{
    916 				${SETUP}
    917 				int f = 1;
    918 				func(f);
    919 				out0 = f * in0;
    920 				${OUTPUT}
    921 			}
    922 		""
    923 	end
    924 
    925 	case inout_int
    926 		values
    927 		{
    928 			input int in0		= [ 0 | 1 | -2 | 6 ];
    929 			output int out0		= [ 0 | -1 | 2 | -6 ];
    930 		}
    931 
    932 		both ""
    933 			precision mediump float;
    934 			precision mediump int;
    935 			${DECLARATIONS}
    936 
    937 			void func (inout int a)
    938 			{
    939 				a = -a;
    940 			}
    941 
    942 			void main()
    943 			{
    944 				${SETUP}
    945 				int f = 1;
    946 				func(f);
    947 				out0 = f * in0;
    948 				${OUTPUT}
    949 			}
    950 		""
    951 	end
    952 
    953 	case in_lowp_int
    954 		values
    955 		{
    956 			input int in0		= [ 0 | 1 | -2 | 4 ];
    957 			output int out0		= [ 0 | -1 | 2 | -4 ];
    958 		}
    959 
    960 		both ""
    961 			precision mediump float;
    962 			precision mediump int;
    963 			${DECLARATIONS}
    964 
    965 			int func (in lowp int a)
    966 			{
    967 				a = -a;
    968 				return 2 * a;
    969 			}
    970 
    971 			void main()
    972 			{
    973 				${SETUP}
    974 				int f = in0;
    975 				int g = func(f);
    976 				out0 = f + g;
    977 				${OUTPUT}
    978 			}
    979 		""
    980 	end
    981 
    982 	case out_lowp_int
    983 		values
    984 		{
    985 			input int in0		= [ 0 | 1 | -2 | 6 ];
    986 			output int out0		= [ 0 | -1 | 2 | -6 ];
    987 		}
    988 
    989 		both ""
    990 			precision mediump float;
    991 			precision mediump int;
    992 			${DECLARATIONS}
    993 
    994 			void func (out lowp int a)
    995 			{
    996 				a = -1;
    997 			}
    998 
    999 			void main()
   1000 			{
   1001 				${SETUP}
   1002 				int f = 1;
   1003 				func(f);
   1004 				out0 = f * in0;
   1005 				${OUTPUT}
   1006 			}
   1007 		""
   1008 	end
   1009 
   1010 	case inout_lowp_int
   1011 		values
   1012 		{
   1013 			input int in0		= [ 0 | 1 | -2 | 6 ];
   1014 			output int out0		= [ 0 | -1 | 2 | -6 ];
   1015 		}
   1016 
   1017 		both ""
   1018 			precision mediump float;
   1019 			precision mediump int;
   1020 			${DECLARATIONS}
   1021 
   1022 			void func (inout lowp int a)
   1023 			{
   1024 				a = -a;
   1025 			}
   1026 
   1027 			void main()
   1028 			{
   1029 				${SETUP}
   1030 				int f = 1;
   1031 				func(f);
   1032 				out0 = f * in0;
   1033 				${OUTPUT}
   1034 			}
   1035 		""
   1036 	end
   1037 
   1038 	case in_highp_int
   1039 		values
   1040 		{
   1041 			input int in0		= [ 0 | 1 | -2 | 4 ];
   1042 			output int out0		= [ 0 | -1 | 2 | -4 ];
   1043 		}
   1044 
   1045 		both ""
   1046 			precision mediump float;
   1047 			precision mediump int;
   1048 			${DECLARATIONS}
   1049 
   1050 			int func (in highp int a)
   1051 			{
   1052 				a = -a;
   1053 				return 2 * a;
   1054 			}
   1055 
   1056 			void main()
   1057 			{
   1058 				${SETUP}
   1059 				int f = in0;
   1060 				int g = func(f);
   1061 				out0 = f + g;
   1062 				${OUTPUT}
   1063 			}
   1064 		""
   1065 	end
   1066 
   1067 	case out_highp_int
   1068 		values
   1069 		{
   1070 			input int in0		= [ 0 | 1 | -2 | 6 ];
   1071 			output int out0		= [ 0 | -1 | 2 | -6 ];
   1072 		}
   1073 
   1074 		both ""
   1075 			precision mediump float;
   1076 			precision mediump int;
   1077 			${DECLARATIONS}
   1078 
   1079 			void func (out highp int a)
   1080 			{
   1081 				a = -1;
   1082 			}
   1083 
   1084 			void main()
   1085 			{
   1086 				${SETUP}
   1087 				int f = 1;
   1088 				func(f);
   1089 				out0 = f * in0;
   1090 				${OUTPUT}
   1091 			}
   1092 		""
   1093 	end
   1094 
   1095 	case inout_highp_int
   1096 		values
   1097 		{
   1098 			input int in0		= [ 0 | 1 | -2 | 6 ];
   1099 			output int out0		= [ 0 | -1 | 2 | -6 ];
   1100 		}
   1101 
   1102 		both ""
   1103 			precision mediump float;
   1104 			precision mediump int;
   1105 			${DECLARATIONS}
   1106 
   1107 			void func (inout highp int a)
   1108 			{
   1109 				a = -a;
   1110 			}
   1111 
   1112 			void main()
   1113 			{
   1114 				${SETUP}
   1115 				int f = 1;
   1116 				func(f);
   1117 				out0 = f * in0;
   1118 				${OUTPUT}
   1119 			}
   1120 		""
   1121 	end
   1122 
   1123 	case const_int
   1124 		values
   1125 		{
   1126 			input int in0		= [ 0 | 1 | -2 | 4 ];
   1127 			output int out0		= [ 0 | -1 | 2 | -4 ];
   1128 		}
   1129 
   1130 		both ""
   1131 			precision mediump float;
   1132 			precision mediump int;
   1133 			${DECLARATIONS}
   1134 
   1135 			int func (const int a)
   1136 			{
   1137 				int b = -a;
   1138 				return 2 * b;
   1139 			}
   1140 
   1141 			void main()
   1142 			{
   1143 				${SETUP}
   1144 				int f = in0;
   1145 				int g = func(f);
   1146 				out0 = f + g;
   1147 				${OUTPUT}
   1148 			}
   1149 		""
   1150 	end
   1151 
   1152 	case const_in_int
   1153 		values
   1154 		{
   1155 			input int in0		= [ 0 | 1 | -2 | 4 ];
   1156 			output int out0		= [ 0 | -1 | 2 | -4 ];
   1157 		}
   1158 
   1159 		both ""
   1160 			precision mediump float;
   1161 			precision mediump int;
   1162 			${DECLARATIONS}
   1163 
   1164 			int func (const in int a)
   1165 			{
   1166 				int b = -a;
   1167 				return 2 * b;
   1168 			}
   1169 
   1170 			void main()
   1171 			{
   1172 				${SETUP}
   1173 				int f = in0;
   1174 				int g = func(f);
   1175 				out0 = f + g;
   1176 				${OUTPUT}
   1177 			}
   1178 		""
   1179 	end
   1180 
   1181 	case in_bool
   1182 		values
   1183 		{
   1184 			input bool in0		= [ true | false ];
   1185 			output bool out0	= [ true | true ];
   1186 		}
   1187 
   1188 		both ""
   1189 			precision mediump float;
   1190 			${DECLARATIONS}
   1191 
   1192 			bool func (in bool a)
   1193 			{
   1194 				a = !a;
   1195 				return a;
   1196 			}
   1197 
   1198 			void main()
   1199 			{
   1200 				${SETUP}
   1201 				bool f = in0;
   1202 				bool g = func(f);
   1203 				out0 = (f != g);
   1204 				${OUTPUT}
   1205 			}
   1206 		""
   1207 	end
   1208 
   1209 	case out_bool
   1210 		values
   1211 		{
   1212 			input bool in0		= [ true | false ];
   1213 			output bool out0	= [ false | true ];
   1214 		}
   1215 
   1216 		both ""
   1217 			precision mediump float;
   1218 			${DECLARATIONS}
   1219 
   1220 			void func (out bool a)
   1221 			{
   1222 				a = false;
   1223 			}
   1224 
   1225 			void main()
   1226 			{
   1227 				${SETUP}
   1228 				bool f = true;
   1229 				func(f);
   1230 				out0 = (in0 == f);
   1231 				${OUTPUT}
   1232 			}
   1233 		""
   1234 	end
   1235 
   1236 	case inout_bool
   1237 		values
   1238 		{
   1239 			input bool in0		= [ true | false ];
   1240 			output bool out0	= [ false | true ];
   1241 		}
   1242 
   1243 		both ""
   1244 			precision mediump float;
   1245 			${DECLARATIONS}
   1246 
   1247 			void func (inout bool a)
   1248 			{
   1249 				a = !a;
   1250 			}
   1251 
   1252 			void main()
   1253 			{
   1254 				${SETUP}
   1255 				bool f = true;
   1256 				func(f);
   1257 				out0 = (in0 == f);
   1258 				${OUTPUT}
   1259 			}
   1260 		""
   1261 	end
   1262 
   1263 end # qualifiers
   1264 
   1265 group declarations "Function Declarations"
   1266 
   1267 	case void_vs_no_void
   1268 		values
   1269 		{
   1270 			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
   1271 			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
   1272 		}
   1273 
   1274 		both ""
   1275 			precision mediump float;
   1276 			${DECLARATIONS}
   1277 
   1278 			float func ();
   1279 
   1280 			void main()
   1281 			{
   1282 				out0 = func() * in0;
   1283 				${OUTPUT}
   1284 			}
   1285 
   1286 			float func (void)
   1287 			{
   1288 				return -1.0;
   1289 			}
   1290 		""
   1291 	end
   1292 
   1293 	case in_vs_no_in
   1294 		values
   1295 		{
   1296 			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
   1297 			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
   1298 		}
   1299 
   1300 		both ""
   1301 			precision mediump float;
   1302 			${DECLARATIONS}
   1303 
   1304 			float func (float f);
   1305 
   1306 			void main()
   1307 			{
   1308 				out0 = func(in0);
   1309 				${OUTPUT}
   1310 			}
   1311 
   1312 			float func (in float f)
   1313 			{
   1314 				return -f;
   1315 			}
   1316 		""
   1317 	end
   1318 
   1319 	case default_vs_explicit_precision
   1320 		values
   1321 		{
   1322 			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
   1323 			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
   1324 		}
   1325 
   1326 		both ""
   1327 			precision mediump float;
   1328 			${DECLARATIONS}
   1329 
   1330 			float func (float f);
   1331 
   1332 			void main()
   1333 			{
   1334 				out0 = func(in0);
   1335 				${OUTPUT}
   1336 			}
   1337 
   1338 			float func (mediump float f)
   1339 			{
   1340 				return -f;
   1341 			}
   1342 		""
   1343 	end
   1344 
   1345 end # declarations
   1346 
   1347 group overloading "Function Overloading"
   1348 
   1349 	case user_func_arg_type_simple
   1350 		values
   1351 		{
   1352 			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
   1353 			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
   1354 		}
   1355 
   1356 		both ""
   1357 			precision mediump float;
   1358 			precision mediump int;
   1359 			${DECLARATIONS}
   1360 
   1361 			float func (float a)
   1362 			{
   1363 				return -a;
   1364 			}
   1365 
   1366 			int func (int a)
   1367 			{
   1368 				return -a;
   1369 			}
   1370 
   1371 			void main()
   1372 			{
   1373 				out0 = func(in0) * float(func(-1));
   1374 				${OUTPUT}
   1375 			}
   1376 		""
   1377 	end
   1378 
   1379 	case user_func_arg_float_types
   1380 		values
   1381 		{
   1382 			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
   1383 			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
   1384 		}
   1385 
   1386 		both ""
   1387 			precision mediump float;
   1388 			precision mediump int;
   1389 			${DECLARATIONS}
   1390 
   1391 			float func (float a) { return -a; }
   1392 			vec2 func (vec2 a) { return a.yx; }
   1393 			vec3 func (vec3 a) { return a.xxx; }
   1394 			vec4 func (vec4 a) { return a.wwww; }
   1395 
   1396 			void main()
   1397 			{
   1398 				out0 = func(func(func(func(vec4(in0)).xyz).xy).x);
   1399 				${OUTPUT}
   1400 			}
   1401 		""
   1402 	end
   1403 
   1404 	case user_func_arg_int_types
   1405 		values
   1406 		{
   1407 			input int in0		= [ 0 | 1 | -2 | 6 ];
   1408 			output int out0		= [ 0 | -1 | 2 | -6 ];
   1409 		}
   1410 
   1411 		both ""
   1412 			precision mediump float;
   1413 			precision mediump int;
   1414 			${DECLARATIONS}
   1415 
   1416 			int func (int a) { return -a; }
   1417 			ivec2 func (ivec2 a) { return a.yx; }
   1418 			ivec3 func (ivec3 a) { return a.xxx; }
   1419 			ivec4 func (ivec4 a) { return a.wwww; }
   1420 
   1421 			void main()
   1422 			{
   1423 				${SETUP}
   1424 				out0 = func(func(func(func(ivec4(in0)).xyz).xy).x);
   1425 				${OUTPUT}
   1426 			}
   1427 		""
   1428 	end
   1429 
   1430 	case user_func_arg_bool_types
   1431 		values
   1432 		{
   1433 			input bool in0		= [ true | false ];
   1434 			output bool out0	= [ false | true ];
   1435 		}
   1436 
   1437 		both ""
   1438 			precision mediump float;
   1439 			${DECLARATIONS}
   1440 
   1441 			bool func (bool a) { return !a; }
   1442 			bvec2 func (bvec2 a) { return a.yx; }
   1443 			bvec3 func (bvec3 a) { return a.xxx; }
   1444 			bvec4 func (bvec4 a) { return a.wwww; }
   1445 
   1446 			void main()
   1447 			{
   1448 				${SETUP}
   1449 				out0 = func(func(func(func(bvec4(in0)).xyz).xy).x);
   1450 				${OUTPUT}
   1451 			}
   1452 		""
   1453 	end
   1454 
   1455 	case user_func_arg_basic_types
   1456 		values
   1457 		{
   1458 			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
   1459 			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
   1460 		}
   1461 
   1462 		both ""
   1463 			precision mediump float;
   1464 			precision mediump int;
   1465 			${DECLARATIONS}
   1466 
   1467 			float func (float a) { return -a; }
   1468 			vec2 func (vec2 a) { return a.yx; }
   1469 			vec3 func (vec3 a) { return a.xxx; }
   1470 			vec4 func (vec4 a) { return a.wwww; }
   1471 			int func (int a) { return -a; }
   1472 			ivec2 func (ivec2 a) { return a.yx; }
   1473 			ivec3 func (ivec3 a) { return a.xxx; }
   1474 			ivec4 func (ivec4 a) { return a.wwww; }
   1475 			bool func (bool a) { return !a; }
   1476 			bvec2 func (bvec2 a) { return a.yx; }
   1477 			bvec3 func (bvec3 a) { return a.xxx; }
   1478 			bvec4 func (bvec4 a) { return a.wwww; }
   1479 
   1480 			void main()
   1481 			{
   1482 				${SETUP}
   1483 				if (func(func(bvec4(false)).x))
   1484 					out0 = func(in0) * float(func(-1));
   1485 				else
   1486 					out0 = float(func(func(ivec4(func(func(func(vec4(0.5)).xyz).xy).xxxx)).xy).x);
   1487 				${OUTPUT}
   1488 			}
   1489 		""
   1490 	end
   1491 
   1492 	case user_func_arg_complex_types
   1493 		values
   1494 		{
   1495 			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
   1496 			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
   1497 		}
   1498 
   1499 		both ""
   1500 			precision mediump float;
   1501 			precision mediump int;
   1502 			${DECLARATIONS}
   1503 
   1504 			struct Pos { float a, b, c; };
   1505 			struct Line { Pos start, end; };
   1506 
   1507 			float func (float a) { return -a; }
   1508 			float func (float a[4]) { return a[0] + a[3]; }
   1509 			vec2 func (vec2 a) { return a.yx; }
   1510 			vec3 func (vec3 a) { return a.xxx; }
   1511 			vec4 func (vec4 a) { return a.wwww; }
   1512 			vec4 func (vec4 a[4]) { return a[1] + a[2]; }
   1513 			int func (int a) { return -a; }
   1514 			ivec2 func (ivec2 a) { return a.yx; }
   1515 			ivec3 func (ivec3 a) { return a.xxx; }
   1516 			ivec4 func (ivec4 a) { return a.wwww; }
   1517 			bool func (bool a) { return !a; }
   1518 			bvec2 func (bvec2 a) { return a.yx; }
   1519 			bvec3 func (bvec3 a) { return a.xxx; }
   1520 			bvec4 func (bvec4 a) { return a.wwww; }
   1521 			Pos func (Pos a) { return a; }
   1522 			Line func (Line a) { return Line(a.end, a.start); }
   1523 
   1524 			void main()
   1525 			{
   1526 				${SETUP}
   1527 				float arr[4];
   1528 				vec4 arr2[4];
   1529 				out0 = func(arr) + func(arr2).x;
   1530 				if (func(func(bvec4(false)).x))
   1531 					out0 = func(in0) * float(func(-1));
   1532 				else
   1533 					out0 = float(func(func(ivec4(func(func(func(vec4(0.5)).xyz).xy).xxxx)).xy).x);
   1534 				${OUTPUT}
   1535 			}
   1536 		""
   1537 	end
   1538 
   1539 	case user_func_arguments
   1540 		values
   1541 		{
   1542 			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
   1543 			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
   1544 		}
   1545 
   1546 		both ""
   1547 			precision mediump float;
   1548 			${DECLARATIONS}
   1549 
   1550 			float func (float a)
   1551 			{
   1552 				return -a;
   1553 			}
   1554 
   1555 			float func (float a, float b)
   1556 			{
   1557 				return a * b;
   1558 			}
   1559 
   1560 			void main()
   1561 			{
   1562 				out0 = func(in0) * func(-0.5, -2.0);
   1563 				${OUTPUT}
   1564 			}
   1565 		""
   1566 	end
   1567 
   1568 	case builtin_sin
   1569 		values
   1570 		{
   1571 			input int in0		= [ -1 | 0 | 1 | 4 ];
   1572 			output int out0		= [ 1 | 0 | -1 | -4 ];
   1573 		}
   1574 
   1575 		both ""
   1576 			precision mediump float;
   1577 			precision mediump int;
   1578 			${DECLARATIONS}
   1579 
   1580 			int sin(int a) { return -a; }
   1581 
   1582 			void main()
   1583 			{
   1584 				${SETUP}
   1585 				out0 = sin(in0);
   1586 				${OUTPUT}
   1587 			}
   1588 		""
   1589 	end
   1590 
   1591 	case builtin_step
   1592 		values
   1593 		{
   1594 			input int in0		= [ -1 | 0 | 1 | 4 ];
   1595 			output int out0		= [ 1 | 0 | -1 | -4 ];
   1596 		}
   1597 
   1598 		both ""
   1599 			precision mediump float;
   1600 			precision mediump int;
   1601 			${DECLARATIONS}
   1602 
   1603 			int step (float i, float j, int a) { return -a; }
   1604 
   1605 			void main()
   1606 			{
   1607 				${SETUP}
   1608 				out0 = step(0.0, 1.0, in0);
   1609 				${OUTPUT}
   1610 			}
   1611 		""
   1612 	end
   1613 
   1614 	case array_size
   1615 		values
   1616 		{
   1617 			output float out0	= [ 1.0 ];
   1618 		}
   1619 
   1620 		both ""
   1621 			precision mediump float;
   1622 			${DECLARATIONS}
   1623 
   1624 			float func (float f[3])
   1625 			{
   1626 				return f[0];
   1627 			}
   1628 
   1629 			float func (float f[4])
   1630 			{
   1631 				return f[1];
   1632 			}
   1633 
   1634 			void main ()
   1635 			{
   1636 				${SETUP}
   1637 				float x[4];
   1638 				x[0] = -1.0;
   1639 				x[1] = 1.0;
   1640 				x[2] = x[3] = 0.0;
   1641 				out0 = func(x);
   1642 				${OUTPUT}
   1643 			}
   1644 		""
   1645 	end
   1646 
   1647 end # overloading
   1648 
   1649 group array_arguments "Arrays as Arguments"
   1650 
   1651 	case local_in_float
   1652 		values
   1653 		{
   1654 			input vec4 in0		= [ vec4(0.0, 1.0, 2.0, -4.0) | vec4(-7.5, 12.125, -0.25, 16.0) ];
   1655 			output vec4 out0	= [ vec4(0.0, -1.0, -2.0, 4.0) | vec4(7.5, -12.125, 0.25, -16.0) ];
   1656 		}
   1657 
   1658 		both ""
   1659 			precision mediump float;
   1660 			${DECLARATIONS}
   1661 
   1662 			float func (in float a[4])
   1663 			{
   1664 				a[0] = -1.0;
   1665 				a[2] = -4.0;
   1666 				a[3] = -3.0 * a[1];
   1667 				return a[0];
   1668 			}
   1669 
   1670 			void main()
   1671 			{
   1672 				float arr[4];
   1673 				arr[0] = in0.x;
   1674 				arr[1] = in0.y;
   1675 				arr[2] = in0.z;
   1676 				arr[3] = in0.w;
   1677 				float f = func(arr);
   1678 				out0 = f * vec4(arr[0], arr[1], arr[2], arr[3]);
   1679 				${OUTPUT}
   1680 			}
   1681 		""
   1682 	end
   1683 
   1684 	case global_in_float
   1685 		values
   1686 		{
   1687 			input vec4 in0		= [ vec4(0.0, 1.0, 2.0, -4.0) | vec4(-7.5, 12.125, -0.25, 16.0) ];
   1688 			output vec4 out0	= [ vec4(0.0, -1.0, -2.0, 4.0) | vec4(7.5, -12.125, 0.25, -16.0) ];
   1689 		}
   1690 
   1691 		both ""
   1692 			precision mediump float;
   1693 			${DECLARATIONS}
   1694 
   1695 			float func (in float a[4])
   1696 			{
   1697 				a[0] = -1.0;
   1698 				a[2] = -4.0;
   1699 				a[3] = -3.0 * a[1];
   1700 				return a[0];
   1701 			}
   1702 
   1703 			float arr[4];
   1704 
   1705 			void main()
   1706 			{
   1707 				arr[0] = in0.x;
   1708 				arr[1] = in0.y;
   1709 				arr[2] = in0.z;
   1710 				arr[3] = in0.w;
   1711 				float f = func(arr);
   1712 				out0 = f * vec4(arr[0], arr[1], arr[2], arr[3]);
   1713 				${OUTPUT}
   1714 			}
   1715 		""
   1716 	end
   1717 
   1718 	case local_in_int
   1719 		values
   1720 		{
   1721 			input ivec4 in0		= [ ivec4(0, 1, 2, -4) | ivec4(-7, -11, 13, 19) ];
   1722 			output ivec4 out0	= [ ivec4(0, -1, -2, 4) | ivec4(7, 11, -13, -19) ];
   1723 		}
   1724 
   1725 		both ""
   1726 			precision mediump float;
   1727 			precision mediump int;
   1728 			${DECLARATIONS}
   1729 
   1730 			int func (in int a[4])
   1731 			{
   1732 				a[0] = -1;
   1733 				a[2] = -4;
   1734 				a[3] = -3 * a[1];
   1735 				return a[0];
   1736 			}
   1737 
   1738 			void main()
   1739 			{
   1740 				${SETUP}
   1741 				int arr[4];
   1742 				arr[0] = in0.x;
   1743 				arr[1] = in0.y;
   1744 				arr[2] = in0.z;
   1745 				arr[3] = in0.w;
   1746 				int f = func(arr);
   1747 				out0 = f * ivec4(arr[0], arr[1], arr[2], arr[3]);
   1748 				${OUTPUT}
   1749 			}
   1750 		""
   1751 	end
   1752 
   1753 	case global_in_int
   1754 		values
   1755 		{
   1756 			input ivec4 in0		= [ ivec4(0, 1, 2, 4) | ivec4(-7, -11, 13, 19) ];
   1757 			output ivec4 out0	= [ ivec4(0, -1, -2, -4) | ivec4(7, 11, -13, -19) ];
   1758 		}
   1759 
   1760 		both ""
   1761 			precision mediump float;
   1762 			precision mediump int;
   1763 			${DECLARATIONS}
   1764 
   1765 			int func (in int a[4])
   1766 			{
   1767 				a[0] = -1;
   1768 				a[2] = -4;
   1769 				a[3] = -3 * a[1];
   1770 				return a[0];
   1771 			}
   1772 
   1773 			int arr[4];
   1774 
   1775 			void main()
   1776 			{
   1777 				${SETUP}
   1778 				arr[0] = in0.x;
   1779 				arr[1] = in0.y;
   1780 				arr[2] = in0.z;
   1781 				arr[3] = in0.w;
   1782 				int f = func(arr);
   1783 				out0 = f * ivec4(arr[0], arr[1], arr[2], arr[3]);
   1784 				${OUTPUT}
   1785 			}
   1786 
   1787 		""
   1788 	end
   1789 
   1790 	case local_in_bool
   1791 		values
   1792 		{
   1793 			input bvec4 in0		= [ bvec4(true, true, false, true) | bvec4(false, false, false, false) ];
   1794 			output bvec4 out0	= [ bvec4(false, false, true, false) | bvec4(true, true, true, true) ];
   1795 		}
   1796 
   1797 		both ""
   1798 			precision mediump float;
   1799 			${DECLARATIONS}
   1800 
   1801 			bool func (in bool a[4])
   1802 			{
   1803 				a[0] = false;
   1804 				a[2] = true;
   1805 				a[3] = !a[1];
   1806 				return a[0];
   1807 			}
   1808 
   1809 			void main()
   1810 			{
   1811 				${SETUP}
   1812 				bool arr[4];
   1813 				arr[0] = !in0.x;
   1814 				arr[1] = !in0.y;
   1815 				arr[2] = !in0.z;
   1816 				arr[3] = !in0.w;
   1817 				func(arr);
   1818 				out0 = bvec4(arr[0], arr[1], arr[2], arr[3]);
   1819 				${OUTPUT}
   1820 			}
   1821 		""
   1822 	end
   1823 
   1824 	case global_in_bool
   1825 		values
   1826 		{
   1827 			input bvec4 in0		= [ bvec4(true, true, false, true) | bvec4(false, false, false, false) ];
   1828 			output bvec4 out0	= [ bvec4(false, false, true, false) | bvec4(true, true, true, true) ];
   1829 		}
   1830 
   1831 		both ""
   1832 			precision mediump float;
   1833 			${DECLARATIONS}
   1834 
   1835 			bool func (in bool a[4])
   1836 			{
   1837 				a[0] = false;
   1838 				a[2] = true;
   1839 				a[3] = !a[1];
   1840 				return a[0];
   1841 			}
   1842 
   1843 			bool arr[4];
   1844 
   1845 			void main()
   1846 			{
   1847 				${SETUP}
   1848 				arr[0] = !in0.x;
   1849 				arr[1] = !in0.y;
   1850 				arr[2] = !in0.z;
   1851 				arr[3] = !in0.w;
   1852 				func(arr);
   1853 				out0 = bvec4(arr[0], arr[1], arr[2], arr[3]);
   1854 				${OUTPUT}
   1855 			}
   1856 		""
   1857 	end
   1858 
   1859 	case test_helpers
   1860 		desc "Check that helper functions are supported properly."
   1861 		values
   1862 		{
   1863 			input vec4 in0		= [ vec4(0.0, 1.0, 2.0, -4.0) | vec4(-7.5, 12.125, -0.25, 16.0) ];
   1864 			output float out0	= [ 1.0 | 1.0 ];
   1865 		}
   1866 
   1867 		both ""
   1868 			precision mediump float;
   1869 			${DECLARATIONS}
   1870 
   1871 			vec4 get (in float arr[4]);
   1872 			void set (out float arr[4], vec4 val);
   1873 			void negate (inout float arr[4]);
   1874 			bool test (in float arr[4], vec4 ref);
   1875 			bool isEqual (in float a[4], in float b[4]);
   1876 
   1877 			void main()
   1878 			{
   1879 				float arr[4];
   1880 				set(arr, in0);
   1881 				negate(arr);
   1882 				out0 = float(test(arr, -in0));
   1883 				${OUTPUT}
   1884 			}
   1885 
   1886 			float absDiff (vec4 a, vec4 b) { vec4 d = abs(a - b); return max(max(d.x, d.y), max(d.z, d.w)); }
   1887 			vec4 get (in float arr[4]) { return vec4(arr[0], arr[1], arr[2], arr[3]); }
   1888 			void set (out float arr[4], vec4 val) { arr[0] = val.x; arr[1] = val.y; arr[2] = val.z; arr[3] = val.w; }
   1889 			void negate (inout float arr[4]) { set(arr, -get(arr)); }
   1890 			bool test (in float arr[4], vec4 ref) { return (absDiff(get(arr), ref) < 0.1); }
   1891 			bool isEqual (in float a[4], in float b[4]) { return (absDiff(get(a), get(b)) < 0.1); }
   1892 		""
   1893 	end
   1894 
   1895 	case copy_local_in_on_call
   1896 		desc "Check that local 'in' arguments are copied on call and don't alias."
   1897 		values
   1898 		{
   1899 			input vec4 in0		= [ vec4(0.0, 1.0, 2.0, -4.0) | vec4(-7.5, 12.125, -0.25, 16.0) ];
   1900 			output vec4 out0	= [ vec4(0.0, -1.0, -2.0, 4.0) | vec4(7.5, -12.125, 0.25, -16.0) ];
   1901 		}
   1902 
   1903 		both ""
   1904 			precision mediump float;
   1905 			${DECLARATIONS}
   1906 
   1907 			vec4 get (in float arr[4]);
   1908 			void set (out float arr[4], vec4 val);
   1909 			void negate (inout float arr[4]);
   1910 			bool test (in float arr[4], vec4 ref);
   1911 			bool isEqual (in float a[4], in float b[4]);
   1912 
   1913 			float func (in float a[4], in float b[4])
   1914 			{
   1915 				a[0] = 2.123;
   1916 				a[2] = -4.123;
   1917 				return isEqual(a, b) ? 1.0 : -1.0;
   1918 			}
   1919 
   1920 			void main()
   1921 			{
   1922 				float arr[4];
   1923 				set(arr, in0);
   1924 				out0 = in0 * func(arr, arr);
   1925 				${OUTPUT}
   1926 			}
   1927 
   1928 			float absDiff (vec4 a, vec4 b) { vec4 d = abs(a - b); return max(max(d.x, d.y), max(d.z, d.w)); }
   1929 			vec4 get (in float arr[4]) { return vec4(arr[0], arr[1], arr[2], arr[3]); }
   1930 			void set (out float arr[4], vec4 val) { arr[0] = val.x; arr[1] = val.y; arr[2] = val.z; arr[3] = val.w; }
   1931 			void negate (inout float arr[4]) { set(arr, -get(arr)); }
   1932 			bool test (in float arr[4], vec4 ref) { return (absDiff(get(arr), ref) < 0.1); }
   1933 			bool isEqual (in float a[4], in float b[4]) { return (absDiff(get(a), get(b)) < 0.1); }
   1934 		""
   1935 	end
   1936 
   1937 	case copy_global_in_on_call
   1938 		desc "Check that global 'in' arguments are copied on call and don't alias."
   1939 		values
   1940 		{
   1941 			input vec4 in0		= [ vec4(0.0, 1.0, 2.0, -4.0) | vec4(-7.5, 12.125, -0.25, 16.0) ];
   1942 			output vec4 out0	= [ vec4(0.0, -1.0, -2.0, 4.0) | vec4(7.5, -12.125, 0.25, -16.0) ];
   1943 		}
   1944 
   1945 		both ""
   1946 			precision mediump float;
   1947 			${DECLARATIONS}
   1948 
   1949 			vec4 get (in float arr[4]);
   1950 			void set (out float arr[4], vec4 val);
   1951 			void negate (inout float arr[4]);
   1952 			bool test (in float arr[4], vec4 ref);
   1953 			bool isEqual (in float a[4], in float b[4]);
   1954 
   1955 			float func (in float a[4], in float b[4])
   1956 			{
   1957 				a[0] = 2.123;
   1958 				a[2] = -4.123;
   1959 				return isEqual(a, b) ? 1.0 : -1.0;
   1960 			}
   1961 
   1962 			float arr[4];
   1963 
   1964 			void main()
   1965 			{
   1966 				set(arr, in0);
   1967 				out0 = in0 * func(arr, arr);
   1968 				${OUTPUT}
   1969 			}
   1970 
   1971 			float absDiff (vec4 a, vec4 b) { vec4 d = abs(a - b); return max(max(d.x, d.y), max(d.z, d.w)); }
   1972 			vec4 get (in float arr[4]) { return vec4(arr[0], arr[1], arr[2], arr[3]); }
   1973 			void set (out float arr[4], vec4 val) { arr[0] = val.x; arr[1] = val.y; arr[2] = val.z; arr[3] = val.w; }
   1974 			void negate (inout float arr[4]) { set(arr, -get(arr)); }
   1975 			bool test (in float arr[4], vec4 ref) { return (absDiff(get(arr), ref) < 0.1); }
   1976 			bool isEqual (in float a[4], in float b[4]) { return (absDiff(get(a), get(b)) < 0.1); }
   1977 		""
   1978 	end
   1979 
   1980 	case copy_local_inout_on_call
   1981 		desc "Check that local 'in' arguments are copied on call and don't alias."
   1982 		values
   1983 		{
   1984 			input vec4 in0		= [ vec4(0.0, 1.0, 2.0, -4.0) | vec4(-7.5, 12.125, -0.25, 16.0) ];
   1985 			output vec4 out0	= [ vec4(0.0, -1.0, -2.0, 4.0) | vec4(7.5, -12.125, 0.25, -16.0) ];
   1986 		}
   1987 
   1988 		both ""
   1989 			precision mediump float;
   1990 			${DECLARATIONS}
   1991 
   1992 			vec4 get (in float arr[4]);
   1993 			void set (out float arr[4], vec4 val);
   1994 			void negate (inout float arr[4]);
   1995 			bool test (in float arr[4], vec4 ref);
   1996 			bool isEqual (in float a[4], in float b[4]);
   1997 
   1998 			float func (inout float a[4], inout float b[4])
   1999 			{
   2000 				negate(a);
   2001 				return isEqual(a, b) ? 1.0 : -1.0;
   2002 			}
   2003 
   2004 			void main()
   2005 			{
   2006 				float arr[4];
   2007 				set(arr, in0);
   2008 				float m = func(arr, arr); // returns -1.0
   2009 				float n = float(test(arr, in0) || test(arr, -in0));
   2010 				out0 = in0 * m * n;
   2011 				${OUTPUT}
   2012 			}
   2013 
   2014 			float absDiff (vec4 a, vec4 b) { vec4 d = abs(a - b); return max(max(d.x, d.y), max(d.z, d.w)); }
   2015 			vec4 get (in float arr[4]) { return vec4(arr[0], arr[1], arr[2], arr[3]); }
   2016 			void set (out float arr[4], vec4 val) { arr[0] = val.x; arr[1] = val.y; arr[2] = val.z; arr[3] = val.w; }
   2017 			void negate (inout float arr[4]) { set(arr, -get(arr)); }
   2018 			bool test (in float arr[4], vec4 ref) { return (absDiff(get(arr), ref) < 0.1); }
   2019 			bool isEqual (in float a[4], in float b[4]) { return (absDiff(get(a), get(b)) < 0.1); }
   2020 		""
   2021 	end
   2022 
   2023 	case copy_global_inout_on_call
   2024 		desc "Check that global 'in' arguments are copied on call and don't alias."
   2025 		values
   2026 		{
   2027 			input vec4 in0		= [ vec4(0.0, 1.0, 2.0, -4.0) | vec4(-7.5, 12.125, -0.25, 16.0) ];
   2028 			output vec4 out0	= [ vec4(0.0, -1.0, -2.0, 4.0) | vec4(7.5, -12.125, 0.25, -16.0) ];
   2029 		}
   2030 
   2031 		both ""
   2032 			precision mediump float;
   2033 			${DECLARATIONS}
   2034 
   2035 			vec4 get (in float arr[4]);
   2036 			void set (out float arr[4], vec4 val);
   2037 			void negate (inout float arr[4]);
   2038 			bool test (in float arr[4], vec4 ref);
   2039 			bool isEqual (in float a[4], in float b[4]);
   2040 
   2041 			float func (in float a[4], in float b[4])
   2042 			{
   2043 				negate(a);
   2044 				return isEqual(a, b) ? 1.0 : -1.0;
   2045 			}
   2046 
   2047 			float arr[4];
   2048 
   2049 			void main()
   2050 			{
   2051 				set(arr, in0);
   2052 				float m = func(arr, arr); // returns -1.0
   2053 				float n = float(test(arr, in0) || test(arr, -in0));
   2054 				out0 = in0 * m * n;
   2055 				${OUTPUT}
   2056 			}
   2057 
   2058 			float absDiff (vec4 a, vec4 b) { vec4 d = abs(a - b); return max(max(d.x, d.y), max(d.z, d.w)); }
   2059 			vec4 get (in float arr[4]) { return vec4(arr[0], arr[1], arr[2], arr[3]); }
   2060 			void set (out float arr[4], vec4 val) { arr[0] = val.x; arr[1] = val.y; arr[2] = val.z; arr[3] = val.w; }
   2061 			void negate (inout float arr[4]) { set(arr, -get(arr)); }
   2062 			bool test (in float arr[4], vec4 ref) { return (absDiff(get(arr), ref) < 0.1); }
   2063 			bool isEqual (in float a[4], in float b[4]) { return (absDiff(get(a), get(b)) < 0.1); }
   2064 		""
   2065 	end
   2066 
   2067 #			vec4 get (in float arr[4]);
   2068 #			void set (out float arr[4], vec4 val);
   2069 #			void negate (inout float arr[4]);
   2070 #			bool test (in float arr[4], vec4 ref);
   2071 #			bool isEqual (in float a[4], in float b[4]);
   2072 
   2073 #			float absDiff (vec4 a, vec4 b) { vec4 d = abs(a - b); return max(max(d.x, d.y), max(d.z, d.w)); }
   2074 #			vec4 get (in float arr[4]) { return vec4(arr[0], arr[1], arr[2], arr[3]); }
   2075 #			void set (out float arr[4], vec4 val) { arr[0] = val.x; arr[1] = val.y; arr[2] = val.z; arr[3] = val.w; }
   2076 #			void negate (inout float arr[4]) { set(arr, -get(arr)); }
   2077 #			bool test (in float arr[4], vec4 ref) { return (absDiff(get(arr), ref) < 0.1); }
   2078 #			bool isEqual (in float a[4], in float b[4]) { return (absDiff(get(a), get(b)) < 0.1); }
   2079 
   2080 end # array_arguments
   2081 
   2082 #group qualifiers "Function Parameter Qualifiers"
   2083 #
   2084 #end # qualifiers
   2085 
   2086 group control_flow "Control Flow In Functions"
   2087 
   2088 	case simple_return
   2089 		values
   2090 		{
   2091 			input float in0		= [ -0.5 | 1.5 ];
   2092 			output float out0	= [ 0.5 | -1.5 ];
   2093 		}
   2094 
   2095 		both ""
   2096 			precision mediump float;
   2097 			${DECLARATIONS}
   2098 
   2099 			float func (float a)
   2100 			{
   2101 				return -a;
   2102 				a = a * -1.0;
   2103 				return 1.0;
   2104 			}
   2105 
   2106 			void main()
   2107 			{
   2108 				${SETUP}
   2109 				out0 = func(in0);
   2110 				${OUTPUT}
   2111 			}
   2112 		""
   2113 	end
   2114 
   2115 	case return_in_if
   2116 		values
   2117 		{
   2118 			input float in0		= [ -0.5 | 1.5 ];
   2119 			output float out0	= [ 0.5 | -1.5 ];
   2120 		}
   2121 
   2122 		both ""
   2123 			precision mediump float;
   2124 			${DECLARATIONS}
   2125 
   2126 			float func (float a)
   2127 			{
   2128 				if (a != 0.0)
   2129 					return -a;
   2130 				return 1.0;
   2131 			}
   2132 
   2133 			void main()
   2134 			{
   2135 				${SETUP}
   2136 				out0 = func(in0);
   2137 				${OUTPUT}
   2138 			}
   2139 		""
   2140 	end
   2141 
   2142 	case return_in_else
   2143 		values
   2144 		{
   2145 			input float in0		= [ -0.5 | 1.5 ];
   2146 			output float out0	= [ 0.5 | -1.5 ];
   2147 		}
   2148 
   2149 		both ""
   2150 			precision mediump float;
   2151 			${DECLARATIONS}
   2152 
   2153 			float func (float a)
   2154 			{
   2155 				if (a == 0.0)
   2156 					return 1.0;
   2157 				else
   2158 					return -a;
   2159 				return 1.0;
   2160 			}
   2161 
   2162 			void main()
   2163 			{
   2164 				${SETUP}
   2165 				out0 = func(in0);
   2166 				${OUTPUT}
   2167 			}
   2168 		""
   2169 	end
   2170 
   2171 	case return_in_loop
   2172 		values
   2173 		{
   2174 			input float in0		= [ -0.5 | 1.5 ];
   2175 			output float out0	= [ 0.5 | -1.5 ];
   2176 		}
   2177 
   2178 		both ""
   2179 			precision mediump float;
   2180 			${DECLARATIONS}
   2181 
   2182 			float func (float a)
   2183 			{
   2184 				for (int i = 0; i < 1; i++)
   2185 					return -a;
   2186 				return 1.0;
   2187 			}
   2188 
   2189 			void main()
   2190 			{
   2191 				${SETUP}
   2192 				out0 = func(in0);
   2193 				${OUTPUT}
   2194 			}
   2195 		""
   2196 	end
   2197 
   2198 	case return_in_loop_if
   2199 		values
   2200 		{
   2201 			input float in0		= [ -0.5 | 1.5 ];
   2202 			output float out0	= [ 0.5 | -1.5 ];
   2203 		}
   2204 
   2205 		both ""
   2206 			precision mediump float;
   2207 			${DECLARATIONS}
   2208 
   2209 			float func (float a)
   2210 			{
   2211 				for (int i = 0; i < 3; i++)
   2212 				{
   2213 					if (i == 1)
   2214 						return a;
   2215 					else if (i > 1)
   2216 						return -1.0;
   2217 					a = -a;
   2218 				}
   2219 				return 1.0;
   2220 			}
   2221 
   2222 			void main()
   2223 			{
   2224 				${SETUP}
   2225 				out0 = func(in0);
   2226 				${OUTPUT}
   2227 			}
   2228 		""
   2229 	end
   2230 
   2231 	case return_after_loop
   2232 		values
   2233 		{
   2234 			input float in0		= [ -0.5 | 1.5 ];
   2235 			output float out0	= [ 0.5 | -1.5 ];
   2236 		}
   2237 
   2238 		both ""
   2239 			precision mediump float;
   2240 			${DECLARATIONS}
   2241 
   2242 			float func (float a)
   2243 			{
   2244 				for (int i = 0; i < 5; i++)
   2245 					a = -a;
   2246 				return a;
   2247 			}
   2248 
   2249 			void main()
   2250 			{
   2251 				${SETUP}
   2252 				out0 = func(in0);
   2253 				${OUTPUT}
   2254 			}
   2255 		""
   2256 	end
   2257 
   2258 	case return_after_break
   2259 		values
   2260 		{
   2261 			input float in0		= [ -0.5 | 1.5 ];
   2262 			output float out0	= [ 0.5 | -1.5 ];
   2263 		}
   2264 
   2265 		both ""
   2266 			precision mediump float;
   2267 			${DECLARATIONS}
   2268 
   2269 			float func (float a)
   2270 			{
   2271 				for (int i = 0; i < 6; i++)
   2272 				{
   2273 					a = -a;
   2274 					if (i == 4)
   2275 						break;
   2276 				}
   2277 				return a;
   2278 			}
   2279 
   2280 			void main()
   2281 			{
   2282 				${SETUP}
   2283 				out0 = func(in0);
   2284 				${OUTPUT}
   2285 			}
   2286 		""
   2287 	end
   2288 
   2289 	case return_after_continue
   2290 		values
   2291 		{
   2292 			input float in0		= [ -0.5 | 1.5 ];
   2293 			output float out0	= [ 0.5 | -1.5 ];
   2294 		}
   2295 
   2296 		both ""
   2297 			precision mediump float;
   2298 			${DECLARATIONS}
   2299 
   2300 			float func (float a)
   2301 			{
   2302 				for (int i = 0; i < 6; i++)
   2303 				{
   2304 					if (i == 4)
   2305 						continue;
   2306 					a = -a;
   2307 				}
   2308 				return a;
   2309 			}
   2310 
   2311 			void main()
   2312 			{
   2313 				${SETUP}
   2314 				out0 = func(in0);
   2315 				${OUTPUT}
   2316 			}
   2317 		""
   2318 	end
   2319 
   2320 	case return_in_nested_loop
   2321 		values
   2322 		{
   2323 			input float in0		= [ -0.5 | 1.5 ];
   2324 			output float out0	= [ 0.5 | -1.5 ];
   2325 		}
   2326 
   2327 		both ""
   2328 			precision mediump float;
   2329 			${DECLARATIONS}
   2330 
   2331 			float func (float a)
   2332 			{
   2333 				for (int i = 0; i < 6; i++)
   2334 				{
   2335 					a = -a;
   2336 					for (int j = 0; j < 4; j++)
   2337 					{
   2338 						a = -a;
   2339 						if (i == 1)
   2340 							return a;
   2341 					}
   2342 					if (i == 4)
   2343 						return 1.0;
   2344 				}
   2345 				return 1.0;
   2346 			}
   2347 
   2348 			void main()
   2349 			{
   2350 				${SETUP}
   2351 				out0 = func(in0);
   2352 				${OUTPUT}
   2353 			}
   2354 		""
   2355 	end
   2356 
   2357 	case return_after_loop_sequence
   2358 		values
   2359 		{
   2360 			input float in0		= [ -0.5 | 1.5 ];
   2361 			output float out0	= [ 0.5 | -1.5 ];
   2362 		}
   2363 
   2364 		both ""
   2365 			precision mediump float;
   2366 			${DECLARATIONS}
   2367 
   2368 			float func (float a)
   2369 			{
   2370 				int i;
   2371 				for (i = 0; i < 6; i++) // negate a
   2372 				{
   2373 					a = -a;
   2374 					if (i == 4)
   2375 						a = -a;
   2376 				}
   2377 
   2378 				for (; i < 10; i++) // keep a
   2379 				{
   2380 					if (i == 8)
   2381 						continue;
   2382 					else if (i == 9)
   2383 						break;
   2384 					a = -a;
   2385 				}
   2386 
   2387 				return a;
   2388 			}
   2389 
   2390 			void main()
   2391 			{
   2392 				${SETUP}
   2393 				out0 = func(in0);
   2394 				${OUTPUT}
   2395 			}
   2396 		""
   2397 	end
   2398 
   2399 	case mixed_return_break_continue
   2400 		values
   2401 		{
   2402 			input float in0		= [ -0.5 | 1.5 ];
   2403 			output float out0	= [ 0.5 | -1.5 ];
   2404 		}
   2405 
   2406 		both ""
   2407 			precision mediump float;
   2408 			${DECLARATIONS}
   2409 
   2410 			float func (float a)
   2411 			{
   2412 				int i;
   2413 				for (i = 0; i < 6; i++)
   2414 				{
   2415 					if (i == 0)
   2416 						continue;
   2417 					else if (i == 1)
   2418 					{
   2419 					}
   2420 					else if (i == 3)
   2421 						break;
   2422 					else
   2423 						return a;
   2424 					a = -a;
   2425 				}
   2426 
   2427 				return 1.0;
   2428 			}
   2429 
   2430 			void main()
   2431 			{
   2432 				${SETUP}
   2433 				out0 = func(in0);
   2434 				${OUTPUT}
   2435 			}
   2436 		""
   2437 	end
   2438 
   2439 end # control_flow
   2440 
   2441 group misc "Miscellaneous"
   2442 
   2443 	case multi_arg_float
   2444 		values
   2445 		{
   2446 			input vec4 in0		= [ vec4(0.0, 1.0, -2.0, 0.5) | vec4(2.0, 2.5, 4.0, -7.0) ];
   2447 			output float out0	= [ 0.5 | -1.5 ]; # -sum(in0)
   2448 		}
   2449 
   2450 		both ""
   2451 			precision mediump float;
   2452 			${DECLARATIONS}
   2453 
   2454 			float sum(vec4 v) { return (v.x + v.y + v.z + v.w); }
   2455 
   2456 			float func (float a, vec3 b, vec2 c, vec2 d, vec4 e)
   2457 			{
   2458 				return -sum(vec4(a, b) + vec4(c, d)) + sum(e);
   2459 			}
   2460 
   2461 			void main()
   2462 			{
   2463 				${SETUP}
   2464 				out0 = func(in0.y, in0.xzw, in0.wz, in0.yx, in0);
   2465 				${OUTPUT}
   2466 			}
   2467 		""
   2468 	end
   2469 
   2470 	case multi_arg_int
   2471 		values
   2472 		{
   2473 			input ivec4 in0		= [ ivec4(-1, 0, 2, 2) | ivec4(1, 4, -8, 2) ];
   2474 			output int out0		= [ -3 | 1 ];
   2475 		}
   2476 
   2477 		both ""
   2478 			precision mediump float;
   2479 			precision mediump int;
   2480 			${DECLARATIONS}
   2481 
   2482 			int sum(ivec4 v) { return (v.x + v.y + v.z + v.w); }
   2483 
   2484 			int func (int a, ivec3 b, ivec2 c, ivec2 d, ivec4 e)
   2485 			{
   2486 				return -sum(ivec4(a, b) + ivec4(c, d)) + sum(e);
   2487 			}
   2488 
   2489 			void main()
   2490 			{
   2491 				${SETUP}
   2492 				out0 = func(in0.y, in0.xzw, in0.wz, in0.yx, in0);
   2493 				${OUTPUT}
   2494 			}
   2495 		""
   2496 	end
   2497 
   2498 	case argument_eval_order_1
   2499 		values
   2500 		{
   2501 			input int in0	= [  0 | 1 | 3 | 5 ];
   2502 			output int out0	= [ -1 | 5 | 11 | 17 ];
   2503 		}
   2504 
   2505 		both ""
   2506 			precision mediump float;
   2507 			${DECLARATIONS}
   2508 
   2509 			int func (float a, int b, bool c, int d)
   2510 			{
   2511 				if (c)
   2512 					return b + int(a) + d;
   2513 				else
   2514 					return -1;
   2515 			}
   2516 
   2517 			void main ()
   2518 			{
   2519 				${SETUP}
   2520 				float v0 = float(in0);
   2521 				int v1 = in0;
   2522 				out0 = func((v0 += 1.0), v1++, (v0 > 1.5), v1);
   2523 				${OUTPUT}
   2524 			}
   2525 		""
   2526 	end
   2527 
   2528 	case argument_eval_order_2
   2529 		values
   2530 		{
   2531 			input int in0	= [ 0 | -1 | 3 | 5 ];
   2532 			output int out0	= [ 3 | -1 | 9 | 13 ];
   2533 		}
   2534 
   2535 		both ""
   2536 			precision mediump float;
   2537 			${DECLARATIONS}
   2538 
   2539 			int g;
   2540 
   2541 			int modG (int v)
   2542 			{
   2543 				g += v;
   2544 				return v;
   2545 			}
   2546 
   2547 			int func (float a, int b, bool c, int d)
   2548 			{
   2549 				if (c)
   2550 					return b + int(a) + d;
   2551 				else
   2552 					return -1;
   2553 			}
   2554 
   2555 			void main ()
   2556 			{
   2557 				${SETUP}
   2558 				out0 = func(float(g = in0), modG(2), --g > 0, g);
   2559 				${OUTPUT}
   2560 			}
   2561 		""
   2562 	end
   2563 
   2564 	case missing_returns
   2565 		values
   2566 		{
   2567 			input float in0 = [ 1.0 | 2.0 | 3.0 ];
   2568 			output float out0 = [ -1.0 | -2.0 | -3.0 ];
   2569 		}
   2570 		both ""
   2571 			// Note specification says that returned value is undefined if no return
   2572 			// statement has been executed. In this case func() is called only with
   2573 			// positive values.
   2574 			precision mediump float;
   2575 			${DECLARATIONS}
   2576 
   2577 			float func (float f)
   2578 			{
   2579 				if (f > 0.0)
   2580 					return -f;
   2581 			}
   2582 
   2583 			void main ()
   2584 			{
   2585 				${SETUP}
   2586 				out0 = func(in0);
   2587 				${OUTPUT}
   2588 			}
   2589 		""
   2590 	end
   2591 
   2592 end # misc
   2593 
   2594 group invalid "Invalid Functions"
   2595 	case break_in_body
   2596 		expect compile_fail
   2597 		both ""
   2598 			precision mediump float;
   2599 
   2600 			void func ()
   2601 			{
   2602 				break;
   2603 			}
   2604 
   2605 			void main ()
   2606 			{
   2607 				${POSITION_FRAG_COLOR} = vec4(1.0);
   2608 			}
   2609 		""
   2610 	end
   2611 
   2612 	case continue_in_body
   2613 		expect compile_fail
   2614 		both ""
   2615 			precision mediump float;
   2616 
   2617 			void func ()
   2618 			{
   2619 				continue;
   2620 			}
   2621 
   2622 			void main ()
   2623 			{
   2624 				${POSITION_FRAG_COLOR} = vec4(1.0);
   2625 			}
   2626 		""
   2627 	end
   2628 
   2629 	case return_value_from_void_function
   2630 		expect compile_fail
   2631 		both ""
   2632 			precision mediump float;
   2633 
   2634 			void func ()
   2635 			{
   2636 				return 1.0;
   2637 			}
   2638 
   2639 			void main ()
   2640 			{
   2641 				${POSITION_FRAG_COLOR} = vec4(1.0);
   2642 			}
   2643 		""
   2644 	end
   2645 
   2646 	case extra_arguments
   2647 		expect compile_fail
   2648 		both ""
   2649 			precision mediump float;
   2650 
   2651 			void func (float f)
   2652 			{
   2653 			}
   2654 
   2655 			void main ()
   2656 			{
   2657 				func(1.0, 2.0);
   2658 				${POSITION_FRAG_COLOR} = vec4(1.0);
   2659 			}
   2660 		""
   2661 	end
   2662 
   2663 	case missing_arguments
   2664 		expect compile_fail
   2665 		both ""
   2666 			precision mediump float;
   2667 
   2668 			void func (float f)
   2669 			{
   2670 			}
   2671 
   2672 			void main ()
   2673 			{
   2674 				func();
   2675 				${POSITION_FRAG_COLOR} = vec4(1.0);
   2676 			}
   2677 		""
   2678 	end
   2679 
   2680 	case missing_argument_type
   2681 		expect compile_fail
   2682 		both ""
   2683 			precision mediump float;
   2684 
   2685 			void func (in f)
   2686 			{
   2687 			}
   2688 
   2689 			void main ()
   2690 			{
   2691 				${POSITION_FRAG_COLOR} = vec4(1.0);
   2692 			}
   2693 		""
   2694 	end
   2695 
   2696 	case argument_basetype_mismatch
   2697 		expect compile_fail
   2698 		both ""
   2699 			precision mediump float;
   2700 			precision mediump int;
   2701 
   2702 			void func (float f)
   2703 			{
   2704 			}
   2705 
   2706 			void main ()
   2707 			{
   2708 				func(2);
   2709 				${POSITION_FRAG_COLOR} = vec4(1.0);
   2710 			}
   2711 		""
   2712 	end
   2713 
   2714 	case argument_scalar_vector_mismatch
   2715 		expect compile_fail
   2716 		both ""
   2717 			precision mediump float;
   2718 
   2719 			void func (vec2 f)
   2720 			{
   2721 			}
   2722 
   2723 			void main ()
   2724 			{
   2725 				func(2.0);
   2726 				${POSITION_FRAG_COLOR} = vec4(1.0);
   2727 			}
   2728 		""
   2729 	end
   2730 
   2731 	case argument_vector_size_mismatch
   2732 		expect compile_fail
   2733 		both ""
   2734 			precision mediump float;
   2735 
   2736 			void func (vec3 f)
   2737 			{
   2738 			}
   2739 
   2740 			void main ()
   2741 			{
   2742 				func(vec2(2.0));
   2743 				${POSITION_FRAG_COLOR} = vec4(1.0);
   2744 			}
   2745 		""
   2746 	end
   2747 
   2748 	case duplicate_function
   2749 		expect compile_fail
   2750 		both ""
   2751 			precision mediump float;
   2752 
   2753 			void func (vec3 f);
   2754 
   2755 			void func (vec3 f)
   2756 			{
   2757 			}
   2758 
   2759 			void func (vec3 f)
   2760 			{
   2761 			}
   2762 
   2763 			void main ()
   2764 			{
   2765 				${POSITION_FRAG_COLOR} = vec4(1.0);
   2766 			}
   2767 		""
   2768 	end
   2769 
   2770 	case prototype_mismatch_return_type
   2771 		expect compile_fail
   2772 		both ""
   2773 			precision mediump float;
   2774 
   2775 			void func (vec3 f);
   2776 
   2777 			void main ()
   2778 			{
   2779 				${POSITION_FRAG_COLOR} = vec4(1.0);
   2780 			}
   2781 
   2782 			float func (vec3 f)
   2783 			{
   2784 				return f.x;
   2785 			}
   2786 		""
   2787 	end
   2788 
   2789 	case prototype_unspecified_array_size
   2790 		expect compile_fail
   2791 		both ""
   2792 			precision mediump float;
   2793 
   2794 			void func (vec3 f[]);
   2795 
   2796 			void main ()
   2797 			{
   2798 				${POSITION_FRAG_COLOR} = vec4(1.0);
   2799 			}
   2800 		""
   2801 	end
   2802 
   2803 	case call_mismatch_argument_array_size
   2804 		expect compile_fail
   2805 		both ""
   2806 			precision mediump float;
   2807 
   2808 			void func (vec3 f[3]);
   2809 			void func (vec3 f[3])
   2810 			{
   2811 			}
   2812 
   2813 			void main ()
   2814 			{
   2815 				vec3 array[4];
   2816 				func(array);
   2817 				${POSITION_FRAG_COLOR} = vec4(1.0);
   2818 			}
   2819 		""
   2820 	end
   2821 
   2822 	case prototype_mismatch_argument_const
   2823 		expect compile_fail
   2824 		both ""
   2825 			precision mediump float;
   2826 
   2827 			void func (vec3 f);
   2828 			void func (const vec3 f)
   2829 			{
   2830 			}
   2831 
   2832 			void main ()
   2833 			{
   2834 				${POSITION_FRAG_COLOR} = vec4(1.0);
   2835 			}
   2836 		""
   2837 	end
   2838 
   2839 	case prototype_mismatch_argument_array_const
   2840 		expect compile_fail
   2841 		both ""
   2842 			precision mediump float;
   2843 
   2844 			void func (vec3 f[3]);
   2845 			void func (const vec3 f[3])
   2846 			{
   2847 			}
   2848 
   2849 			void main ()
   2850 			{
   2851 				${POSITION_FRAG_COLOR} = vec4(1.0);
   2852 			}
   2853 		""
   2854 	end
   2855 
   2856 	case prototype_mismatch_array_inout
   2857 		expect compile_fail
   2858 		both ""
   2859 			precision mediump float;
   2860 
   2861 			void func (out vec3 f);
   2862 			void func (inout vec3 f)
   2863 			{
   2864 			}
   2865 
   2866 			void main ()
   2867 			{
   2868 				${POSITION_FRAG_COLOR} = vec4(1.0);
   2869 			}
   2870 		""
   2871 	end
   2872 
   2873 	case missing_return_type
   2874 		expect compile_fail
   2875 		both ""
   2876 			precision mediump float;
   2877 
   2878 			func (float f);
   2879 			func (inout vec3 f[3])
   2880 			{
   2881 			}
   2882 
   2883 			void main ()
   2884 			{
   2885 				${POSITION_FRAG_COLOR} = vec4(1.0);
   2886 			}
   2887 		""
   2888 	end
   2889 
   2890 	case call_before_definition
   2891 		expect compile_fail
   2892 		both ""
   2893 			precision mediump float;
   2894 
   2895 			void main ()
   2896 			{
   2897 				func(1.0);
   2898 				${POSITION_FRAG_COLOR} = vec4(1.0);
   2899 			}
   2900 
   2901 			void func (float f)
   2902 			{
   2903 			}
   2904 
   2905 		""
   2906 	end
   2907 
   2908 	case return_array_in_struct
   2909 		expect compile_fail
   2910 		both ""
   2911 			precision mediump float;
   2912 
   2913 			struct Foo
   2914 			{
   2915 				float f;
   2916 				float arr[2];
   2917 			};
   2918 
   2919 			Foo func ()
   2920 			{
   2921 				Foo f;
   2922 				f.f = 1.0;
   2923 				f.arr[0] = 2.0;
   2924 				return f;
   2925 			}
   2926 
   2927 			void main ()
   2928 			{
   2929 				${POSITION_FRAG_COLOR} = vec4(1.0);
   2930 			}
   2931 		""
   2932 	end
   2933 
   2934 	case argument_precision_overload
   2935 		expect compile_fail
   2936 		both ""
   2937 			precision mediump float;
   2938 
   2939 			float func (lowp float f)
   2940 			{
   2941 				return f;
   2942 			}
   2943 
   2944 			float func (mediump float f)
   2945 			{
   2946 				return f;
   2947 			}
   2948 
   2949 			void main ()
   2950 			{
   2951 				${POSITION_FRAG_COLOR} = vec4(1.0);
   2952 			}
   2953 		""
   2954 	end
   2955 
   2956 	case argument_in_out_overload
   2957 		expect compile_fail
   2958 		both ""
   2959 			precision mediump float;
   2960 
   2961 			void func (in float f)
   2962 			{
   2963 			}
   2964 
   2965 			void func (out float f)
   2966 			{
   2967 				f = 1.0;
   2968 			}
   2969 
   2970 			void main ()
   2971 			{
   2972 				${POSITION_FRAG_COLOR} = vec4(1.0);
   2973 			}
   2974 		""
   2975 	end
   2976 
   2977 	case argument_in_inout_overload
   2978 		expect compile_fail
   2979 		both ""
   2980 			precision mediump float;
   2981 
   2982 			void func (in float f)
   2983 			{
   2984 			}
   2985 
   2986 			void func (inout float f)
   2987 			{
   2988 				f = -f;
   2989 			}
   2990 
   2991 			void main ()
   2992 			{
   2993 				${POSITION_FRAG_COLOR} = vec4(1.0);
   2994 			}
   2995 		""
   2996 	end
   2997 
   2998 	case argument_out_inout_overload
   2999 		expect compile_fail
   3000 		both ""
   3001 			precision mediump float;
   3002 
   3003 			void func (out float f)
   3004 			{
   3005 				f = -1.0;
   3006 			}
   3007 
   3008 			void func (inout float f)
   3009 			{
   3010 				f = -f;
   3011 			}
   3012 
   3013 			void main ()
   3014 			{
   3015 				${POSITION_FRAG_COLOR} = vec4(1.0);
   3016 			}
   3017 		""
   3018 	end
   3019 
   3020 	case return_type_overload
   3021 		expect compile_fail
   3022 		both ""
   3023 			precision mediump float;
   3024 
   3025 			float func (float f)
   3026 			{
   3027 				return f;
   3028 			}
   3029 
   3030 			int func (float f)
   3031 			{
   3032 				return int(f);
   3033 			}
   3034 
   3035 			void main ()
   3036 			{
   3037 				${POSITION_FRAG_COLOR} = vec4(1.0);
   3038 			}
   3039 		""
   3040 	end
   3041 
   3042 	case return_type_precision_overload
   3043 		expect compile_fail
   3044 		both ""
   3045 			precision mediump float;
   3046 
   3047 			lowp float func (float f)
   3048 			{
   3049 				return f;
   3050 			}
   3051 
   3052 			mediump float func (float f)
   3053 			{
   3054 				return f;
   3055 			}
   3056 
   3057 			void main ()
   3058 			{
   3059 				${POSITION_FRAG_COLOR} = vec4(1.0);
   3060 			}
   3061 		""
   3062 	end
   3063 
   3064 	case return_type_const_overload
   3065 		expect compile_fail
   3066 		both ""
   3067 			precision mediump float;
   3068 
   3069 			float func (float f)
   3070 			{
   3071 				return f;
   3072 			}
   3073 
   3074 			const float func (float f)
   3075 			{
   3076 				return f;
   3077 			}
   3078 
   3079 			void main ()
   3080 			{
   3081 				${POSITION_FRAG_COLOR} = vec4(1.0);
   3082 			}
   3083 		""
   3084 	end
   3085 
   3086 	case return_without_value
   3087 		expect compile_fail
   3088 		both ""
   3089 			precision mediump float;
   3090 
   3091 			float func (float f)
   3092 			{
   3093 				return;
   3094 				return 1.0;
   3095 			}
   3096 
   3097 			void main ()
   3098 			{
   3099 				${POSITION_FRAG_COLOR} = vec4(1.0);
   3100 			}
   3101 		""
   3102 	end
   3103 
   3104 	case local_function_prototype
   3105 		expect compile_fail
   3106 		both ""
   3107 			precision mediump float;
   3108 
   3109 			void main ()
   3110 			{
   3111 				float func (float f);
   3112 
   3113 				${POSITION_FRAG_COLOR} = vec4(1.0);
   3114 			}
   3115 		""
   3116 	end
   3117 
   3118 	case local_function_definition
   3119 		expect compile_fail
   3120 		both ""
   3121 			precision mediump float;
   3122 
   3123 			void main ()
   3124 			{
   3125 				float func (float f)
   3126 				{
   3127 					return 1.0;
   3128 				}
   3129 
   3130 				${POSITION_FRAG_COLOR} = vec4(1.0);
   3131 			}
   3132 		""
   3133 	end
   3134 
   3135 	case name_type_conflict
   3136 		expect compile_fail
   3137 		both ""
   3138 			precision mediump float;
   3139 
   3140 			struct foo { float a; }
   3141 
   3142 			float foo (float f)
   3143 			{
   3144 				return 1.0;
   3145 			}
   3146 
   3147 			void main ()
   3148 			{
   3149 				${POSITION_FRAG_COLOR} = vec4(1.0);
   3150 			}
   3151 		""
   3152 	end
   3153 
   3154 	case const_overload
   3155 		expect compile_fail
   3156 		both ""
   3157 			precision mediump float;
   3158 
   3159 			void func (vec3 f)
   3160 			{
   3161 			}
   3162 
   3163 			void func (const vec3 f)
   3164 			{
   3165 			}
   3166 
   3167 			void main ()
   3168 			{
   3169 				${POSITION_FRAG_COLOR} = vec4(1.0);
   3170 			}
   3171 		""
   3172 	end
   3173 
   3174 	case uniform_local
   3175 		expect compile_fail
   3176 		both ""
   3177 			precision mediump float;
   3178 
   3179 			void func (vec3 f)
   3180 			{
   3181 				uniform float u;
   3182 			}
   3183 
   3184 			void main ()
   3185 			{
   3186 				${POSITION_FRAG_COLOR} = vec4(1.0);
   3187 			}
   3188 		""
   3189 	end
   3190 
   3191 	case varying_local
   3192 		expect compile_fail
   3193 		both ""
   3194 			precision mediump float;
   3195 
   3196 			void func (vec3 f)
   3197 			{
   3198 				varying float v;
   3199 			}
   3200 
   3201 			void main ()
   3202 			{
   3203 				${POSITION_FRAG_COLOR} = vec4(1.0);
   3204 			}
   3205 		""
   3206 	end
   3207 
   3208 	case attribute_local
   3209 		expect compile_fail
   3210 		both ""
   3211 			precision mediump float;
   3212 
   3213 			void func (vec3 f)
   3214 			{
   3215 				attribute float a;
   3216 			}
   3217 
   3218 			void main ()
   3219 			{
   3220 				${POSITION_FRAG_COLOR} = vec4(1.0);
   3221 			}
   3222 		""
   3223 	end
   3224 
   3225 	case uniform_argument
   3226 		expect compile_fail
   3227 		both ""
   3228 			precision mediump float;
   3229 
   3230 			void func (uniform vec3 f)
   3231 			{
   3232 			}
   3233 
   3234 			void main ()
   3235 			{
   3236 				${POSITION_FRAG_COLOR} = vec4(1.0);
   3237 			}
   3238 		""
   3239 	end
   3240 
   3241 	case varying_argument
   3242 		expect compile_fail
   3243 		both ""
   3244 			precision mediump float;
   3245 
   3246 			void func (varying vec3 f)
   3247 			{
   3248 			}
   3249 
   3250 			void main ()
   3251 			{
   3252 				${POSITION_FRAG_COLOR} = vec4(1.0);
   3253 			}
   3254 		""
   3255 	end
   3256 
   3257 	case attribute_argument
   3258 		expect compile_fail
   3259 		both ""
   3260 			precision mediump float;
   3261 
   3262 			void func (attribute vec3 f)
   3263 			{
   3264 			}
   3265 
   3266 			void main ()
   3267 			{
   3268 				${POSITION_FRAG_COLOR} = vec4(1.0);
   3269 			}
   3270 		""
   3271 	end
   3272 
   3273 	case uniform_return_type
   3274 		expect compile_fail
   3275 		both ""
   3276 			precision mediump float;
   3277 
   3278 			uniform float func (vec3 f)
   3279 			{
   3280 				return f.x;
   3281 			}
   3282 
   3283 			void main ()
   3284 			{
   3285 				${POSITION_FRAG_COLOR} = vec4(1.0);
   3286 			}
   3287 		""
   3288 	end
   3289 
   3290 	case varying_return_type
   3291 		expect compile_fail
   3292 		both ""
   3293 			precision mediump float;
   3294 
   3295 			varying float func (vec3 f)
   3296 			{
   3297 				return f.x;
   3298 			}
   3299 
   3300 			void main ()
   3301 			{
   3302 				${POSITION_FRAG_COLOR} = vec4(1.0);
   3303 			}
   3304 		""
   3305 	end
   3306 
   3307 	case attribute_return_type
   3308 		expect compile_fail
   3309 		both ""
   3310 			precision mediump float;
   3311 
   3312 			attribute float func (vec3 f)
   3313 			{
   3314 				return f.x;
   3315 			}
   3316 
   3317 			void main ()
   3318 			{
   3319 				${POSITION_FRAG_COLOR} = vec4(1.0);
   3320 			}
   3321 		""
   3322 	end
   3323 
   3324 	case main_invalid_return_type
   3325 		expect compile_fail
   3326 		both ""
   3327 			precision mediump float;
   3328 
   3329 			float main ()
   3330 			{
   3331 				${POSITION_FRAG_COLOR} = vec4(1.0);
   3332 			}
   3333 		""
   3334 	end
   3335 
   3336 	case main_has_arguments
   3337 		expect compile_fail
   3338 		both ""
   3339 			precision mediump float;
   3340 
   3341 			void main (float f)
   3342 			{
   3343 				${POSITION_FRAG_COLOR} = vec4(1.0);
   3344 			}
   3345 		""
   3346 	end
   3347 
   3348 	case main_missing_return_type
   3349 		expect compile_fail
   3350 		both ""
   3351 			precision mediump float;
   3352 
   3353 			main ()
   3354 			{
   3355 				${POSITION_FRAG_COLOR} = vec4(1.0);
   3356 			}
   3357 		""
   3358 	end
   3359 
   3360 	case write_const_arg
   3361 		expect compile_fail
   3362 		both ""
   3363 			precision mediump float;
   3364 
   3365 			func (const float f)
   3366 			{
   3367 				f = 1.0;
   3368 			}
   3369 
   3370 			main ()
   3371 			{
   3372 				${POSITION_FRAG_COLOR} = vec4(1.0);
   3373 			}
   3374 		""
   3375 	end
   3376 
   3377 	case write_const_array_arg
   3378 		expect compile_fail
   3379 		both ""
   3380 			precision mediump float;
   3381 
   3382 			func (const float f[3])
   3383 			{
   3384 				f[0] = 1.0;
   3385 			}
   3386 
   3387 			main ()
   3388 			{
   3389 				${POSITION_FRAG_COLOR} = vec4(1.0);
   3390 			}
   3391 		""
   3392 	end
   3393 
   3394 	case modify_const_arg
   3395 		expect compile_fail
   3396 		both ""
   3397 			precision mediump float;
   3398 			precision mediump int;
   3399 			${DECLARATIONS}
   3400 
   3401 			int func (const int a)
   3402 			{
   3403 				a = -a;
   3404 				return 2 * a;
   3405 			}
   3406 
   3407 			void main()
   3408 			{
   3409 				${POSITION_FRAG_COLOR} = vec4(func(3));
   3410 			}
   3411 		""
   3412 	end
   3413 
   3414 	case init_const_local_from_const_arg
   3415 		expect compile_fail
   3416 		both ""
   3417 			precision mediump float;
   3418 			precision mediump int;
   3419 			${DECLARATIONS}
   3420 
   3421 			int func (const int a)
   3422 			{
   3423 				const int b = -a;
   3424 				return 2 * b;
   3425 			}
   3426 
   3427 			void main()
   3428 			{
   3429 				${POSITION_FRAG_COLOR} = vec4(func(3));
   3430 			}
   3431 		""
   3432 	end
   3433 
   3434 	case array_size_from_const_arg
   3435 		expect compile_fail
   3436 		both ""
   3437 			precision mediump float;
   3438 			precision mediump int;
   3439 			${DECLARATIONS}
   3440 
   3441 			int func (const int a)
   3442 			{
   3443 				int arr[a];
   3444 				arr[1] = 3;
   3445 				return arr[1];
   3446 			}
   3447 
   3448 			void main()
   3449 			{
   3450 				${POSITION_FRAG_COLOR} = vec4(func(3));
   3451 			}
   3452 		""
   3453 	end
   3454 
   3455 	case double_declare
   3456 		expect compile_fail
   3457 		both ""
   3458 			precision mediump float;
   3459 			${DECLARATIONS}
   3460 
   3461 			float func (float f);
   3462 			float func (float f);
   3463 
   3464 			float func (float f)
   3465 			{
   3466 				return -f;
   3467 			}
   3468 
   3469 			void main()
   3470 			{
   3471 				${POSITION_FRAG_COLOR} = vec4(func(1.0));
   3472 			}
   3473 		""
   3474 	end
   3475 
   3476 end # invalid
   3477