1group valid "Valid scoping and name redeclaration cases"
2
3	case local_variable_hides_global_variable
4		version 100 es
5		values
6		{
7			input int in0 = [ 1 | 2 | 3 ];
8			output int out0 = [ 1 | 2 | 3 ];
9		}
10
11		both ""
12			#version 100
13			precision mediump float;
14			${DECLARATIONS}
15
16			int a = -1;
17
18			void main()
19			{
20				${SETUP}
21				int a = in0;
22
23				out0 = a;
24				${OUTPUT}
25			}
26		""
27	end
28
29	case block_variable_hides_local_variable
30		version 100 es
31		values
32		{
33			input int in0 = [ 1 | 2 | 3 ];
34			output int out0 = [ 1 | 2 | 3 ];
35		}
36
37		both ""
38			#version 100
39			precision mediump float;
40			${DECLARATIONS}
41			void main()
42			{
43				${SETUP}
44				int a = in0;
45				{
46					int a = -1;
47				}
48				out0 = a;
49				${OUTPUT}
50			}
51		""
52	end
53
54	case block_variable_hides_global_variable
55		version 100 es
56		values
57		{
58			input int in0 = [ 1 | 2 | 3 ];
59			output int out0 = [ 1 | 2 | 3 ];
60		}
61
62		both ""
63			#version 100
64			precision mediump float;
65			${DECLARATIONS}
66
67			int a = -1;
68
69			void main()
70			{
71				${SETUP}
72				{
73					int a = in0;
74
75					out0 = a;
76				}
77				${OUTPUT}
78			}
79		""
80	end
81
82	case for_init_statement_variable_hides_local_variable
83		version 100 es
84		values
85		{
86			input int in0 = [ 1 | 2 | 3 ];
87			output int out0 = [ 1 | 2 | 3 ];
88		}
89
90		both ""
91			#version 100
92			precision mediump float;
93			${DECLARATIONS}
94			void main()
95			{
96				${SETUP}
97				int a = in0;
98				for (int a = 0; a < 10; a++)
99				{
100				}
101				out0 = a;
102				${OUTPUT}
103			}
104		""
105	end
106
107	case while_condition_variable_hides_local_variable
108		version 100 es
109		require full_glsl_es_100_support
110		values
111		{
112			input int in0 = [ 1 | 2 | 3 ];
113			output int out0 = [ 1 | 2 | 3 ];
114		}
115
116		both ""
117			#version 100
118			precision mediump float;
119			${DECLARATIONS}
120			void main()
121			{
122				${SETUP}
123				int a = in0;
124				int i = 0;
125				while (bool a = (i < 1))
126				{
127					i++;
128				}
129				out0 = a;
130				${OUTPUT}
131			}
132		""
133	end
134
135	case for_init_statement_variable_hides_global_variable
136		version 100 es
137		values
138		{
139			input int in0 = [ 1 | 2 | 3 ];
140			output int out0 = [ 1 | 2 | 3 ];
141		}
142
143		both ""
144			#version 100
145			precision mediump float;
146			${DECLARATIONS}
147
148			int a = 5;
149
150			void main()
151			{
152				${SETUP}
153				for (int a = 0; a < 10; a++)
154				{
155				}
156				out0 = in0 + a - 5;
157				${OUTPUT}
158			}
159		""
160	end
161
162	case while_condition_variable_hides_global_variable
163		version 100 es
164		require full_glsl_es_100_support
165		values
166		{
167			input int in0 = [ 1 | 2 | 3 ];
168			output int out0 = [ 1 | 2 | 3 ];
169		}
170
171		both ""
172			#version 100
173			precision mediump float;
174			${DECLARATIONS}
175
176			int a = 5;
177
178			void main()
179			{
180				${SETUP}
181				int i = 0;
182				while (bool a = (i < 1))
183				{
184					i++;
185				}
186				out0 = in0 + a - 5;
187				${OUTPUT}
188			}
189		""
190	end
191
192	case variable_in_if_hides_global_variable
193		version 100 es
194		values
195		{
196			input int in0 = [ 1 | 2 | 3 ];
197			output int out0 = [ 1 | 2 | 3 ];
198		}
199
200		both ""
201			#version 100
202			precision mediump float;
203			${DECLARATIONS}
204
205			int a = 1;
206
207			void main()
208			{
209				${SETUP}
210				if (true)
211					int a = 42;
212				out0 = a*in0;
213				${OUTPUT}
214			}
215		""
216	end
217
218	case variable_from_outer_scope_visible_in_initializer
219		version 100 es
220		values
221		{
222			input int in0 = [ 1 | 2 | 3 ];
223			output int out0 = [ 1 | 2 | 3 ];
224		}
225
226		both ""
227			#version 100
228			precision mediump float;
229			${DECLARATIONS}
230			void main()
231			{
232				${SETUP}
233				int a = in0;
234				{
235					int a = a+5, b = a-5;
236					out0 = b;
237					a = 42;
238				}
239				out0 = out0 + a - in0;
240				${OUTPUT}
241			}
242		""
243	end
244
245	case local_int_variable_hides_struct_type
246		version 100 es
247		values
248		{
249			input int in0 = [ 1 | 2 | 3 ];
250			output int out0 = [ 1 | 2 | 3 ];
251		}
252
253		both ""
254			#version 100
255			precision mediump float;
256			${DECLARATIONS}
257
258			struct S { int val; };
259
260			void main()
261			{
262				${SETUP}
263				int S = S(in0).val;
264				out0 = S;
265				${OUTPUT}
266			}
267		""
268	end
269
270	case local_struct_variable_hides_struct_type
271		version 100 es
272		values
273		{
274			input int in0 = [ 1 | 2 | 3 ];
275			output int out0 = [ 1 | 2 | 3 ];
276		}
277
278		both ""
279			#version 100
280			precision mediump float;
281			${DECLARATIONS}
282
283			struct S { int val; };
284
285			void main()
286			{
287				${SETUP}
288				S S = S(in0);
289				out0 = S.val;
290				${OUTPUT}
291			}
292		""
293	end
294
295	case local_variable_hides_function
296		version 100 es
297		values
298		{
299			input int in0 = [ 1 | 2 | 3 ];
300			output int out0 = [ 1 | 2 | 3 ];
301		}
302
303		both ""
304			#version 100
305			precision mediump float;
306			${DECLARATIONS}
307
308			int foo (int x) { return x; }
309
310			void main()
311			{
312				${SETUP}
313				int foo = in0;
314				out0 = foo;
315				${OUTPUT}
316			}
317		""
318	end
319
320	case function_parameter_hides_global_variable
321		version 100 es
322		values
323		{
324			input int in0 = [ 1 | 2 | 3 ];
325			output int out0 = [ 1 | 2 | 3 ];
326		}
327
328		both ""
329			#version 100
330			precision mediump float;
331			${DECLARATIONS}
332
333			int a = -1;
334
335			int func (int a) { return a; }
336
337			void main()
338			{
339				${SETUP}
340				out0 = func(in0);
341				${OUTPUT}
342			}
343		""
344	end
345
346	case function_parameter_hides_struct_type
347		version 100 es
348		values
349		{
350			input int in0 = [ 1 | 2 | 3 ];
351			output int out0 = [ 1 | 2 | 3 ];
352		}
353
354		both ""
355			#version 100
356			precision mediump float;
357			${DECLARATIONS}
358
359			struct S { int x; };
360
361			int func (int S) { return S; }
362
363			void main()
364			{
365				${SETUP}
366				out0 = func(in0);
367				${OUTPUT}
368			}
369		""
370	end
371
372	case function_parameter_hides_function
373		version 100 es
374		values
375		{
376			input int in0 = [ 1 | 2 | 3 ];
377			output int out0 = [ 1 | 2 | 3 ];
378		}
379
380		both ""
381			#version 100
382			precision mediump float;
383			${DECLARATIONS}
384
385			int func (int func) { return func; }
386
387			void main()
388			{
389				${SETUP}
390				out0 = func(in0);
391				${OUTPUT}
392			}
393		""
394	end
395
396	case local_variable_in_inner_scope_hides_function_parameter
397		version 100 es
398		values
399		{
400			input int in0 = [ 1 | 2 | 3 ];
401			output int out0 = [ 1 | 2 | 3 ];
402		}
403
404		both ""
405			#version 100
406			precision mediump float;
407			${DECLARATIONS}
408			int func (int inp, int x) { { int x = 5; return inp + x - 5; } }
409
410			void main()
411			{
412				${SETUP}
413				out0 = func(in0, 42);
414				${OUTPUT}
415			}
416		""
417	end
418
419	case local_variable_hides_function_parameter
420		version 100 es
421		values
422		{
423			input int in0 = [ 1 | 2 | 3 ];
424			output int out0 = [ 1 | 2 | 3 ];
425		}
426
427		both ""
428			#version 100
429			precision mediump float;
430			${DECLARATIONS}
431			int func (int inp, int x) { int x = 5; return inp + x - 5; }
432
433			void main()
434			{
435				${SETUP}
436				out0 = func(in0, 42);
437				${OUTPUT}
438			}
439		""
440	end
441
442end
443
444group invalid "Invalid scoping behavior"
445
446	case redeclare_global_variable
447		version 100 es
448		expect compile_fail
449		both ""
450			#version 100
451			precision mediump float;
452			${DECLARATIONS}
453
454			int a;
455			float a;
456
457			void main()
458			{
459				a = 1.0;
460				${POSITION_FRAG_COLOR} = vec4(a);
461			}
462		""
463	end
464
465	case redeclare_local_variable
466		version 100 es
467		expect compile_fail
468		both ""
469			#version 100
470			precision mediump float;
471			${DECLARATIONS}
472
473			void main()
474			{
475				int a;
476				float a;
477				a = 1.0;
478				${POSITION_FRAG_COLOR} = vec4(a);
479			}
480		""
481	end
482
483	case redeclare_for_init_statement_variable
484		version 100 es
485		expect compile_fail
486		both ""
487			#version 100
488			precision mediump float;
489			${DECLARATIONS}
490
491			void main()
492			{
493				for (int i = 0; i < 10; i++)
494				{
495					int i = 11;
496				}
497				${POSITION_FRAG_COLOR} = vec4(0.0);
498			}
499		""
500	end
501
502	case redeclare_for_condition_variable
503		version 100 es
504		expect compile_fail
505		both ""
506			#version 100
507			precision mediump float;
508			${DECLARATIONS}
509
510			void main()
511			{
512				for (int i = 0; int a = (i < 10); i++)
513				{
514					int a = 0;
515				}
516				${POSITION_FRAG_COLOR} = vec4(0.0);
517			}
518		""
519	end
520
521	case redeclare_for_init_statement_variable_in_for_condition
522		version 100 es
523		expect compile_fail
524		both ""
525			#version 100
526			precision mediump float;
527			${DECLARATIONS}
528
529			void main()
530			{
531				float a;
532				for (int i = 0; int i = (i < 10); i++)
533				{
534					a = sin(i);
535				}
536				${POSITION_FRAG_COLOR} = vec4(a);
537			}
538		""
539	end
540
541	case redeclare_while_condition_variable
542		version 100 es
543		expect compile_fail
544		both ""
545			#version 100
546			precision mediump float;
547			${DECLARATIONS}
548
549			void main()
550			{
551				int a = 0;
552				while (int i = (a < 5))
553				{
554					int i = 11;
555					a += i;
556				}
557				${POSITION_FRAG_COLOR} = vec4(0.0);
558			}
559		""
560	end
561
562	case redeclare_function
563		version 100 es
564		expect compile_fail
565		both ""
566			#version 100
567			precision mediump float;
568			${DECLARATIONS}
569
570			float func(float x);
571			float func(float x);
572
573			float func(float x) { return x + 1.0; }
574
575			void main()
576			{
577				${POSITION_FRAG_COLOR} = vec4(func(1.0));
578			}
579		""
580	end
581
582	case redefine_function
583		version 100 es
584		expect compile_fail
585		both ""
586			#version 100
587			precision mediump float;
588			${DECLARATIONS}
589
590			float func(float x);
591
592			float func(float x) { return x + 1.0; }
593			float func(float x) { return x + 2.0; }
594
595			void main()
596			{
597				${POSITION_FRAG_COLOR} = vec4(func(1.0));
598			}
599		""
600	end
601
602	case redeclare_builtin
603		version 100 es
604		expect compile_fail
605		both ""
606			#version 100
607			precision mediump float;
608			${DECLARATIONS}
609
610			float sin(float x);
611
612			void main()
613			{
614				${POSITION_FRAG_COLOR} = vec4(sin(1.0));
615			}
616		""
617	end
618
619	case redefine_builtin
620		version 100 es
621		expect compile_fail
622		both ""
623			#version 100
624			precision mediump float;
625			${DECLARATIONS}
626
627			float sin(float x) { return x + 1.0; }
628
629			void main()
630			{
631				${POSITION_FRAG_COLOR} = vec4(sin(1.0));
632			}
633		""
634	end
635
636	case conflict_function_struct
637		version 100 es
638		expect compile_fail
639		both ""
640			#version 100
641			precision mediump float;
642			${DECLARATIONS}
643
644			void f(int x);
645			struct f { int x; };
646
647			void main()
648			{
649				${POSITION_FRAG_COLOR} = vec4(1);
650			}
651		""
652	end
653
654	case conflict_function_variable
655		version 100 es
656		expect compile_fail
657		both ""
658			#version 100
659			precision mediump float;
660			${DECLARATIONS}
661
662			void f(int x);
663			float f;
664
665			void main()
666			{
667				f = 1.0;
668				${POSITION_FRAG_COLOR} = vec4(f);
669			}
670		""
671	end
672
673	case use_global_variable_before_declaration
674		version 100 es
675		expect compile_fail
676		both ""
677			#version 100
678			precision mediump float;
679			${DECLARATIONS}
680
681			void func()
682			{
683				a = 2.0;
684			}
685
686			float a;
687
688			void main()
689			{
690				func();
691				${POSITION_FRAG_COLOR} = vec4(a);
692			}
693		""
694	end
695
696	case use_local_variable_before_declaration
697		version 100 es
698		expect compile_fail
699		both ""
700			#version 100
701			precision mediump float;
702			${DECLARATIONS}
703
704			void main()
705			{
706				float a = 1.0;
707				a = b;
708				float b = 2.0;
709
710				${POSITION_FRAG_COLOR} = vec4(a);
711			}
712		""
713	end
714
715	case use_struct_type_before_declaration
716		version 100 es
717		expect compile_fail
718		both ""
719			#version 100
720			precision mediump float;
721			${DECLARATIONS}
722
723			float func (float x) { return S(x).val; }
724			struct S { float val; };
725
726			void main()
727			{
728				${POSITION_FRAG_COLOR} = vec4(func(1.0));
729			}
730		""
731	end
732
733	case use_function_before_declaration
734		version 100 es
735		expect compile_fail
736		both ""
737			#version 100
738			precision mediump float;
739			${DECLARATIONS}
740
741			float func (float x) { return bar(x); }
742			float bar (float x) { return x; }
743
744			void main()
745			{
746				${POSITION_FRAG_COLOR} = vec4(func(1.0));
747			}
748		""
749	end
750
751	case use_variable_from_block_in_outer_scope
752		version 100 es
753		expect compile_fail
754		both ""
755			#version 100
756			precision mediump float;
757			${DECLARATIONS}
758
759			void main()
760			{
761				{
762					float a = 1.0;
763				}
764				${POSITION_FRAG_COLOR} = vec4(a);
765			}
766		""
767	end
768
769	case use_variable_from_if_in_outer_scope
770		version 100 es
771		expect compile_fail
772		both ""
773			#version 100
774			precision mediump float;
775			${DECLARATIONS}
776
777			void main()
778			{
779				if (true)
780					float a = 1.0;
781				${POSITION_FRAG_COLOR} = vec4(a);
782			}
783		""
784	end
785
786	case use_variable_from_else_in_outer_scope
787		version 100 es
788		expect compile_fail
789		both ""
790			#version 100
791			precision mediump float;
792			${DECLARATIONS}
793
794			void main()
795			{
796				if (false)
797					float a = 1.0;
798				else
799					float b = 2.0;
800				${POSITION_FRAG_COLOR} = vec4(b);
801			}
802		""
803	end
804
805	case use_variable_from_if_in_else
806		version 100 es
807		expect compile_fail
808		both ""
809			#version 100
810			precision mediump float;
811			${DECLARATIONS}
812
813			void main()
814			{
815				float a = 1.0;
816				if (true)
817				{
818					float b = 2.0;
819				}
820				else
821				{
822					a = b;
823				}
824				${POSITION_FRAG_COLOR} = vec4(a);
825			}
826		""
827	end
828
829	case use_variable_from_for_init_statement_in_outer_scope
830		version 100 es
831		expect compile_fail
832		both ""
833			#version 100
834			precision mediump float;
835			${DECLARATIONS}
836
837			void main()
838			{
839				float x = 0.0;
840				for (int i = 0; i < 10; i++)
841				{
842					x += sin(i);
843				}
844				${POSITION_FRAG_COLOR} = vec4(float(i));
845			}
846		""
847	end
848
849	case use_variable_from_while_condition_in_outer_scope
850		version 100 es
851		expect compile_fail
852		both ""
853			#version 100
854			precision mediump float;
855			${DECLARATIONS}
856
857			void main()
858			{
859				int a = 1;
860				while (bool b = (a == 1))
861				{
862					a++;
863				}
864				${POSITION_FRAG_COLOR} = vec4(float(b));
865			}
866		""
867	end
868
869	case use_parameter_names_from_function_declaration
870		version 100 es
871		expect compile_fail
872		both ""
873			#version 100
874			precision mediump float;
875			${DECLARATIONS}
876
877			float func(float a, float b);
878
879			float func(float x, float y) { return a+b; }
880
881			void main()
882			{
883				${POSITION_FRAG_COLOR} = vec4(func(1.0, 2.0));
884			}
885		""
886	end
887
888	case variable_not_visible_in_own_initializer
889		version 100 es
890		expect compile_fail
891		both ""
892			#version 100
893			precision mediump float;
894			${DECLARATIONS}
895
896			void main()
897			{
898				float x = x;
899				${POSITION_FRAG_COLOR} = vec4(x);
900			}
901		""
902	end
903
904end # invalid
905