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
10group datatypes "Function Parameter Data Types"
11
12	case float_float
13		version 300 es
14		values
15		{
16			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
17			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
18		}
19
20		both ""
21			#version 300 es
22			precision mediump float;
23			${DECLARATIONS}
24
25			float func (float a)
26			{
27				return -a;
28			}
29
30			void main()
31			{
32				out0 = func(in0);
33				${OUTPUT}
34			}
35		""
36	end
37
38	case float_vec2
39		version 300 es
40		values
41		{
42			input vec2 in0		= [ vec2(0.0, 1.0) | vec2(2.0, 2.5) ];
43			output float out0	= [ -1.0 | -4.5 ];
44		}
45
46		both ""
47			#version 300 es
48			precision mediump float;
49			${DECLARATIONS}
50
51			float func (vec2 a)
52			{
53				return -(a.x + a.y);
54			}
55
56			void main()
57			{
58				out0 = func(in0);
59				${OUTPUT}
60			}
61		""
62	end
63
64	case float_vec3
65		version 300 es
66		values
67		{
68			input vec3 in0		= [ vec3(0.0, 1.0, -2.0) | vec3(2.0, 2.5, -4.0) ];
69			output float out0	= [ 1.0 | -0.5 ];
70		}
71
72		both ""
73			#version 300 es
74			precision mediump float;
75			${DECLARATIONS}
76
77			float func (vec3 a)
78			{
79				return -(a.x + a.y + a.z);
80			}
81
82			void main()
83			{
84				out0 = func(in0);
85				${OUTPUT}
86			}
87		""
88	end
89
90	case float_vec4
91		version 300 es
92		values
93		{
94			input vec4 in0		= [ vec4(0.0, 1.0, -2.0, 0.5) | vec4(2.0, 2.5, 4.0, -7.0) ];
95			output float out0	= [ 0.5 | -1.5 ];
96		}
97
98		both ""
99			#version 300 es
100			precision mediump float;
101			${DECLARATIONS}
102
103			float func (vec4 a)
104			{
105				return -(a.x + a.y + a.z + a.w);
106			}
107
108			void main()
109			{
110				out0 = func(in0);
111				${OUTPUT}
112			}
113		""
114	end
115
116	case float_mat2
117		version 300 es
118		values
119		{
120			input mat2 in0		= [ mat2(0.0, 1.0, -2.0, 0.5) | mat2(2.0, 2.5, 4.0, -7.0) ];
121			output float out0	= [ 0.5 | -1.5 ];
122		}
123
124		both ""
125			#version 300 es
126			precision mediump float;
127			${DECLARATIONS}
128
129			float func (mat2 a)
130			{
131				return -(a[0][0] + a[0][1] + a[1][0] + a[1][1]);
132			}
133
134			void main()
135			{
136				out0 = func(in0);
137				${OUTPUT}
138			}
139		""
140	end
141
142	case float_mat3
143		version 300 es
144		values
145		{
146			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) ];
147			output float out0	= [ -4.5 | -5.0 ];
148		}
149
150		both ""
151			#version 300 es
152			precision mediump float;
153			${DECLARATIONS}
154
155			float func (mat3 a)
156			{
157				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]);
158			}
159
160			void main()
161			{
162				out0 = func(in0);
163				${OUTPUT}
164			}
165		""
166	end
167
168	case float_mat4
169		version 300 es
170		values
171		{
172			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) ];
173			output float out0	= [ -5.5 | -9.0 ];
174		}
175
176		both ""
177			#version 300 es
178			precision mediump float;
179			${DECLARATIONS}
180
181			float func (mat4 a)
182			{
183				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]);
184			}
185
186			void main()
187			{
188				out0 = func(in0);
189				${OUTPUT}
190			}
191		""
192	end
193
194	case int_int
195		version 300 es
196		values
197		{
198			input int in0		= [ -1 | 0 | 1 | 4 ];
199			output int out0		= [ 1 | 0 | -1 | -4 ];
200		}
201
202		both ""
203			#version 300 es
204			precision mediump float;
205			precision mediump int;
206			${DECLARATIONS}
207
208			int func (int a)
209			{
210				return -a;
211			}
212
213			void main()
214			{
215				${SETUP}
216				out0 = func(in0);
217				${OUTPUT}
218			}
219		""
220	end
221
222	case int_ivec2
223		version 300 es
224		values
225		{
226			input ivec2 in0		= [ ivec2(-1, 0) | ivec2(1, 4) ];
227			output int out0		= [ 1 | -5 ];
228		}
229
230		both ""
231			#version 300 es
232			precision mediump float;
233			precision mediump int;
234			${DECLARATIONS}
235
236			int func (ivec2 a)
237			{
238				return -(a.x + a.y);
239			}
240
241			void main()
242			{
243				${SETUP}
244				out0 = func(in0);
245				${OUTPUT}
246			}
247		""
248	end
249
250	case int_ivec3
251		version 300 es
252		values
253		{
254			input ivec3 in0		= [ ivec3(-1, 0, 2) | ivec3(1, 4, -8) ];
255			output int out0		= [ -1 | 3 ];
256		}
257
258		both ""
259			#version 300 es
260			precision mediump float;
261			precision mediump int;
262			${DECLARATIONS}
263
264			int func (ivec3 a)
265			{
266				return -(a.x + a.y + a.z);
267			}
268
269			void main()
270			{
271				${SETUP}
272				out0 = func(in0);
273				${OUTPUT}
274			}
275		""
276	end
277
278	case int_ivec4
279		version 300 es
280		values
281		{
282			input ivec4 in0		= [ ivec4(-1, 0, 2, 2) | ivec4(1, 4, -8, 2) ];
283			output int out0		= [ -3 | 1 ];
284		}
285
286		both ""
287			#version 300 es
288			precision mediump float;
289			precision mediump int;
290			${DECLARATIONS}
291
292			int func (ivec4 a)
293			{
294				return -(a.x + a.y + a.z + a.w);
295			}
296
297			void main()
298			{
299				${SETUP}
300				out0 = func(in0);
301				${OUTPUT}
302			}
303		""
304	end
305
306	case uint_uint
307		version 300 es
308		values
309		{
310			input uint in0		= [ 1 | 0 | 2 | 4 ];
311			output uint out0	= [ 1 | 0 | 4 | 16 ];
312		}
313
314		both ""
315			#version 300 es
316			precision mediump float;
317			precision mediump int;
318			${DECLARATIONS}
319
320			uint func (uint a)
321			{
322				return a*a;
323			}
324
325			void main()
326			{
327				${SETUP}
328				out0 = func(in0);
329				${OUTPUT}
330			}
331		""
332	end
333
334	case uint_uvec2
335		version 300 es
336		values
337		{
338			input uvec2 in0		= [ uvec2(1, 0) | uvec2(2, 4) ];
339			output uint out0	= [ 1 | 6 ];
340		}
341
342		both ""
343			#version 300 es
344			precision mediump float;
345			precision mediump int;
346			${DECLARATIONS}
347
348			uint func (uvec2 a)
349			{
350				return (a.x + a.y);
351			}
352
353			void main()
354			{
355				${SETUP}
356				out0 = func(in0);
357				${OUTPUT}
358			}
359		""
360	end
361
362	case uint_uvec3
363		version 300 es
364		values
365		{
366			input uvec3 in0		= [ uvec3(1, 0, 2) | uvec3(1, 4, 8) ];
367			output uint out0		= [ 3 | 13 ];
368		}
369
370		both ""
371			#version 300 es
372			precision mediump float;
373			precision mediump int;
374			${DECLARATIONS}
375
376			uint func (uvec3 a)
377			{
378				return (a.x + a.y + a.z);
379			}
380
381			void main()
382			{
383				${SETUP}
384				out0 = func(in0);
385				${OUTPUT}
386			}
387		""
388	end
389
390	case uint_uvec4
391		version 300 es
392		values
393		{
394			input uvec4 in0		= [ uvec4(1, 0, 2, 2) | uvec4(1, 4, 8, 2) ];
395			output uint out0	= [ 5 | 15 ];
396		}
397
398		both ""
399			#version 300 es
400			precision mediump float;
401			precision mediump int;
402			${DECLARATIONS}
403
404			uint func (uvec4 a)
405			{
406				return (a.x + a.y + a.z + a.w);
407			}
408
409			void main()
410			{
411				${SETUP}
412				out0 = func(in0);
413				${OUTPUT}
414			}
415		""
416	end
417
418	case bool_bool
419		version 300 es
420		values
421		{
422			input bool in0		= [ true | false ];
423			output bool out0	= [ false | true ];
424		}
425
426		both ""
427			#version 300 es
428			precision mediump float;
429			${DECLARATIONS}
430
431			bool func (bool a)
432			{
433				return !a;
434			}
435
436			void main()
437			{
438				${SETUP}
439				out0 = func(in0);
440				${OUTPUT}
441			}
442		""
443	end
444
445	case bool_bvec2
446		version 300 es
447		values
448		{
449			input bvec2 in0		= [ bvec2(true, true) | bvec2(false, true) ];
450			output bool out0	= [ false | true ];
451		}
452
453		both ""
454			#version 300 es
455			precision mediump float;
456			${DECLARATIONS}
457
458			bool func (bvec2 a)
459			{
460				return !(a.x == a.y);
461			}
462
463			void main()
464			{
465				${SETUP}
466				out0 = func(in0);
467				${OUTPUT}
468			}
469		""
470	end
471
472	case bool_bvec3
473		version 300 es
474		values
475		{
476			input bvec3 in0		= [ bvec3(true, true, false) | bvec3(true, false, false) ];
477			output bool out0	= [ false | true ];
478		}
479
480		both ""
481			#version 300 es
482			precision mediump float;
483			${DECLARATIONS}
484
485			bool func (bvec3 a)
486			{
487				return (a.x == a.y) == a.z;
488			}
489
490			void main()
491			{
492				${SETUP}
493				out0 = func(in0);
494				${OUTPUT}
495			}
496		""
497	end
498
499	case bool_bvec4
500		version 300 es
501		values
502		{
503			input bvec4 in0		= [ bvec4(true, true, true, false) | bvec4(false, false, true, true) | bvec4(true, false, false, true) ];
504			output bool out0	= [ false | true | true ];
505		}
506
507		both ""
508			#version 300 es
509			precision mediump float;
510			${DECLARATIONS}
511
512			bool func (bvec4 a)
513			{
514				return ((a.x == a.y) == (a.z == a.w));
515			}
516
517			void main()
518			{
519				${SETUP}
520				out0 = func(in0);
521				${OUTPUT}
522			}
523		""
524	end
525
526	case mat2
527		version 300 es
528		values
529		{
530			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) ];
531			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) ];
532		}
533
534		both ""
535			#version 300 es
536			precision mediump float;
537			${DECLARATIONS}
538
539			mat2 func (mat2 a)
540			{
541				return -2.0*a;
542			}
543
544			void main()
545			{
546				${SETUP}
547				out0 = func(in0);
548				${OUTPUT}
549			}
550		""
551	end
552
553
554	case mat2x3
555		version 300 es
556		values
557		{
558			input mat2x3 in0	= [ mat2x3(2.5, 0.0, 1.0, -2.5, 1.0, 3.0) | mat2x3(0.0, 2.0, 1.5, -3.5, 2.0, 0.5) | mat2x3(-1.5, -3.5, 2.5, 0.0, 1.5, 3.0) ];
559			output mat2x3 out0	= [ mat2x3(-5.0, -0.0, -2.0, 5.0, -2.0, -6.0) | mat2x3(-0.0, -4.0, -3.0, 7.0, -4.0, -1.0) | mat2x3(3.0, 7.0, -5.0, -0.0, -3.0, -6.0) ];
560		}
561
562		both ""
563			#version 300 es
564			precision mediump float;
565			${DECLARATIONS}
566
567			mat2x3 func (mat2x3 a)
568			{
569				return -2.0*a;
570			}
571
572			void main()
573			{
574				${SETUP}
575				out0 = func(in0);
576				${OUTPUT}
577			}
578		""
579	end
580
581
582	case mat2x4
583		version 300 es
584		values
585		{
586			input mat2x4 in0	= [ mat2x4(1.5, 3.0, -1.0, 2.5, -0.5, 3.5, 3.0, -3.0) | mat2x4(-2.5, -2.0, 3.5, -0.5, 1.0, -1.5, 0.0, -1.0) | mat2x4(-1.0, 0.5, 0.5, 3.0, 1.5, 3.0, 2.5, 3.5) ];
587			output mat2x4 out0	= [ mat2x4(-3.0, -6.0, 2.0, -5.0, 1.0, -7.0, -6.0, 6.0) | mat2x4(5.0, 4.0, -7.0, 1.0, -2.0, 3.0, -0.0, 2.0) | mat2x4(2.0, -1.0, -1.0, -6.0, -3.0, -6.0, -5.0, -7.0) ];
588		}
589
590		both ""
591			#version 300 es
592			precision mediump float;
593			${DECLARATIONS}
594
595			mat2x4 func (mat2x4 a)
596			{
597				return -2.0*a;
598			}
599
600			void main()
601			{
602				${SETUP}
603				out0 = func(in0);
604				${OUTPUT}
605			}
606		""
607	end
608
609
610	case mat3x2
611		version 300 es
612		values
613		{
614			input mat3x2 in0	= [ mat3x2(1.5, -2.5, 2.5, 3.5, 3.0, 0.5) | mat3x2(1.5, -2.0, 2.5, 0.5, -1.5, -3.5) | mat3x2(2.5, 3.5, -3.0, 2.5, -0.5, -2.5) ];
615			output mat3x2 out0	= [ mat3x2(-3.0, 5.0, -5.0, -7.0, -6.0, -1.0) | mat3x2(-3.0, 4.0, -5.0, -1.0, 3.0, 7.0) | mat3x2(-5.0, -7.0, 6.0, -5.0, 1.0, 5.0) ];
616		}
617
618		both ""
619			#version 300 es
620			precision mediump float;
621			${DECLARATIONS}
622
623			mat3x2 func (mat3x2 a)
624			{
625				return -2.0*a;
626			}
627
628			void main()
629			{
630				${SETUP}
631				out0 = func(in0);
632				${OUTPUT}
633			}
634		""
635	end
636
637
638	case mat3
639		version 300 es
640		values
641		{
642			input mat3 in0	= [ mat3(-1.5, 2.0, 3.0, -3.5, 1.0, -3.5, 1.5, -1.5, 3.0) | mat3(3.5, 0.0, 3.5, -1.5, -3.0, 0.5, -3.5, -2.5, -0.5) | mat3(1.0, -2.5, -3.5, 3.0, -1.5, 3.5, 3.0, -1.0, -0.5) ];
643			output mat3 out0	= [ mat3(3.0, -4.0, -6.0, 7.0, -2.0, 7.0, -3.0, 3.0, -6.0) | mat3(-7.0, -0.0, -7.0, 3.0, 6.0, -1.0, 7.0, 5.0, 1.0) | mat3(-2.0, 5.0, 7.0, -6.0, 3.0, -7.0, -6.0, 2.0, 1.0) ];
644		}
645
646		both ""
647			#version 300 es
648			precision mediump float;
649			${DECLARATIONS}
650
651			mat3 func (mat3 a)
652			{
653				return -2.0*a;
654			}
655
656			void main()
657			{
658				${SETUP}
659				out0 = func(in0);
660				${OUTPUT}
661			}
662		""
663	end
664
665
666	case mat3x4
667		version 300 es
668		values
669		{
670			input mat3x4 in0	= [ mat3x4(0.0, 1.0, 0.5, 0.5, 1.0, 3.5, 0.0, -0.5, 1.5, -2.0, -1.5, 3.5) | mat3x4(0.0, 0.5, -3.5, -0.5, 0.5, -3.5, 1.0, 1.0, -3.5, 1.0, -0.5, 1.5) | mat3x4(-1.0, 1.5, 2.0, -3.5, -3.5, 1.5, 3.5, -2.0, -0.5, 0.5, -1.5, -1.0) ];
671			output mat3x4 out0	= [ mat3x4(-0.0, -2.0, -1.0, -1.0, -2.0, -7.0, -0.0, 1.0, -3.0, 4.0, 3.0, -7.0) | mat3x4(-0.0, -1.0, 7.0, 1.0, -1.0, 7.0, -2.0, -2.0, 7.0, -2.0, 1.0, -3.0) | mat3x4(2.0, -3.0, -4.0, 7.0, 7.0, -3.0, -7.0, 4.0, 1.0, -1.0, 3.0, 2.0) ];
672		}
673
674		both ""
675			#version 300 es
676			precision mediump float;
677			${DECLARATIONS}
678
679			mat3x4 func (mat3x4 a)
680			{
681				return -2.0*a;
682			}
683
684			void main()
685			{
686				${SETUP}
687				out0 = func(in0);
688				${OUTPUT}
689			}
690		""
691	end
692
693
694	case mat4x2
695		version 300 es
696		values
697		{
698			input mat4x2 in0	= [ mat4x2(-1.5, -1.0, 0.5, -1.5, -1.0, 2.0, -3.5, 0.5) | mat4x2(2.0, -1.5, -2.0, 2.5, -2.0, -2.5, -0.5, 1.5) | mat4x2(-3.0, -1.5, -1.0, 2.5, -0.5, 2.5, -2.5, -1.0) ];
699			output mat4x2 out0	= [ mat4x2(3.0, 2.0, -1.0, 3.0, 2.0, -4.0, 7.0, -1.0) | mat4x2(-4.0, 3.0, 4.0, -5.0, 4.0, 5.0, 1.0, -3.0) | mat4x2(6.0, 3.0, 2.0, -5.0, 1.0, -5.0, 5.0, 2.0) ];
700		}
701
702		both ""
703			#version 300 es
704			precision mediump float;
705			${DECLARATIONS}
706
707			mat4x2 func (mat4x2 a)
708			{
709				return -2.0*a;
710			}
711
712			void main()
713			{
714				${SETUP}
715				out0 = func(in0);
716				${OUTPUT}
717			}
718		""
719	end
720
721
722	case mat4x3
723		version 300 es
724		values
725		{
726			input mat4x3 in0	= [ mat4x3(1.0, 3.0, -0.5, -2.0, -3.0, 0.0, -2.5, 2.5, 2.5, -2.5, -1.5, 2.5) | mat4x3(1.0, 2.5, -1.0, -3.0, -1.5, 2.0, -1.5, -1.0, -0.5, -0.5, -0.5, 3.0) | mat4x3(-2.5, -3.5, 3.5, 3.0, 3.5, -0.5, 3.5, 3.0, -2.0, 2.0, 2.5, 1.0) ];
727			output mat4x3 out0	= [ mat4x3(-2.0, -6.0, 1.0, 4.0, 6.0, -0.0, 5.0, -5.0, -5.0, 5.0, 3.0, -5.0) | mat4x3(-2.0, -5.0, 2.0, 6.0, 3.0, -4.0, 3.0, 2.0, 1.0, 1.0, 1.0, -6.0) | mat4x3(5.0, 7.0, -7.0, -6.0, -7.0, 1.0, -7.0, -6.0, 4.0, -4.0, -5.0, -2.0) ];
728		}
729
730		both ""
731			#version 300 es
732			precision mediump float;
733			${DECLARATIONS}
734
735			mat4x3 func (mat4x3 a)
736			{
737				return -2.0*a;
738			}
739
740			void main()
741			{
742				${SETUP}
743				out0 = func(in0);
744				${OUTPUT}
745			}
746		""
747	end
748
749
750	case mat4
751		version 300 es
752		values
753		{
754			input mat4 in0	= [ mat4(0.0, -1.5, -1.0, -2.0, -3.0, 0.5, -1.5, 2.5, -3.5, 3.0, 1.5, 3.0, 3.0, 3.0, 0.5, -3.5) | mat4(2.0, -2.5, -1.5, 1.0, 0.0, -0.5, 3.5, 1.0, -1.0, -2.0, 2.5, 0.0, 2.0, -1.0, -2.5, 0.5) | mat4(2.5, -2.5, 2.0, 3.0, 2.5, 2.5, -3.5, 1.0, 2.5, -3.5, -1.5, -1.5, 0.0, -0.5, 0.0, 2.0) ];
755			output mat4 out0	= [ mat4(-0.0, 3.0, 2.0, 4.0, 6.0, -1.0, 3.0, -5.0, 7.0, -6.0, -3.0, -6.0, -6.0, -6.0, -1.0, 7.0) | mat4(-4.0, 5.0, 3.0, -2.0, -0.0, 1.0, -7.0, -2.0, 2.0, 4.0, -5.0, -0.0, -4.0, 2.0, 5.0, -1.0) | mat4(-5.0, 5.0, -4.0, -6.0, -5.0, -5.0, 7.0, -2.0, -5.0, 7.0, 3.0, 3.0, -0.0, 1.0, -0.0, -4.0) ];
756		}
757
758		both ""
759			#version 300 es
760			precision mediump float;
761			${DECLARATIONS}
762
763			mat4 func (mat4 a)
764			{
765				return -2.0*a;
766			}
767
768			void main()
769			{
770				${SETUP}
771				out0 = func(in0);
772				${OUTPUT}
773			}
774		""
775	end
776
777	case float_struct
778		version 300 es
779		values
780		{
781			input vec3 in0		= [ vec3(0.0, 1.0, -2.0) | vec3(2.0, 2.5, -4.0) ];
782			output float out0	= [ 1.0 | -0.5 ];
783		}
784
785		both ""
786			#version 300 es
787			precision mediump float;
788			${DECLARATIONS}
789
790			struct Pos { float a, b, c; };
791
792			float func (Pos p)
793			{
794				return -(p.a + p.b + p.c);
795			}
796
797			void main()
798			{
799				Pos p = Pos(in0.x, in0.y, in0.z);
800				out0 = func(p);
801				${OUTPUT}
802			}
803		""
804	end
805
806	case struct_struct
807		version 300 es
808		values
809		{
810			input vec3 in0		= [ vec3(0.0, 1.0, -2.0) | vec3(2.0, 2.5, -4.0) ];
811			output float out0	= [ 1.0 | -0.5 ];
812		}
813
814		both ""
815			#version 300 es
816			precision mediump float;
817			${DECLARATIONS}
818
819			struct Pos { float a, b, c; };
820
821			Pos func (Pos p)
822			{
823				return Pos(-p.a, -p.b, -p.c);
824			}
825
826			void main()
827			{
828				Pos p = Pos(in0.x, in0.y, in0.z);
829				p = func(p);
830				out0 = p.a + p.b + p.c;
831				${OUTPUT}
832			}
833		""
834	end
835
836	case struct_nested_struct
837		version 300 es
838		values
839		{
840			input vec3 in0		= [ vec3(0.0, 1.0, -2.0) | vec3(2.0, 2.5, -4.0) ];
841			output float out0	= [ 1.0 | -0.5 ];
842		}
843
844		both ""
845			#version 300 es
846			precision mediump float;
847			${DECLARATIONS}
848
849			struct Pos { float a, b, c; };
850			struct Line { Pos start, end; };
851
852			Line func (Pos p)
853			{
854				return Line(p, Pos(-p.a, -p.b, -p.c));
855			}
856
857			float sum (Pos p)
858			{
859				return (p.a + p.b + p.c);
860			}
861
862			void main()
863			{
864				Pos p = Pos(in0.x, in0.y, in0.z);
865				Line line = func(p);
866				out0 = sum(line.start) + (2.0 * sum(line.end));
867				${OUTPUT}
868			}
869		""
870	end
871
872	case struct_constructor_highp_in_fragment
873		version 300 es
874		desc "passing highp vector to struct constructor in fragment shader yields all zeros"
875		vertex ""
876			#version 300 es
877			${VERTEX_DECLARATIONS}
878			void main()
879			{
880				${VERTEX_OUTPUT}
881			}
882		""
883		fragment ""
884			#version 300 es
885			${FRAGMENT_DECLARATIONS}
886			#ifdef GL_FRAGMENT_PRECISION_HIGH
887			#define PRECISION highp
888			#else
889			#define PRECISION mediump
890			#endif
891			struct Test {
892				PRECISION vec3 color;
893			} ;
894			void main() {
895				PRECISION vec3 color = vec3(0.2, 2.0, 0.1);
896				Test test = Test(color);
897				// Bias the color so all components are guaranteed > 1.0.
898				${FRAG_COLOR} = vec4(vec3(0.25, 0.55, 0.65) + vec3(4.0, 0.25, 4.0) * test.color, 1.0);
899			}
900		""
901	end
902
903
904end # datatypes
905
906group qualifiers "Function Parameter Qualifiers"
907
908	case in_float
909		version 300 es
910		values
911		{
912			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
913			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
914		}
915
916		both ""
917			#version 300 es
918			precision mediump float;
919			precision mediump int;
920			${DECLARATIONS}
921
922			float func (in float a)
923			{
924				a = -a;
925				return 2.0 * a;
926			}
927
928			void main()
929			{
930				${SETUP}
931				float f = in0;
932				float g = func(f);
933				out0 = f + g;
934				${OUTPUT}
935			}
936		""
937	end
938
939	case out_float
940		version 300 es
941		values
942		{
943			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
944			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
945		}
946
947		both ""
948			#version 300 es
949			precision mediump float;
950			precision mediump int;
951			${DECLARATIONS}
952
953			void func (out float a)
954			{
955				a = -1.0;
956			}
957
958			void main()
959			{
960				${SETUP}
961				float f = 1.0;
962				func(f);
963				out0 = f * in0;
964				${OUTPUT}
965			}
966		""
967	end
968
969	case inout_float
970		version 300 es
971		values
972		{
973			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
974			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
975		}
976
977		both ""
978			#version 300 es
979			precision mediump float;
980			precision mediump int;
981			${DECLARATIONS}
982
983			void func (inout float a)
984			{
985				a = -a;
986			}
987
988			void main()
989			{
990				${SETUP}
991				float f = 1.0;
992				func(f);
993				out0 = f * in0;
994				${OUTPUT}
995			}
996		""
997	end
998
999	case in_lowp_float
1000		version 300 es
1001		values
1002		{
1003			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
1004			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
1005		}
1006
1007		both ""
1008			#version 300 es
1009			precision mediump float;
1010			precision mediump int;
1011			${DECLARATIONS}
1012
1013			float func (in lowp float a)
1014			{
1015				a = -a;
1016				return 2.0 * a;
1017			}
1018
1019			void main()
1020			{
1021				${SETUP}
1022				float f = in0;
1023				float g = func(f);
1024				out0 = f + g;
1025				${OUTPUT}
1026			}
1027		""
1028	end
1029
1030	case out_lowp_float
1031		version 300 es
1032		values
1033		{
1034			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
1035			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
1036		}
1037
1038		both ""
1039			#version 300 es
1040			precision mediump float;
1041			precision mediump int;
1042			${DECLARATIONS}
1043
1044			void func (out lowp float a)
1045			{
1046				a = -1.0;
1047			}
1048
1049			void main()
1050			{
1051				${SETUP}
1052				float f = 1.0;
1053				func(f);
1054				out0 = f * in0;
1055				${OUTPUT}
1056			}
1057		""
1058	end
1059
1060	case inout_lowp_float
1061		version 300 es
1062		values
1063		{
1064			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
1065			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
1066		}
1067
1068		both ""
1069			#version 300 es
1070			precision mediump float;
1071			precision mediump int;
1072			${DECLARATIONS}
1073
1074			void func (inout lowp float a)
1075			{
1076				a = -a;
1077			}
1078
1079			void main()
1080			{
1081				${SETUP}
1082				float f = 1.0;
1083				func(f);
1084				out0 = f * in0;
1085				${OUTPUT}
1086			}
1087		""
1088	end
1089
1090	case in_highp_float
1091		version 300 es
1092		values
1093		{
1094			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
1095			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
1096		}
1097
1098		both ""
1099			#version 300 es
1100			precision mediump float;
1101			precision mediump int;
1102			${DECLARATIONS}
1103
1104			float func (in highp float a)
1105			{
1106				a = -a;
1107				return 2.0 * a;
1108			}
1109
1110			void main()
1111			{
1112				${SETUP}
1113				float f = in0;
1114				float g = func(f);
1115				out0 = f + g;
1116				${OUTPUT}
1117			}
1118		""
1119	end
1120
1121	case out_highp_float
1122		version 300 es
1123		values
1124		{
1125			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
1126			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
1127		}
1128
1129		both ""
1130			#version 300 es
1131			precision mediump float;
1132			precision mediump int;
1133			${DECLARATIONS}
1134
1135			void func (out highp float a)
1136			{
1137				a = -1.0;
1138			}
1139
1140			void main()
1141			{
1142				${SETUP}
1143				float f = 1.0;
1144				func(f);
1145				out0 = f * in0;
1146				${OUTPUT}
1147			}
1148		""
1149	end
1150
1151	case inout_highp_float
1152		version 300 es
1153		values
1154		{
1155			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
1156			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
1157		}
1158
1159		both ""
1160			#version 300 es
1161			precision mediump float;
1162			precision mediump int;
1163			${DECLARATIONS}
1164
1165			void func (inout highp float a)
1166			{
1167				a = -a;
1168			}
1169
1170			void main()
1171			{
1172				${SETUP}
1173				float f = 1.0;
1174				func(f);
1175				out0 = f * in0;
1176				${OUTPUT}
1177			}
1178		""
1179	end
1180
1181	case const_float
1182		version 300 es
1183		values
1184		{
1185			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
1186			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
1187		}
1188
1189		both ""
1190			#version 300 es
1191			precision mediump float;
1192			precision mediump int;
1193			${DECLARATIONS}
1194
1195			float func (const float a)
1196			{
1197				float b = -a;
1198				return 2.0 * b;
1199			}
1200
1201			void main()
1202			{
1203				${SETUP}
1204				float f = in0;
1205				float g = func(f);
1206				out0 = f + g;
1207				${OUTPUT}
1208			}
1209		""
1210	end
1211
1212	case const_in_float
1213		version 300 es
1214		values
1215		{
1216			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
1217			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
1218		}
1219
1220		both ""
1221			#version 300 es
1222			precision mediump float;
1223			precision mediump int;
1224			${DECLARATIONS}
1225
1226			float func (const in float a)
1227			{
1228				float b = -a;
1229				return 2.0 * b;
1230			}
1231
1232			void main()
1233			{
1234				${SETUP}
1235				float f = in0;
1236				float g = func(f);
1237				out0 = f + g;
1238				${OUTPUT}
1239			}
1240		""
1241	end
1242
1243	case in_int
1244		version 300 es
1245		values
1246		{
1247			input int in0		= [ 0 | 1 | -2 | 4 ];
1248			output int out0		= [ 0 | -1 | 2 | -4 ];
1249		}
1250
1251		both ""
1252			#version 300 es
1253			precision mediump float;
1254			precision mediump int;
1255			${DECLARATIONS}
1256
1257			int func (in int a)
1258			{
1259				a = -a;
1260				return 2 * a;
1261			}
1262
1263			void main()
1264			{
1265				${SETUP}
1266				int f = in0;
1267				int g = func(f);
1268				out0 = f + g;
1269				${OUTPUT}
1270			}
1271		""
1272	end
1273
1274	case out_int
1275		version 300 es
1276		values
1277		{
1278			input int in0		= [ 0 | 1 | -2 | 6 ];
1279			output int out0		= [ 0 | -1 | 2 | -6 ];
1280		}
1281
1282		both ""
1283			#version 300 es
1284			precision mediump float;
1285			precision mediump int;
1286			${DECLARATIONS}
1287
1288			void func (out int a)
1289			{
1290				a = -1;
1291			}
1292
1293			void main()
1294			{
1295				${SETUP}
1296				int f = 1;
1297				func(f);
1298				out0 = f * in0;
1299				${OUTPUT}
1300			}
1301		""
1302	end
1303
1304	case inout_int
1305		version 300 es
1306		values
1307		{
1308			input int in0		= [ 0 | 1 | -2 | 6 ];
1309			output int out0		= [ 0 | -1 | 2 | -6 ];
1310		}
1311
1312		both ""
1313			#version 300 es
1314			precision mediump float;
1315			precision mediump int;
1316			${DECLARATIONS}
1317
1318			void func (inout int a)
1319			{
1320				a = -a;
1321			}
1322
1323			void main()
1324			{
1325				${SETUP}
1326				int f = 1;
1327				func(f);
1328				out0 = f * in0;
1329				${OUTPUT}
1330			}
1331		""
1332	end
1333
1334	case in_lowp_int
1335		version 300 es
1336		values
1337		{
1338			input int in0		= [ 0 | 1 | -2 | 4 ];
1339			output int out0		= [ 0 | -1 | 2 | -4 ];
1340		}
1341
1342		both ""
1343			#version 300 es
1344			precision mediump float;
1345			precision mediump int;
1346			${DECLARATIONS}
1347
1348			int func (in lowp int a)
1349			{
1350				a = -a;
1351				return 2 * a;
1352			}
1353
1354			void main()
1355			{
1356				${SETUP}
1357				int f = in0;
1358				int g = func(f);
1359				out0 = f + g;
1360				${OUTPUT}
1361			}
1362		""
1363	end
1364
1365	case out_lowp_int
1366		version 300 es
1367		values
1368		{
1369			input int in0		= [ 0 | 1 | -2 | 6 ];
1370			output int out0		= [ 0 | -1 | 2 | -6 ];
1371		}
1372
1373		both ""
1374			#version 300 es
1375			precision mediump float;
1376			precision mediump int;
1377			${DECLARATIONS}
1378
1379			void func (out lowp int a)
1380			{
1381				a = -1;
1382			}
1383
1384			void main()
1385			{
1386				${SETUP}
1387				int f = 1;
1388				func(f);
1389				out0 = f * in0;
1390				${OUTPUT}
1391			}
1392		""
1393	end
1394
1395	case inout_lowp_int
1396		version 300 es
1397		values
1398		{
1399			input int in0		= [ 0 | 1 | -2 | 6 ];
1400			output int out0		= [ 0 | -1 | 2 | -6 ];
1401		}
1402
1403		both ""
1404			#version 300 es
1405			precision mediump float;
1406			precision mediump int;
1407			${DECLARATIONS}
1408
1409			void func (inout lowp int a)
1410			{
1411				a = -a;
1412			}
1413
1414			void main()
1415			{
1416				${SETUP}
1417				int f = 1;
1418				func(f);
1419				out0 = f * in0;
1420				${OUTPUT}
1421			}
1422		""
1423	end
1424
1425	case in_highp_int
1426		version 300 es
1427		values
1428		{
1429			input int in0		= [ 0 | 1 | -2 | 4 ];
1430			output int out0		= [ 0 | -1 | 2 | -4 ];
1431		}
1432
1433		both ""
1434			#version 300 es
1435			precision mediump float;
1436			precision mediump int;
1437			${DECLARATIONS}
1438
1439			int func (in highp int a)
1440			{
1441				a = -a;
1442				return 2 * a;
1443			}
1444
1445			void main()
1446			{
1447				${SETUP}
1448				int f = in0;
1449				int g = func(f);
1450				out0 = f + g;
1451				${OUTPUT}
1452			}
1453		""
1454	end
1455
1456	case out_highp_int
1457		version 300 es
1458		values
1459		{
1460			input int in0		= [ 0 | 1 | -2 | 6 ];
1461			output int out0		= [ 0 | -1 | 2 | -6 ];
1462		}
1463
1464		both ""
1465			#version 300 es
1466			precision mediump float;
1467			precision mediump int;
1468			${DECLARATIONS}
1469
1470			void func (out highp int a)
1471			{
1472				a = -1;
1473			}
1474
1475			void main()
1476			{
1477				${SETUP}
1478				int f = 1;
1479				func(f);
1480				out0 = f * in0;
1481				${OUTPUT}
1482			}
1483		""
1484	end
1485
1486	case inout_highp_int
1487		version 300 es
1488		values
1489		{
1490			input int in0		= [ 0 | 1 | -2 | 6 ];
1491			output int out0		= [ 0 | -1 | 2 | -6 ];
1492		}
1493
1494		both ""
1495			#version 300 es
1496			precision mediump float;
1497			precision mediump int;
1498			${DECLARATIONS}
1499
1500			void func (inout highp int a)
1501			{
1502				a = -a;
1503			}
1504
1505			void main()
1506			{
1507				${SETUP}
1508				int f = 1;
1509				func(f);
1510				out0 = f * in0;
1511				${OUTPUT}
1512			}
1513		""
1514	end
1515
1516	case const_int
1517		version 300 es
1518		values
1519		{
1520			input int in0		= [ 0 | 1 | -2 | 4 ];
1521			output int out0		= [ 0 | -1 | 2 | -4 ];
1522		}
1523
1524		both ""
1525			#version 300 es
1526			precision mediump float;
1527			precision mediump int;
1528			${DECLARATIONS}
1529
1530			int func (const int a)
1531			{
1532				int b = -a;
1533				return 2 * b;
1534			}
1535
1536			void main()
1537			{
1538				${SETUP}
1539				int f = in0;
1540				int g = func(f);
1541				out0 = f + g;
1542				${OUTPUT}
1543			}
1544		""
1545	end
1546
1547	case const_in_int
1548		version 300 es
1549		values
1550		{
1551			input int in0		= [ 0 | 1 | -2 | 4 ];
1552			output int out0		= [ 0 | -1 | 2 | -4 ];
1553		}
1554
1555		both ""
1556			#version 300 es
1557			precision mediump float;
1558			precision mediump int;
1559			${DECLARATIONS}
1560
1561			int func (const in int a)
1562			{
1563				int b = -a;
1564				return 2 * b;
1565			}
1566
1567			void main()
1568			{
1569				${SETUP}
1570				int f = in0;
1571				int g = func(f);
1572				out0 = f + g;
1573				${OUTPUT}
1574			}
1575		""
1576	end
1577
1578	case in_bool
1579		version 300 es
1580		values
1581		{
1582			input bool in0		= [ true | false ];
1583			output bool out0	= [ true | true ];
1584		}
1585
1586		both ""
1587			#version 300 es
1588			precision mediump float;
1589			${DECLARATIONS}
1590
1591			bool func (in bool a)
1592			{
1593				a = !a;
1594				return a;
1595			}
1596
1597			void main()
1598			{
1599				${SETUP}
1600				bool f = in0;
1601				bool g = func(f);
1602				out0 = (f != g);
1603				${OUTPUT}
1604			}
1605		""
1606	end
1607
1608	case out_bool
1609		version 300 es
1610		values
1611		{
1612			input bool in0		= [ true | false ];
1613			output bool out0	= [ false | true ];
1614		}
1615
1616		both ""
1617			#version 300 es
1618			precision mediump float;
1619			${DECLARATIONS}
1620
1621			void func (out bool a)
1622			{
1623				a = false;
1624			}
1625
1626			void main()
1627			{
1628				${SETUP}
1629				bool f = true;
1630				func(f);
1631				out0 = (in0 == f);
1632				${OUTPUT}
1633			}
1634		""
1635	end
1636
1637	case inout_bool
1638		version 300 es
1639		values
1640		{
1641			input bool in0		= [ true | false ];
1642			output bool out0	= [ false | true ];
1643		}
1644
1645		both ""
1646			#version 300 es
1647			precision mediump float;
1648			${DECLARATIONS}
1649
1650			void func (inout bool a)
1651			{
1652				a = !a;
1653			}
1654
1655			void main()
1656			{
1657				${SETUP}
1658				bool f = true;
1659				func(f);
1660				out0 = (in0 == f);
1661				${OUTPUT}
1662			}
1663		""
1664	end
1665
1666	case const_bool
1667		version 300 es
1668		values
1669		{
1670			input bool in0		= [ true | false ];
1671			output bool out0	= [ true | true ];
1672		}
1673
1674		both ""
1675			#version 300 es
1676			precision mediump float;
1677			${DECLARATIONS}
1678
1679			bool func (const bool a)
1680			{
1681				bool b = !a;
1682				return b;
1683			}
1684
1685			void main()
1686			{
1687				${SETUP}
1688				bool f = in0;
1689				bool g = func(f);
1690				out0 = (f != g);
1691				${OUTPUT}
1692			}
1693		""
1694	end
1695
1696end # qualifiers
1697
1698group declarations "Function Declarations"
1699
1700	case basic
1701		version 300 es
1702		values
1703		{
1704			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
1705			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
1706		}
1707
1708		both ""
1709			#version 300 es
1710			precision mediump float;
1711			${DECLARATIONS}
1712
1713			float func (void);
1714
1715			float func (void)
1716			{
1717				return -1.0;
1718			}
1719
1720			void main()
1721			{
1722				out0 = func() * in0;
1723				${OUTPUT}
1724			}
1725		""
1726	end
1727
1728	case basic_arg
1729		version 300 es
1730		values
1731		{
1732			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
1733			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
1734		}
1735
1736		both ""
1737			#version 300 es
1738			precision mediump float;
1739			${DECLARATIONS}
1740
1741			float func (float f);
1742
1743			float func (float f)
1744			{
1745				return -f;
1746			}
1747
1748			void main()
1749			{
1750				out0 = func(in0);
1751				${OUTPUT}
1752			}
1753		""
1754	end
1755
1756	case define_after_use
1757		version 300 es
1758		values
1759		{
1760			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
1761			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
1762		}
1763
1764		both ""
1765			#version 300 es
1766			precision mediump float;
1767			${DECLARATIONS}
1768
1769			float func (void);
1770
1771			void main()
1772			{
1773				out0 = func() * in0;
1774				${OUTPUT}
1775			}
1776
1777			float func (void)
1778			{
1779				return -1.0;
1780			}
1781		""
1782	end
1783
1784	case double_declare
1785		version 300 es
1786		values
1787		{
1788			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
1789			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
1790		}
1791
1792		both ""
1793			#version 300 es
1794			precision mediump float;
1795			${DECLARATIONS}
1796
1797			float func (void);
1798
1799			float func (void);
1800
1801			float func (void)
1802			{
1803				return -1.0;
1804			}
1805
1806			void main()
1807			{
1808				out0 = func() * in0;
1809				${OUTPUT}
1810			}
1811		""
1812	end
1813
1814	case declare_after_define
1815		version 300 es
1816		values
1817		{
1818			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
1819			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
1820		}
1821
1822		both ""
1823			#version 300 es
1824			precision mediump float;
1825			${DECLARATIONS}
1826
1827			float func (void)
1828			{
1829				return -1.0;
1830			}
1831
1832			float func (void);
1833
1834			void main()
1835			{
1836				out0 = func() * in0;
1837				${OUTPUT}
1838			}
1839		""
1840	end
1841
1842	case void_vs_no_void
1843		version 300 es
1844		values
1845		{
1846			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
1847			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
1848		}
1849
1850		both ""
1851			#version 300 es
1852			precision mediump float;
1853			${DECLARATIONS}
1854
1855			float func ();
1856
1857			void main()
1858			{
1859				out0 = func() * in0;
1860				${OUTPUT}
1861			}
1862
1863			float func (void)
1864			{
1865				return -1.0;
1866			}
1867		""
1868	end
1869
1870	case in_vs_no_in
1871		version 300 es
1872		values
1873		{
1874			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
1875			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
1876		}
1877
1878		both ""
1879			#version 300 es
1880			precision mediump float;
1881			${DECLARATIONS}
1882
1883			float func (float f);
1884
1885			void main()
1886			{
1887				out0 = func(in0);
1888				${OUTPUT}
1889			}
1890
1891			float func (in float f)
1892			{
1893				return -f;
1894			}
1895		""
1896	end
1897
1898	case default_vs_explicit_precision
1899		version 300 es
1900		values
1901		{
1902			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
1903			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
1904		}
1905
1906		both ""
1907			#version 300 es
1908			precision mediump float;
1909			${DECLARATIONS}
1910
1911			float func (float f);
1912
1913			void main()
1914			{
1915				out0 = func(in0);
1916				${OUTPUT}
1917			}
1918
1919			float func (mediump float f)
1920			{
1921				return -f;
1922			}
1923		""
1924	end
1925
1926
1927end # declarations
1928
1929group overloading "Function Overloading"
1930
1931	case user_func_arg_type_simple
1932		version 300 es
1933		values
1934		{
1935			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
1936			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
1937		}
1938
1939		both ""
1940			#version 300 es
1941			precision mediump float;
1942			precision mediump int;
1943			${DECLARATIONS}
1944
1945			float func (float a)
1946			{
1947				return -a;
1948			}
1949
1950			int func (int a)
1951			{
1952				return -a;
1953			}
1954
1955			void main()
1956			{
1957				out0 = func(in0) * float(func(-1));
1958				${OUTPUT}
1959			}
1960		""
1961	end
1962
1963	case user_func_arg_float_types
1964		version 300 es
1965		values
1966		{
1967			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
1968			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
1969		}
1970
1971		both ""
1972			#version 300 es
1973			precision mediump float;
1974			precision mediump int;
1975			${DECLARATIONS}
1976
1977			float func (float a) { return -a; }
1978			vec2 func (vec2 a) { return a.yx; }
1979			vec3 func (vec3 a) { return a.xxx; }
1980			vec4 func (vec4 a) { return a.wwww; }
1981
1982			void main()
1983			{
1984				out0 = func(func(func(func(vec4(in0)).xyz).xy).x);
1985				${OUTPUT}
1986			}
1987		""
1988	end
1989
1990	case user_func_arg_int_types
1991		version 300 es
1992		values
1993		{
1994			input int in0		= [ 0 | 1 | -2 | 6 ];
1995			output int out0		= [ 0 | -1 | 2 | -6 ];
1996		}
1997
1998		both ""
1999			#version 300 es
2000			precision mediump float;
2001			precision mediump int;
2002			${DECLARATIONS}
2003
2004			int func (int a) { return -a; }
2005			ivec2 func (ivec2 a) { return a.yx; }
2006			ivec3 func (ivec3 a) { return a.xxx; }
2007			ivec4 func (ivec4 a) { return a.wwww; }
2008
2009			void main()
2010			{
2011				${SETUP}
2012				out0 = func(func(func(func(ivec4(in0)).xyz).xy).x);
2013				${OUTPUT}
2014			}
2015		""
2016	end
2017
2018	case user_func_arg_bool_types
2019		version 300 es
2020		values
2021		{
2022			input bool in0		= [ true | false ];
2023			output bool out0	= [ false | true ];
2024		}
2025
2026		both ""
2027			#version 300 es
2028			precision mediump float;
2029			${DECLARATIONS}
2030
2031			bool func (bool a) { return !a; }
2032			bvec2 func (bvec2 a) { return a.yx; }
2033			bvec3 func (bvec3 a) { return a.xxx; }
2034			bvec4 func (bvec4 a) { return a.wwww; }
2035
2036			void main()
2037			{
2038				${SETUP}
2039				out0 = func(func(func(func(bvec4(in0)).xyz).xy).x);
2040				${OUTPUT}
2041			}
2042		""
2043	end
2044
2045	case user_func_arg_basic_types
2046		version 300 es
2047		values
2048		{
2049			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
2050			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
2051		}
2052
2053		both ""
2054			#version 300 es
2055			precision mediump float;
2056			precision mediump int;
2057			${DECLARATIONS}
2058
2059			float func (float a) { return -a; }
2060			vec2 func (vec2 a) { return a.yx; }
2061			vec3 func (vec3 a) { return a.xxx; }
2062			vec4 func (vec4 a) { return a.wwww; }
2063			int func (int a) { return -a; }
2064			ivec2 func (ivec2 a) { return a.yx; }
2065			ivec3 func (ivec3 a) { return a.xxx; }
2066			ivec4 func (ivec4 a) { return a.wwww; }
2067			bool func (bool a) { return !a; }
2068			bvec2 func (bvec2 a) { return a.yx; }
2069			bvec3 func (bvec3 a) { return a.xxx; }
2070			bvec4 func (bvec4 a) { return a.wwww; }
2071
2072			void main()
2073			{
2074				${SETUP}
2075				if (func(func(bvec4(false)).x))
2076					out0 = func(in0) * float(func(-1));
2077				else
2078					out0 = float(func(func(ivec4(func(func(func(vec4(0.5)).xyz).xy).xxxx)).xy).x);
2079				${OUTPUT}
2080			}
2081		""
2082	end
2083
2084	case user_func_arg_complex_types
2085		version 300 es
2086		values
2087		{
2088			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
2089			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
2090		}
2091
2092		both ""
2093			#version 300 es
2094			precision mediump float;
2095			precision mediump int;
2096			${DECLARATIONS}
2097
2098			struct Pos { float a, b, c; };
2099			struct Line { Pos start, end; };
2100
2101			float func (float a) { return -a; }
2102			float func (float a[4]) { return a[0] + a[3]; }
2103			vec2 func (vec2 a) { return a.yx; }
2104			vec3 func (vec3 a) { return a.xxx; }
2105			vec4 func (vec4 a) { return a.wwww; }
2106			vec4 func (vec4 a[4]) { return a[1] + a[2]; }
2107			int func (int a) { return -a; }
2108			ivec2 func (ivec2 a) { return a.yx; }
2109			ivec3 func (ivec3 a) { return a.xxx; }
2110			ivec4 func (ivec4 a) { return a.wwww; }
2111			bool func (bool a) { return !a; }
2112			bvec2 func (bvec2 a) { return a.yx; }
2113			bvec3 func (bvec3 a) { return a.xxx; }
2114			bvec4 func (bvec4 a) { return a.wwww; }
2115			Pos func (Pos a) { return a; }
2116			Line func (Line a) { return Line(a.end, a.start); }
2117
2118			void main()
2119			{
2120				${SETUP}
2121				float arr[4];
2122				vec4 arr2[4];
2123				out0 = func(arr) + func(arr2).x;
2124				if (func(func(bvec4(false)).x))
2125					out0 = func(in0) * float(func(-1));
2126				else
2127					out0 = float(func(func(ivec4(func(func(func(vec4(0.5)).xyz).xy).xxxx)).xy).x);
2128				${OUTPUT}
2129			}
2130		""
2131	end
2132
2133	case user_func_arguments
2134		version 300 es
2135		values
2136		{
2137			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
2138			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
2139		}
2140
2141		both ""
2142			#version 300 es
2143			precision mediump float;
2144			${DECLARATIONS}
2145
2146			float func (float a)
2147			{
2148				return -a;
2149			}
2150
2151			float func (float a, float b)
2152			{
2153				return a * b;
2154			}
2155
2156			void main()
2157			{
2158				out0 = func(in0) * func(-0.5, -2.0);
2159				${OUTPUT}
2160			}
2161		""
2162	end
2163
2164	case array_size
2165		version 300 es
2166		values
2167		{
2168			output float out0	= [ 1.0 ];
2169		}
2170
2171		both ""
2172			#version 300 es
2173			precision mediump float;
2174			${DECLARATIONS}
2175
2176			float func (float f[3])
2177			{
2178				return f[0];
2179			}
2180
2181			float func (float f[4])
2182			{
2183				return f[1];
2184			}
2185
2186			void main ()
2187			{
2188				${SETUP}
2189				float[4] x = float[4] (-1.0, 1.0, 0.0, 0.0);
2190				out0 = func(x);
2191				${OUTPUT}
2192			}
2193		""
2194	end
2195
2196end # overloading
2197
2198group array_arguments "Arrays as Arguments"
2199
2200	case local_in_float
2201		version 300 es
2202		values
2203		{
2204			input vec4 in0		= [ vec4(0.0, 1.0, 2.0, -4.0) | vec4(-7.5, 12.125, -0.25, 16.0) ];
2205			output vec4 out0	= [ vec4(0.0, -1.0, -2.0, 4.0) | vec4(7.5, -12.125, 0.25, -16.0) ];
2206		}
2207
2208		both ""
2209			#version 300 es
2210			precision mediump float;
2211			${DECLARATIONS}
2212
2213			float func (in float a[4])
2214			{
2215				a[0] = -1.0;
2216				a[2] = -4.0;
2217				a[3] = -3.0 * a[1];
2218				return a[0];
2219			}
2220
2221			void main()
2222			{
2223				float arr[4];
2224				arr[0] = in0.x;
2225				arr[1] = in0.y;
2226				arr[2] = in0.z;
2227				arr[3] = in0.w;
2228				float f = func(arr);
2229				out0 = f * vec4(arr[0], arr[1], arr[2], arr[3]);
2230				${OUTPUT}
2231			}
2232		""
2233	end
2234
2235	case global_in_float
2236		version 300 es
2237		values
2238		{
2239			input vec4 in0		= [ vec4(0.0, 1.0, 2.0, -4.0) | vec4(-7.5, 12.125, -0.25, 16.0) ];
2240			output vec4 out0	= [ vec4(0.0, -1.0, -2.0, 4.0) | vec4(7.5, -12.125, 0.25, -16.0) ];
2241		}
2242
2243		both ""
2244			#version 300 es
2245			precision mediump float;
2246			${DECLARATIONS}
2247
2248			float func (in float a[4])
2249			{
2250				a[0] = -1.0;
2251				a[2] = -4.0;
2252				a[3] = -3.0 * a[1];
2253				return a[0];
2254			}
2255
2256			float arr[4];
2257
2258			void main()
2259			{
2260				arr[0] = in0.x;
2261				arr[1] = in0.y;
2262				arr[2] = in0.z;
2263				arr[3] = in0.w;
2264				float f = func(arr);
2265				out0 = f * vec4(arr[0], arr[1], arr[2], arr[3]);
2266				${OUTPUT}
2267			}
2268		""
2269	end
2270
2271	case local_in_int
2272		version 300 es
2273		values
2274		{
2275			input ivec4 in0		= [ ivec4(0, 1, 2, -4) | ivec4(-7, -11, 13, 19) ];
2276			output ivec4 out0	= [ ivec4(0, -1, -2, 4) | ivec4(7, 11, -13, -19) ];
2277		}
2278
2279		both ""
2280			#version 300 es
2281			precision mediump float;
2282			precision mediump int;
2283			${DECLARATIONS}
2284
2285			int func (in int a[4])
2286			{
2287				a[0] = -1;
2288				a[2] = -4;
2289				a[3] = -3 * a[1];
2290				return a[0];
2291			}
2292
2293			void main()
2294			{
2295				${SETUP}
2296				int arr[4];
2297				arr[0] = in0.x;
2298				arr[1] = in0.y;
2299				arr[2] = in0.z;
2300				arr[3] = in0.w;
2301				int f = func(arr);
2302				out0 = f * ivec4(arr[0], arr[1], arr[2], arr[3]);
2303				${OUTPUT}
2304			}
2305		""
2306	end
2307
2308	case global_in_int
2309		version 300 es
2310		values
2311		{
2312			input ivec4 in0		= [ ivec4(0, 1, 2, 4) | ivec4(-7, -11, 13, 19) ];
2313			output ivec4 out0	= [ ivec4(0, -1, -2, -4) | ivec4(7, 11, -13, -19) ];
2314		}
2315
2316		both ""
2317			#version 300 es
2318			precision mediump float;
2319			precision mediump int;
2320			${DECLARATIONS}
2321
2322			int func (in int a[4])
2323			{
2324				a[0] = -1;
2325				a[2] = -4;
2326				a[3] = -3 * a[1];
2327				return a[0];
2328			}
2329
2330			int arr[4];
2331
2332			void main()
2333			{
2334				${SETUP}
2335				arr[0] = in0.x;
2336				arr[1] = in0.y;
2337				arr[2] = in0.z;
2338				arr[3] = in0.w;
2339				int f = func(arr);
2340				out0 = f * ivec4(arr[0], arr[1], arr[2], arr[3]);
2341				${OUTPUT}
2342			}
2343
2344		""
2345	end
2346
2347	case local_in_bool
2348		version 300 es
2349		values
2350		{
2351			input bvec4 in0		= [ bvec4(true, true, false, true) | bvec4(false, false, false, false) ];
2352			output bvec4 out0	= [ bvec4(false, false, true, false) | bvec4(true, true, true, true) ];
2353		}
2354
2355		both ""
2356			#version 300 es
2357			precision mediump float;
2358			${DECLARATIONS}
2359
2360			bool func (in bool a[4])
2361			{
2362				a[0] = false;
2363				a[2] = true;
2364				a[3] = !a[1];
2365				return a[0];
2366			}
2367
2368			void main()
2369			{
2370				${SETUP}
2371				bool arr[4];
2372				arr[0] = !in0.x;
2373				arr[1] = !in0.y;
2374				arr[2] = !in0.z;
2375				arr[3] = !in0.w;
2376				func(arr);
2377				out0 = bvec4(arr[0], arr[1], arr[2], arr[3]);
2378				${OUTPUT}
2379			}
2380		""
2381	end
2382
2383	case global_in_bool
2384		version 300 es
2385		values
2386		{
2387			input bvec4 in0		= [ bvec4(true, true, false, true) | bvec4(false, false, false, false) ];
2388			output bvec4 out0	= [ bvec4(false, false, true, false) | bvec4(true, true, true, true) ];
2389		}
2390
2391		both ""
2392			#version 300 es
2393			precision mediump float;
2394			${DECLARATIONS}
2395
2396			bool func (in bool a[4])
2397			{
2398				a[0] = false;
2399				a[2] = true;
2400				a[3] = !a[1];
2401				return a[0];
2402			}
2403
2404			bool arr[4];
2405
2406			void main()
2407			{
2408				${SETUP}
2409				arr[0] = !in0.x;
2410				arr[1] = !in0.y;
2411				arr[2] = !in0.z;
2412				arr[3] = !in0.w;
2413				func(arr);
2414				out0 = bvec4(arr[0], arr[1], arr[2], arr[3]);
2415				${OUTPUT}
2416			}
2417		""
2418	end
2419
2420	case test_helpers
2421		version 300 es
2422		desc "Check that helper functions are supported properly."
2423		values
2424		{
2425			input vec4 in0		= [ vec4(0.0, 1.0, 2.0, -4.0) | vec4(-7.5, 12.125, -0.25, 16.0) ];
2426			output float out0	= [ 1.0 | 1.0 ];
2427		}
2428
2429		both ""
2430			#version 300 es
2431			precision mediump float;
2432			${DECLARATIONS}
2433
2434			vec4 get (in float arr[4]);
2435			void set (out float arr[4], vec4 val);
2436			void negate (inout float arr[4]);
2437			bool test (in float arr[4], vec4 ref);
2438			bool isEqual (in float a[4], in float b[4]);
2439
2440			void main()
2441			{
2442				float arr[4];
2443				set(arr, in0);
2444				negate(arr);
2445				out0 = float(test(arr, -in0));
2446				${OUTPUT}
2447			}
2448
2449			float absDiff (vec4 a, vec4 b) { vec4 d = abs(a - b); return max(max(d.x, d.y), max(d.z, d.w)); }
2450			vec4 get (in float arr[4]) { return vec4(arr[0], arr[1], arr[2], arr[3]); }
2451			void set (out float arr[4], vec4 val) { arr[0] = val.x; arr[1] = val.y; arr[2] = val.z; arr[3] = val.w; }
2452			void negate (inout float arr[4]) { set(arr, -get(arr)); }
2453			bool test (in float arr[4], vec4 ref) { return (absDiff(get(arr), ref) < 0.1); }
2454			bool isEqual (in float a[4], in float b[4]) { return (absDiff(get(a), get(b)) < 0.1); }
2455		""
2456	end
2457
2458	case copy_local_in_on_call
2459		version 300 es
2460		desc "Check that local 'in' arguments are copied on call and don't alias."
2461		values
2462		{
2463			input vec4 in0		= [ vec4(0.0, 1.0, 2.0, -4.0) | vec4(-7.5, 12.125, -0.25, 16.0) ];
2464			output vec4 out0	= [ vec4(0.0, -1.0, -2.0, 4.0) | vec4(7.5, -12.125, 0.25, -16.0) ];
2465		}
2466
2467		both ""
2468			#version 300 es
2469			precision mediump float;
2470			${DECLARATIONS}
2471
2472			vec4 get (in float arr[4]);
2473			void set (out float arr[4], vec4 val);
2474			void negate (inout float arr[4]);
2475			bool test (in float arr[4], vec4 ref);
2476			bool isEqual (in float a[4], in float b[4]);
2477
2478			float func (in float a[4], in float b[4])
2479			{
2480				a[0] = 2.123;
2481				a[2] = -4.123;
2482				return isEqual(a, b) ? 1.0 : -1.0;
2483			}
2484
2485			void main()
2486			{
2487				float arr[4];
2488				set(arr, in0);
2489				out0 = in0 * func(arr, arr);
2490				${OUTPUT}
2491			}
2492
2493			float absDiff (vec4 a, vec4 b) { vec4 d = abs(a - b); return max(max(d.x, d.y), max(d.z, d.w)); }
2494			vec4 get (in float arr[4]) { return vec4(arr[0], arr[1], arr[2], arr[3]); }
2495			void set (out float arr[4], vec4 val) { arr[0] = val.x; arr[1] = val.y; arr[2] = val.z; arr[3] = val.w; }
2496			void negate (inout float arr[4]) { set(arr, -get(arr)); }
2497			bool test (in float arr[4], vec4 ref) { return (absDiff(get(arr), ref) < 0.1); }
2498			bool isEqual (in float a[4], in float b[4]) { return (absDiff(get(a), get(b)) < 0.1); }
2499		""
2500	end
2501
2502	case copy_global_in_on_call
2503		version 300 es
2504		desc "Check that global 'in' arguments are copied on call and don't alias."
2505		values
2506		{
2507			input vec4 in0		= [ vec4(0.0, 1.0, 2.0, -4.0) | vec4(-7.5, 12.125, -0.25, 16.0) ];
2508			output vec4 out0	= [ vec4(0.0, -1.0, -2.0, 4.0) | vec4(7.5, -12.125, 0.25, -16.0) ];
2509		}
2510
2511		both ""
2512			#version 300 es
2513			precision mediump float;
2514			${DECLARATIONS}
2515
2516			vec4 get (in float arr[4]);
2517			void set (out float arr[4], vec4 val);
2518			void negate (inout float arr[4]);
2519			bool test (in float arr[4], vec4 ref);
2520			bool isEqual (in float a[4], in float b[4]);
2521
2522			float func (in float a[4], in float b[4])
2523			{
2524				a[0] = 2.123;
2525				a[2] = -4.123;
2526				return isEqual(a, b) ? 1.0 : -1.0;
2527			}
2528
2529			float arr[4];
2530
2531			void main()
2532			{
2533				set(arr, in0);
2534				out0 = in0 * func(arr, arr);
2535				${OUTPUT}
2536			}
2537
2538			float absDiff (vec4 a, vec4 b) { vec4 d = abs(a - b); return max(max(d.x, d.y), max(d.z, d.w)); }
2539			vec4 get (in float arr[4]) { return vec4(arr[0], arr[1], arr[2], arr[3]); }
2540			void set (out float arr[4], vec4 val) { arr[0] = val.x; arr[1] = val.y; arr[2] = val.z; arr[3] = val.w; }
2541			void negate (inout float arr[4]) { set(arr, -get(arr)); }
2542			bool test (in float arr[4], vec4 ref) { return (absDiff(get(arr), ref) < 0.1); }
2543			bool isEqual (in float a[4], in float b[4]) { return (absDiff(get(a), get(b)) < 0.1); }
2544		""
2545	end
2546
2547	case copy_local_inout_on_call
2548		version 300 es
2549		desc "Check that local 'in' arguments are copied on call and don't alias."
2550		values
2551		{
2552			input vec4 in0		= [ vec4(0.0, 1.0, 2.0, -4.0) | vec4(-7.5, 12.125, -0.25, 16.0) ];
2553			output vec4 out0	= [ vec4(0.0, -1.0, -2.0, 4.0) | vec4(7.5, -12.125, 0.25, -16.0) ];
2554		}
2555
2556		both ""
2557			#version 300 es
2558			precision mediump float;
2559			${DECLARATIONS}
2560
2561			vec4 get (in float arr[4]);
2562			void set (out float arr[4], vec4 val);
2563			void negate (inout float arr[4]);
2564			bool test (in float arr[4], vec4 ref);
2565			bool isEqual (in float a[4], in float b[4]);
2566
2567			float func (inout float a[4], inout float b[4])
2568			{
2569				negate(a);
2570				return isEqual(a, b) ? 1.0 : -1.0;
2571			}
2572
2573			void main()
2574			{
2575				float arr[4];
2576				set(arr, in0);
2577				float m = func(arr, arr); // returns -1.0
2578				float n = float(test(arr, in0) || test(arr, -in0));
2579				out0 = in0 * m * n;
2580				${OUTPUT}
2581			}
2582
2583			float absDiff (vec4 a, vec4 b) { vec4 d = abs(a - b); return max(max(d.x, d.y), max(d.z, d.w)); }
2584			vec4 get (in float arr[4]) { return vec4(arr[0], arr[1], arr[2], arr[3]); }
2585			void set (out float arr[4], vec4 val) { arr[0] = val.x; arr[1] = val.y; arr[2] = val.z; arr[3] = val.w; }
2586			void negate (inout float arr[4]) { set(arr, -get(arr)); }
2587			bool test (in float arr[4], vec4 ref) { return (absDiff(get(arr), ref) < 0.1); }
2588			bool isEqual (in float a[4], in float b[4]) { return (absDiff(get(a), get(b)) < 0.1); }
2589		""
2590	end
2591
2592	case copy_global_inout_on_call
2593		version 300 es
2594		desc "Check that global 'in' arguments are copied on call and don't alias."
2595		values
2596		{
2597			input vec4 in0		= [ vec4(0.0, 1.0, 2.0, -4.0) | vec4(-7.5, 12.125, -0.25, 16.0) ];
2598			output vec4 out0	= [ vec4(0.0, -1.0, -2.0, 4.0) | vec4(7.5, -12.125, 0.25, -16.0) ];
2599		}
2600
2601		both ""
2602			#version 300 es
2603			precision mediump float;
2604			${DECLARATIONS}
2605
2606			vec4 get (in float arr[4]);
2607			void set (out float arr[4], vec4 val);
2608			void negate (inout float arr[4]);
2609			bool test (in float arr[4], vec4 ref);
2610			bool isEqual (in float a[4], in float b[4]);
2611
2612			float func (in float a[4], in float b[4])
2613			{
2614				negate(a);
2615				return isEqual(a, b) ? 1.0 : -1.0;
2616			}
2617
2618			float arr[4];
2619
2620			void main()
2621			{
2622				set(arr, in0);
2623				float m = func(arr, arr); // returns -1.0
2624				float n = float(test(arr, in0) || test(arr, -in0));
2625				out0 = in0 * m * n;
2626				${OUTPUT}
2627			}
2628
2629			float absDiff (vec4 a, vec4 b) { vec4 d = abs(a - b); return max(max(d.x, d.y), max(d.z, d.w)); }
2630			vec4 get (in float arr[4]) { return vec4(arr[0], arr[1], arr[2], arr[3]); }
2631			void set (out float arr[4], vec4 val) { arr[0] = val.x; arr[1] = val.y; arr[2] = val.z; arr[3] = val.w; }
2632			void negate (inout float arr[4]) { set(arr, -get(arr)); }
2633			bool test (in float arr[4], vec4 ref) { return (absDiff(get(arr), ref) < 0.1); }
2634			bool isEqual (in float a[4], in float b[4]) { return (absDiff(get(a), get(b)) < 0.1); }
2635		""
2636	end
2637
2638#			vec4 get (in float arr[4]);
2639#			void set (out float arr[4], vec4 val);
2640#			void negate (inout float arr[4]);
2641#			bool test (in float arr[4], vec4 ref);
2642#			bool isEqual (in float a[4], in float b[4]);
2643
2644#			float absDiff (vec4 a, vec4 b) { vec4 d = abs(a - b); return max(max(d.x, d.y), max(d.z, d.w)); }
2645#			vec4 get (in float arr[4]) { return vec4(arr[0], arr[1], arr[2], arr[3]); }
2646#			void set (out float arr[4], vec4 val) { arr[0] = val.x; arr[1] = val.y; arr[2] = val.z; arr[3] = val.w; }
2647#			void negate (inout float arr[4]) { set(arr, -get(arr)); }
2648#			bool test (in float arr[4], vec4 ref) { return (absDiff(get(arr), ref) < 0.1); }
2649#			bool isEqual (in float a[4], in float b[4]) { return (absDiff(get(a), get(b)) < 0.1); }
2650
2651end # array_arguments
2652
2653#group qualifiers "Function Parameter Qualifiers"
2654#
2655#end # qualifiers
2656
2657group control_flow "Control Flow In Functions"
2658
2659	case simple_return
2660		version 300 es
2661		values
2662		{
2663			input float in0		= [ -0.5 | 1.5 ];
2664			output float out0	= [ 0.5 | -1.5 ];
2665		}
2666
2667		both ""
2668			#version 300 es
2669			precision mediump float;
2670			${DECLARATIONS}
2671
2672			float func (float a)
2673			{
2674				return -a;
2675				a = a * -1.0;
2676				return 1.0;
2677			}
2678
2679			void main()
2680			{
2681				${SETUP}
2682				out0 = func(in0);
2683				${OUTPUT}
2684			}
2685		""
2686	end
2687
2688	case return_in_if
2689		version 300 es
2690		values
2691		{
2692			input float in0		= [ -0.5 | 1.5 ];
2693			output float out0	= [ 0.5 | -1.5 ];
2694		}
2695
2696		both ""
2697			#version 300 es
2698			precision mediump float;
2699			${DECLARATIONS}
2700
2701			float func (float a)
2702			{
2703				if (a != 0.0)
2704					return -a;
2705				return 1.0;
2706			}
2707
2708			void main()
2709			{
2710				${SETUP}
2711				out0 = func(in0);
2712				${OUTPUT}
2713			}
2714		""
2715	end
2716
2717	case return_in_else
2718		version 300 es
2719		values
2720		{
2721			input float in0		= [ -0.5 | 1.5 ];
2722			output float out0	= [ 0.5 | -1.5 ];
2723		}
2724
2725		both ""
2726			#version 300 es
2727			precision mediump float;
2728			${DECLARATIONS}
2729
2730			float func (float a)
2731			{
2732				if (a == 0.0)
2733					return 1.0;
2734				else
2735					return -a;
2736				return 1.0;
2737			}
2738
2739			void main()
2740			{
2741				${SETUP}
2742				out0 = func(in0);
2743				${OUTPUT}
2744			}
2745		""
2746	end
2747
2748	case return_in_loop
2749		version 300 es
2750		values
2751		{
2752			input float in0		= [ -0.5 | 1.5 ];
2753			output float out0	= [ 0.5 | -1.5 ];
2754		}
2755
2756		both ""
2757			#version 300 es
2758			precision mediump float;
2759			${DECLARATIONS}
2760
2761			float func (float a)
2762			{
2763				while (a < 100.0)
2764					return -a;
2765				return 1.0;
2766			}
2767
2768			void main()
2769			{
2770				${SETUP}
2771				out0 = func(in0);
2772				${OUTPUT}
2773			}
2774		""
2775	end
2776
2777	case return_in_loop_if
2778		version 300 es
2779		values
2780		{
2781			input float in0		= [ -0.5 | 1.5 ];
2782			output float out0	= [ 0.5 | -1.5 ];
2783		}
2784
2785		both ""
2786			#version 300 es
2787			precision mediump float;
2788			${DECLARATIONS}
2789
2790			float func (float a)
2791			{
2792				while (a < 100.0)
2793				{
2794					a = -a;
2795					if (a != 0.0)
2796						return a;
2797					else
2798						return -1.0;
2799				}
2800				return 1.0;
2801			}
2802
2803			void main()
2804			{
2805				${SETUP}
2806				out0 = func(in0);
2807				${OUTPUT}
2808			}
2809		""
2810	end
2811
2812	case return_after_loop
2813		version 300 es
2814		values
2815		{
2816			input float in0		= [ -0.5 | 1.5 ];
2817			output float out0	= [ 0.5 | -1.5 ];
2818		}
2819
2820		both ""
2821			#version 300 es
2822			precision mediump float;
2823			${DECLARATIONS}
2824
2825			float func (float a)
2826			{
2827				for (int i = 0; i < 5; i++)
2828					a = -a;
2829				return a;
2830			}
2831
2832			void main()
2833			{
2834				${SETUP}
2835				out0 = func(in0);
2836				${OUTPUT}
2837			}
2838		""
2839	end
2840
2841	case return_after_break
2842		version 300 es
2843		values
2844		{
2845			input float in0		= [ -0.5 | 1.5 ];
2846			output float out0	= [ 0.5 | -1.5 ];
2847		}
2848
2849		both ""
2850			#version 300 es
2851			precision mediump float;
2852			${DECLARATIONS}
2853
2854			float func (float a)
2855			{
2856				for (int i = 0; i < 6; i++)
2857				{
2858					a = -a;
2859					if (i == 4)
2860						break;
2861				}
2862				return a;
2863			}
2864
2865			void main()
2866			{
2867				${SETUP}
2868				out0 = func(in0);
2869				${OUTPUT}
2870			}
2871		""
2872	end
2873
2874	case return_after_continue
2875		version 300 es
2876		values
2877		{
2878			input float in0		= [ -0.5 | 1.5 ];
2879			output float out0	= [ 0.5 | -1.5 ];
2880		}
2881
2882		both ""
2883			#version 300 es
2884			precision mediump float;
2885			${DECLARATIONS}
2886
2887			float func (float a)
2888			{
2889				for (int i = 0; i < 6; i++)
2890				{
2891					if (i == 4)
2892						continue;
2893					a = -a;
2894				}
2895				return a;
2896			}
2897
2898			void main()
2899			{
2900				${SETUP}
2901				out0 = func(in0);
2902				${OUTPUT}
2903			}
2904		""
2905	end
2906
2907	case return_in_nested_loop
2908		version 300 es
2909		values
2910		{
2911			input float in0		= [ -0.5 | 1.5 ];
2912			output float out0	= [ 0.5 | -1.5 ];
2913		}
2914
2915		both ""
2916			#version 300 es
2917			precision mediump float;
2918			${DECLARATIONS}
2919
2920			float func (float a)
2921			{
2922				for (int i = 0; i < 6; i++)
2923				{
2924					a = -a;
2925					for (int j = 0; j < 4; j++)
2926					{
2927						a = -a;
2928						if (i == 1)
2929							return a;
2930					}
2931					if (i == 4)
2932						return 1.0;
2933				}
2934				return 1.0;
2935			}
2936
2937			void main()
2938			{
2939				${SETUP}
2940				out0 = func(in0);
2941				${OUTPUT}
2942			}
2943		""
2944	end
2945
2946	case return_after_loop_sequence
2947		version 300 es
2948		values
2949		{
2950			input float in0		= [ -0.5 | 1.5 ];
2951			output float out0	= [ 0.5 | -1.5 ];
2952		}
2953
2954		both ""
2955			#version 300 es
2956			precision mediump float;
2957			${DECLARATIONS}
2958
2959			float func (float a)
2960			{
2961				int i;
2962				for (i = 0; i < 6; i++) // negate a
2963				{
2964					a = -a;
2965					if (i == 4)
2966						a = -a;
2967				}
2968
2969				for (; i < 10; i++) // keep a
2970				{
2971					if (i == 8)
2972						continue;
2973					else if (i == 9)
2974						break;
2975					a = -a;
2976				}
2977
2978				return a;
2979			}
2980
2981			void main()
2982			{
2983				${SETUP}
2984				out0 = func(in0);
2985				${OUTPUT}
2986			}
2987		""
2988	end
2989
2990	case mixed_return_break_continue
2991		version 300 es
2992		values
2993		{
2994			input float in0		= [ -0.5 | 1.5 ];
2995			output float out0	= [ 0.5 | -1.5 ];
2996		}
2997
2998		both ""
2999			#version 300 es
3000			precision mediump float;
3001			${DECLARATIONS}
3002
3003			float func (float a)
3004			{
3005				int i;
3006				for (i = 0; i < 6; i++)
3007				{
3008					if (i == 0)
3009						continue;
3010					else if (i == 1)
3011					{
3012					}
3013					else if (i == 3)
3014						break;
3015					else
3016						return a;
3017					a = -a;
3018				}
3019
3020				return 1.0;
3021			}
3022
3023			void main()
3024			{
3025				${SETUP}
3026				out0 = func(in0);
3027				${OUTPUT}
3028			}
3029		""
3030	end
3031
3032end # control_flow
3033
3034group misc "Miscellaneous"
3035
3036	case multi_arg_float
3037		version 300 es
3038		values
3039		{
3040			input vec4 in0		= [ vec4(0.0, 1.0, -2.0, 0.5) | vec4(2.0, 2.5, 4.0, -7.0) ];
3041			output float out0	= [ 0.5 | -1.5 ]; # -sum(in0)
3042		}
3043
3044		both ""
3045			#version 300 es
3046			precision mediump float;
3047			${DECLARATIONS}
3048
3049			float sum(vec4 v) { return (v.x + v.y + v.z + v.w); }
3050
3051			float func (float a, vec3 b, vec2 c, vec2 d, vec4 e)
3052			{
3053				return -sum(vec4(a, b) + vec4(c, d)) + sum(e);
3054			}
3055
3056			void main()
3057			{
3058				${SETUP}
3059				out0 = func(in0.y, in0.xzw, in0.wz, in0.yx, in0);
3060				${OUTPUT}
3061			}
3062		""
3063	end
3064
3065	case multi_arg_int
3066		version 300 es
3067		values
3068		{
3069			input ivec4 in0		= [ ivec4(-1, 0, 2, 2) | ivec4(1, 4, -8, 2) ];
3070			output int out0		= [ -3 | 1 ];
3071		}
3072
3073		both ""
3074			#version 300 es
3075			precision mediump float;
3076			precision mediump int;
3077			${DECLARATIONS}
3078
3079			int sum(ivec4 v) { return (v.x + v.y + v.z + v.w); }
3080
3081			int func (int a, ivec3 b, ivec2 c, ivec2 d, ivec4 e)
3082			{
3083				return -sum(ivec4(a, b) + ivec4(c, d)) + sum(e);
3084			}
3085
3086			void main()
3087			{
3088				${SETUP}
3089				out0 = func(in0.y, in0.xzw, in0.wz, in0.yx, in0);
3090				${OUTPUT}
3091			}
3092		""
3093	end
3094
3095	case argument_eval_order_1
3096		version 300 es
3097		values
3098		{
3099			input int in0	= [  0 | 1 | 3 | 5 ];
3100			output int out0	= [ -1 | 5 | 11 | 17 ];
3101		}
3102
3103		both ""
3104			#version 300 es
3105			precision highp float;
3106			${DECLARATIONS}
3107
3108			int func (float a, int b, bool c, int d)
3109			{
3110				if (c)
3111					return b + int(a) + d;
3112				else
3113					return -1;
3114			}
3115
3116			void main ()
3117			{
3118				${SETUP}
3119				float v0 = float(in0);
3120				int v1 = in0;
3121				out0 = func((v0 += 1.0), v1++, (v0 > 1.5), v1);
3122				${OUTPUT}
3123			}
3124		""
3125	end
3126
3127	case argument_eval_order_2
3128		version 300 es
3129		values
3130		{
3131			input int in0	= [ 0 | -1 | 3 | 5 ];
3132			output int out0	= [ 3 | -1 | 9 | 13 ];
3133		}
3134
3135		both ""
3136			#version 300 es
3137			precision highp float;
3138			${DECLARATIONS}
3139
3140			int g;
3141
3142			int modG (int v)
3143			{
3144				g += v;
3145				return v;
3146			}
3147
3148			int func (float a, int b, bool c, int d)
3149			{
3150				if (c)
3151					return b + int(a) + d;
3152				else
3153					return -1;
3154			}
3155
3156			void main ()
3157			{
3158				${SETUP}
3159				out0 = func(float(g = in0), modG(2), --g > 0, g);
3160				${OUTPUT}
3161			}
3162		""
3163	end
3164
3165end # misc
3166
3167group invalid "Invalid Functions"
3168	case break_in_body
3169		version 300 es
3170		expect compile_fail
3171		both ""
3172			#version 300 es
3173			precision mediump float;
3174			${DECLARATIONS}
3175
3176			void func ()
3177			{
3178				break;
3179			}
3180
3181			void main ()
3182			{
3183				${POSITION_FRAG_COLOR} = vec4(1.0);
3184			}
3185		""
3186	end
3187
3188	case continue_in_body
3189		version 300 es
3190		expect compile_fail
3191		both ""
3192			#version 300 es
3193			precision mediump float;
3194			${DECLARATIONS}
3195
3196			void func ()
3197			{
3198				continue;
3199			}
3200
3201			void main ()
3202			{
3203				${POSITION_FRAG_COLOR} = vec4(1.0);
3204			}
3205		""
3206	end
3207
3208	case return_value_from_void_function
3209		version 300 es
3210		expect compile_fail
3211		both ""
3212			#version 300 es
3213			precision mediump float;
3214			${DECLARATIONS}
3215
3216			void func ()
3217			{
3218				return 1.0;
3219			}
3220
3221			void main ()
3222			{
3223				${POSITION_FRAG_COLOR} = vec4(1.0);
3224			}
3225		""
3226	end
3227
3228	case extra_arguments
3229		version 300 es
3230		expect compile_fail
3231		both ""
3232			#version 300 es
3233			precision mediump float;
3234			${DECLARATIONS}
3235
3236			void func (float f)
3237			{
3238			}
3239
3240			void main ()
3241			{
3242				func(1.0, 2.0);
3243				${POSITION_FRAG_COLOR} = vec4(1.0);
3244			}
3245		""
3246	end
3247
3248	case missing_arguments
3249		version 300 es
3250		expect compile_fail
3251		both ""
3252			#version 300 es
3253			precision mediump float;
3254			${DECLARATIONS}
3255
3256			void func (float f)
3257			{
3258			}
3259
3260			void main ()
3261			{
3262				func();
3263				${POSITION_FRAG_COLOR} = vec4(1.0);
3264			}
3265		""
3266	end
3267
3268	case missing_argument_type
3269		version 300 es
3270		expect compile_fail
3271		both ""
3272			#version 300 es
3273			precision mediump float;
3274			${DECLARATIONS}
3275
3276			void func (in f)
3277			{
3278			}
3279
3280			void main ()
3281			{
3282				${POSITION_FRAG_COLOR} = vec4(1.0);
3283			}
3284		""
3285	end
3286
3287	case argument_basetype_mismatch
3288		version 300 es
3289		expect compile_fail
3290		both ""
3291			#version 300 es
3292			precision mediump float;
3293			precision mediump int;
3294			${DECLARATIONS}
3295
3296			void func (float f)
3297			{
3298			}
3299
3300			void main ()
3301			{
3302				func(2);
3303				${POSITION_FRAG_COLOR} = vec4(1.0);
3304			}
3305		""
3306	end
3307
3308	case argument_scalar_vector_mismatch
3309		version 300 es
3310		expect compile_fail
3311		both ""
3312			#version 300 es
3313			precision mediump float;
3314			${DECLARATIONS}
3315
3316			void func (vec2 f)
3317			{
3318			}
3319
3320			void main ()
3321			{
3322				func(2.0);
3323				${POSITION_FRAG_COLOR} = vec4(1.0);
3324			}
3325		""
3326	end
3327
3328	case argument_vector_size_mismatch
3329		version 300 es
3330		expect compile_fail
3331		both ""
3332			#version 300 es
3333			precision mediump float;
3334			${DECLARATIONS}
3335
3336			void func (vec3 f)
3337			{
3338			}
3339
3340			void main ()
3341			{
3342				func(vec2(2.0));
3343				${POSITION_FRAG_COLOR} = vec4(1.0);
3344			}
3345		""
3346	end
3347
3348	case duplicate_function
3349		version 300 es
3350		expect compile_fail
3351		both ""
3352			#version 300 es
3353			precision mediump float;
3354			${DECLARATIONS}
3355
3356			void func (vec3 f);
3357
3358			void func (vec3 f)
3359			{
3360			}
3361
3362			void func (vec3 f)
3363			{
3364			}
3365
3366			void main ()
3367			{
3368				${POSITION_FRAG_COLOR} = vec4(1.0);
3369			}
3370		""
3371	end
3372
3373	case prototype_mismatch_return_type
3374		version 300 es
3375		expect compile_fail
3376		both ""
3377			#version 300 es
3378			precision mediump float;
3379			${DECLARATIONS}
3380
3381			void func (vec3 f);
3382
3383			void main ()
3384			{
3385				${POSITION_FRAG_COLOR} = vec4(1.0);
3386			}
3387
3388			float func (vec3 f)
3389			{
3390				return f.x;
3391			}
3392		""
3393	end
3394
3395	case prototype_unspecified_array_size
3396		version 300 es
3397		expect compile_fail
3398		both ""
3399			#version 300 es
3400			precision mediump float;
3401			${DECLARATIONS}
3402
3403			void func (vec3 f[]);
3404
3405			void main ()
3406			{
3407				${POSITION_FRAG_COLOR} = vec4(1.0);
3408			}
3409		""
3410	end
3411
3412	case call_mismatch_argument_array_size
3413		version 300 es
3414		expect compile_fail
3415		both ""
3416			#version 300 es
3417			precision mediump float;
3418			${DECLARATIONS}
3419
3420			void func (vec3 f[3]);
3421			void func (vec3 f[3])
3422			{
3423			}
3424
3425			void main ()
3426			{
3427				vec3 array[4];
3428				func(array);
3429				${POSITION_FRAG_COLOR} = vec4(1.0);
3430			}
3431		""
3432	end
3433
3434	case prototype_mismatch_argument_const
3435		version 300 es
3436		expect compile_fail
3437		both ""
3438			#version 300 es
3439			precision mediump float;
3440			${DECLARATIONS}
3441
3442			void func (vec3 f);
3443			void func (const vec3 f)
3444			{
3445			}
3446
3447			void main ()
3448			{
3449				${POSITION_FRAG_COLOR} = vec4(1.0);
3450			}
3451		""
3452	end
3453
3454	case prototype_mismatch_argument_array_const
3455		version 300 es
3456		expect compile_fail
3457		both ""
3458			#version 300 es
3459			precision mediump float;
3460			${DECLARATIONS}
3461
3462			void func (vec3 f[3]);
3463			void func (const vec3 f[3])
3464			{
3465			}
3466
3467			void main ()
3468			{
3469				${POSITION_FRAG_COLOR} = vec4(1.0);
3470			}
3471		""
3472	end
3473
3474	case prototype_mismatch_array_inout
3475		version 300 es
3476		expect compile_fail
3477		both ""
3478			#version 300 es
3479			precision mediump float;
3480			${DECLARATIONS}
3481
3482			void func (out vec3 f);
3483			void func (inout vec3 f)
3484			{
3485			}
3486
3487			void main ()
3488			{
3489				${POSITION_FRAG_COLOR} = vec4(1.0);
3490			}
3491		""
3492	end
3493
3494	case missing_return_type
3495		version 300 es
3496		expect compile_fail
3497		both ""
3498			#version 300 es
3499			precision mediump float;
3500			${DECLARATIONS}
3501
3502			func (float f);
3503			func (inout vec3 f[3])
3504			{
3505			}
3506
3507			void main ()
3508			{
3509				${POSITION_FRAG_COLOR} = vec4(1.0);
3510			}
3511		""
3512	end
3513
3514	case call_before_definition
3515		version 300 es
3516		expect compile_fail
3517		both ""
3518			#version 300 es
3519			precision mediump float;
3520			${DECLARATIONS}
3521
3522			void main ()
3523			{
3524				func(1.0);
3525				${POSITION_FRAG_COLOR} = vec4(1.0);
3526			}
3527
3528			void func (float f)
3529			{
3530			}
3531
3532		""
3533	end
3534
3535	case argument_precision_overload
3536		version 300 es
3537		expect compile_fail
3538		both ""
3539			#version 300 es
3540			precision mediump float;
3541			${DECLARATIONS}
3542
3543			float func (lowp float f)
3544			{
3545				return f;
3546			}
3547
3548			float func (mediump float f)
3549			{
3550				return f;
3551			}
3552
3553			void main ()
3554			{
3555				${POSITION_FRAG_COLOR} = vec4(1.0);
3556			}
3557		""
3558	end
3559
3560	case argument_in_out_overload
3561		version 300 es
3562		expect compile_fail
3563		both ""
3564			#version 300 es
3565			precision mediump float;
3566			${DECLARATIONS}
3567
3568			void func (in float f)
3569			{
3570			}
3571
3572			void func (out float f)
3573			{
3574				f = 1.0;
3575			}
3576
3577			void main ()
3578			{
3579				${POSITION_FRAG_COLOR} = vec4(1.0);
3580			}
3581		""
3582	end
3583
3584	case argument_in_inout_overload
3585		version 300 es
3586		expect compile_fail
3587		both ""
3588			#version 300 es
3589			precision mediump float;
3590			${DECLARATIONS}
3591
3592			void func (in float f)
3593			{
3594			}
3595
3596			void func (inout float f)
3597			{
3598				f = -f;
3599			}
3600
3601			void main ()
3602			{
3603				${POSITION_FRAG_COLOR} = vec4(1.0);
3604			}
3605		""
3606	end
3607
3608	case argument_out_inout_overload
3609		version 300 es
3610		expect compile_fail
3611		both ""
3612			#version 300 es
3613			precision mediump float;
3614			${DECLARATIONS}
3615
3616			void func (out float f)
3617			{
3618				f = -1.0;
3619			}
3620
3621			void func (inout float f)
3622			{
3623				f = -f;
3624			}
3625
3626			void main ()
3627			{
3628				${POSITION_FRAG_COLOR} = vec4(1.0);
3629			}
3630		""
3631	end
3632
3633	case return_type_overload
3634		version 300 es
3635		expect compile_fail
3636		both ""
3637			#version 300 es
3638			precision mediump float;
3639			${DECLARATIONS}
3640
3641			float func (float f)
3642			{
3643				return f;
3644			}
3645
3646			int func (float f)
3647			{
3648				return int(f);
3649			}
3650
3651			void main ()
3652			{
3653				${POSITION_FRAG_COLOR} = vec4(1.0);
3654			}
3655		""
3656	end
3657
3658	case return_type_precision_overload
3659		version 300 es
3660		expect compile_fail
3661		both ""
3662			#version 300 es
3663			precision mediump float;
3664			${DECLARATIONS}
3665
3666			lowp float func (float f)
3667			{
3668				return f;
3669			}
3670
3671			mediump float func (float f)
3672			{
3673				return f;
3674			}
3675
3676			void main ()
3677			{
3678				${POSITION_FRAG_COLOR} = vec4(1.0);
3679			}
3680		""
3681	end
3682
3683	case return_type_const_overload
3684		version 300 es
3685		expect compile_fail
3686		both ""
3687			#version 300 es
3688			precision mediump float;
3689			${DECLARATIONS}
3690
3691			float func (float f)
3692			{
3693				return f;
3694			}
3695
3696			const float func (float f)
3697			{
3698				return f;
3699			}
3700
3701			void main ()
3702			{
3703				${POSITION_FRAG_COLOR} = vec4(1.0);
3704			}
3705		""
3706	end
3707
3708	case return_without_value
3709		version 300 es
3710		expect compile_fail
3711		both ""
3712			#version 300 es
3713			precision mediump float;
3714			${DECLARATIONS}
3715
3716			float func (float f)
3717			{
3718				return;
3719				return 1.0;
3720			}
3721
3722			void main ()
3723			{
3724				${POSITION_FRAG_COLOR} = vec4(1.0);
3725			}
3726		""
3727	end
3728
3729	case local_function_prototype
3730		version 300 es
3731		expect compile_fail
3732		both ""
3733			#version 300 es
3734			precision mediump float;
3735			${DECLARATIONS}
3736
3737			void main ()
3738			{
3739				float func (float f);
3740
3741				${POSITION_FRAG_COLOR} = vec4(1.0);
3742			}
3743		""
3744	end
3745
3746	case local_function_definition
3747		version 300 es
3748		expect compile_fail
3749		both ""
3750			#version 300 es
3751			precision mediump float;
3752			${DECLARATIONS}
3753
3754			void main ()
3755			{
3756				float func (float f)
3757				{
3758					return 1.0;
3759				}
3760
3761				${POSITION_FRAG_COLOR} = vec4(1.0);
3762			}
3763		""
3764	end
3765
3766	case name_type_conflict
3767		version 300 es
3768		expect compile_fail
3769		both ""
3770			#version 300 es
3771			precision mediump float;
3772			${DECLARATIONS}
3773
3774			struct foo { float a; }
3775
3776			float foo (float f)
3777			{
3778				return 1.0;
3779			}
3780
3781			void main ()
3782			{
3783				${POSITION_FRAG_COLOR} = vec4(1.0);
3784			}
3785		""
3786	end
3787
3788	case const_overload
3789		version 300 es
3790		expect compile_fail
3791		both ""
3792			#version 300 es
3793			precision mediump float;
3794			${DECLARATIONS}
3795
3796			void func (vec3 f)
3797			{
3798			}
3799
3800			void func (const vec3 f)
3801			{
3802			}
3803
3804			void main ()
3805			{
3806				${POSITION_FRAG_COLOR} = vec4(1.0);
3807			}
3808		""
3809	end
3810
3811	case uniform_local
3812		version 300 es
3813		expect compile_fail
3814		both ""
3815			#version 300 es
3816			precision mediump float;
3817			${DECLARATIONS}
3818
3819			void func (vec3 f)
3820			{
3821				uniform float u;
3822			}
3823
3824			void main ()
3825			{
3826				${POSITION_FRAG_COLOR} = vec4(1.0);
3827			}
3828		""
3829	end
3830
3831	case in_local
3832		version 300 es
3833		expect compile_fail
3834		both ""
3835			#version 300 es
3836			precision mediump float;
3837			${DECLARATIONS}
3838
3839			void func (vec3 f)
3840			{
3841				in float v;
3842			}
3843
3844			void main ()
3845			{
3846				${POSITION_FRAG_COLOR} = vec4(1.0);
3847			}
3848		""
3849	end
3850
3851	case out_local
3852		version 300 es
3853		expect compile_fail
3854		both ""
3855			#version 300 es
3856			precision mediump float;
3857			${DECLARATIONS}
3858
3859			void func (vec3 f)
3860			{
3861				in float a;
3862			}
3863
3864			void main ()
3865			{
3866				${POSITION_FRAG_COLOR} = vec4(1.0);
3867			}
3868		""
3869	end
3870
3871	case inout_local
3872		version 300 es
3873		expect compile_fail
3874		both ""
3875			#version 300 es
3876			precision mediump float;
3877			${DECLARATIONS}
3878
3879			void func (vec3 f)
3880			{
3881				inout float a;
3882			}
3883
3884			void main ()
3885			{
3886				${POSITION_FRAG_COLOR} = vec4(1.0);
3887			}
3888		""
3889	end
3890
3891	case uniform_argument
3892		version 300 es
3893		expect compile_fail
3894		both ""
3895			#version 300 es
3896			precision mediump float;
3897			${DECLARATIONS}
3898
3899			void func (uniform vec3 f)
3900			{
3901			}
3902
3903			void main ()
3904			{
3905				${POSITION_FRAG_COLOR} = vec4(1.0);
3906			}
3907		""
3908	end
3909
3910	case uniform_return_type
3911		version 300 es
3912		expect compile_fail
3913		both ""
3914			#version 300 es
3915			precision mediump float;
3916			${DECLARATIONS}
3917
3918			uniform float func (vec3 f)
3919			{
3920				return f.x;
3921			}
3922
3923			void main ()
3924			{
3925				${POSITION_FRAG_COLOR} = vec4(1.0);
3926			}
3927		""
3928	end
3929
3930	case in_return_type
3931		version 300 es
3932		expect compile_fail
3933		both ""
3934			#version 300 es
3935			precision mediump float;
3936			${DECLARATIONS}
3937
3938			in float func (vec3 f)
3939			{
3940				return f.x;
3941			}
3942
3943			void main ()
3944			{
3945				${POSITION_FRAG_COLOR} = vec4(func(vec3(1.0)));
3946			}
3947		""
3948	end
3949
3950	case out_return_type
3951		version 300 es
3952		expect compile_fail
3953		both ""
3954			#version 300 es
3955			precision mediump float;
3956			${DECLARATIONS}
3957
3958			out float func (vec3 f)
3959			{
3960				return f.x;
3961			}
3962
3963			void main ()
3964			{
3965				${POSITION_FRAG_COLOR} = vec4(func(vec3(1.0)));
3966			}
3967		""
3968	end
3969
3970	case inout_return_type
3971		version 300 es
3972		expect compile_fail
3973		both ""
3974			#version 300 es
3975			precision mediump float;
3976			${DECLARATIONS}
3977
3978			inout float func (vec3 f)
3979			{
3980				return f.x;
3981			}
3982
3983			void main ()
3984			{
3985				${POSITION_FRAG_COLOR} = vec4(func(vec3(1.0)));
3986			}
3987		""
3988	end
3989
3990	case main_invalid_return_type
3991		version 300 es
3992		expect compile_fail
3993		both ""
3994			#version 300 es
3995			precision mediump float;
3996			${DECLARATIONS}
3997
3998			float main ()
3999			{
4000				${POSITION_FRAG_COLOR} = vec4(1.0);
4001			}
4002		""
4003	end
4004
4005	case main_has_arguments
4006		version 300 es
4007		expect compile_fail
4008		both ""
4009			#version 300 es
4010			precision mediump float;
4011			${DECLARATIONS}
4012
4013			void main (float f)
4014			{
4015				${POSITION_FRAG_COLOR} = vec4(1.0);
4016			}
4017		""
4018	end
4019
4020	case main_missing_return_type
4021		version 300 es
4022		expect compile_fail
4023		both ""
4024			#version 300 es
4025			precision mediump float;
4026			${DECLARATIONS}
4027
4028			main ()
4029			{
4030				${POSITION_FRAG_COLOR} = vec4(1.0);
4031			}
4032		""
4033	end
4034
4035	case write_const_arg
4036		version 300 es
4037		expect compile_fail
4038		both ""
4039			#version 300 es
4040			precision mediump float;
4041			${DECLARATIONS}
4042
4043			float func (const float f)
4044			{
4045				f = 1.0;
4046			}
4047
4048			void main ()
4049			{
4050				${POSITION_FRAG_COLOR} = vec4(1.0);
4051			}
4052		""
4053	end
4054
4055	case write_const_array_arg
4056		version 300 es
4057		expect compile_fail
4058		both ""
4059			#version 300 es
4060			precision mediump float;
4061			${DECLARATIONS}
4062
4063			float func (const float f[3])
4064			{
4065				f[0] = 1.0;
4066			}
4067
4068			void main ()
4069			{
4070				${POSITION_FRAG_COLOR} = vec4(1.0);
4071			}
4072		""
4073	end
4074
4075	case use_const_arg_in_const_expr
4076		version 300 es
4077		expect compile_fail
4078		both ""
4079			#version 300 es
4080			precision mediump float;
4081			${DECLARATIONS}
4082
4083			float func (const int i)
4084			{
4085				const int z = i+1;
4086				return float(z);
4087			}
4088
4089			void main ()
4090			{
4091				${POSITION_FRAG_COLOR} = vec4(func(1));
4092			}
4093		""
4094	end
4095
4096	case use_const_arg_as_array_size
4097		version 300 es
4098		expect compile_fail
4099		both ""
4100			#version 300 es
4101			precision mediump float;
4102			${DECLARATIONS}
4103
4104			float func (const int i)
4105			{
4106				float f[i];
4107				f[0] = 1.0;
4108				return f[0];
4109			}
4110
4111			void main ()
4112			{
4113				${POSITION_FRAG_COLOR} = vec4(func(1));
4114			}
4115		""
4116	end
4117
4118	case overload_builtin_function
4119		version 300 es
4120		expect compile_fail
4121		both ""
4122			#version 300 es
4123			precision mediump float;
4124			${DECLARATIONS}
4125
4126			int sin (int x)
4127			{
4128				return int(sin(float(x)));
4129			}
4130
4131			void main ()
4132			{
4133				${POSITION_FRAG_COLOR} = vec4(sin(1));
4134			}
4135		""
4136	end
4137
4138	case redefine_builtin_function
4139		version 300 es
4140		expect compile_fail
4141		both ""
4142			#version 300 es
4143			precision mediump float;
4144			${DECLARATIONS}
4145
4146			float sin (float x)
4147			{
4148				return 0.0;
4149			}
4150
4151			void main ()
4152			{
4153				${POSITION_FRAG_COLOR} = vec4(sin(1.0));
4154			}
4155		""
4156	end
4157
4158	case basic_recursion
4159		version 300 es
4160		expect compile_fail
4161		both ""
4162			#version 300 es
4163			precision mediump float;
4164			${DECLARATIONS}
4165
4166			float fib (float x)
4167			{
4168				if (x <= 1.0)
4169					return x;
4170				else
4171					return fib(x-2.0) + fib(x-1.0);
4172			}
4173
4174			void main ()
4175			{
4176				${POSITION_FRAG_COLOR} = vec4(fib(5.0));
4177			}
4178		""
4179	end
4180
4181	case simple_tail_recursion
4182		version 300 es
4183		expect compile_fail
4184		both ""
4185			#version 300 es
4186			precision mediump float;
4187			${DECLARATIONS}
4188
4189			float rec (float x)
4190			{
4191				if (x <= 0.0)
4192					return 0.0;
4193				else
4194					return rec(x-1.0);
4195			}
4196
4197			void main ()
4198			{
4199				${POSITION_FRAG_COLOR} = vec4(rec(5.0));
4200			}
4201		""
4202	end
4203
4204	case dynamic_conditional_recursion
4205		version 300 es
4206		expect compile_fail
4207		both ""
4208			#version 300 es
4209			precision mediump float;
4210			${DECLARATIONS}
4211			uniform float ua;
4212			uniform float ub;
4213
4214			float funcA (float x);
4215			float funcB (float x);
4216
4217			float funcA (float x)
4218			{
4219				if (ub+x > 0.0)
4220					funcB(x*2.0);
4221				else
4222					return ub;
4223			}
4224
4225			float funcB (float x)
4226			{
4227				return sqrt(funcA(x));
4228			}
4229
4230			void main ()
4231			{
4232				${POSITION_FRAG_COLOR} = vec4(funcB(ua));
4233			}
4234		""
4235	end
4236
4237	case dynamic_loop_recursion
4238		version 300 es
4239		expect compile_fail
4240		both ""
4241			#version 300 es
4242			precision mediump float;
4243			${DECLARATIONS}
4244			uniform float ua;
4245			uniform float ub;
4246
4247			float funcA (float x);
4248			float funcB (float x);
4249
4250			float funcA (float x)
4251			{
4252				for (float z = 0.0; z < ub+x; z++)
4253				{
4254					if (z > 2.0)
4255						funcB(z*2.0);
4256					else
4257						return z;
4258				}
4259			}
4260
4261			float funcB (float x)
4262			{
4263				return sqrt(funcA(x));
4264			}
4265
4266			void main ()
4267			{
4268				${POSITION_FRAG_COLOR} = vec4(funcB(ua));
4269			}
4270		""
4271	end
4272
4273	case dynamic_switch_recursion
4274		version 300 es
4275		expect compile_fail
4276		both ""
4277			#version 300 es
4278			precision mediump float;
4279			${DECLARATIONS}
4280			uniform float ua;
4281			uniform mediump int ub;
4282
4283			float funcA (float x);
4284			float funcB (float x);
4285
4286			float funcA (float x)
4287			{
4288				switch (ub + int(x))
4289				{
4290					case 0: return ua-1.0;
4291					case 1: return ua;
4292					case 2: return funcB(x*2.0);
4293					default: return 0.0;
4294				}
4295			}
4296
4297			float funcB (float x)
4298			{
4299				return sqrt(funcA(x));
4300			}
4301
4302			void main ()
4303			{
4304				${POSITION_FRAG_COLOR} = vec4(funcB(ua));
4305			}
4306		""
4307	end
4308
4309	case modify_const_arg
4310		version 300 es
4311		expect compile_fail
4312		both ""
4313			#version 300 es
4314			precision mediump float;
4315			precision mediump int;
4316			${DECLARATIONS}
4317
4318			int func (const int a)
4319			{
4320				a = -a;
4321				return 2 * a;
4322			}
4323
4324			void main()
4325			{
4326				${POSITION_FRAG_COLOR} = vec4(func(3));
4327			}
4328		""
4329	end
4330
4331	case init_const_local_from_const_arg
4332		version 300 es
4333		expect compile_fail
4334		both ""
4335			#version 300 es
4336			precision mediump float;
4337			precision mediump int;
4338			${DECLARATIONS}
4339
4340			int func (const int a)
4341			{
4342				const int b = -a;
4343				return 2 * b;
4344			}
4345
4346			void main()
4347			{
4348				${POSITION_FRAG_COLOR} = vec4(func(3));
4349			}
4350		""
4351	end
4352
4353	case array_size_from_const_arg
4354		version 300 es
4355		expect compile_fail
4356		both ""
4357			#version 300 es
4358			precision mediump float;
4359			precision mediump int;
4360			${DECLARATIONS}
4361
4362			int func (const int a)
4363			{
4364				int arr[a];
4365				arr[1] = 3;
4366				return arr[1];
4367			}
4368
4369			void main()
4370			{
4371				${POSITION_FRAG_COLOR} = vec4(func(3));
4372			}
4373		""
4374	end
4375
4376end # invalid
4377