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