group valid "Valid scoping and name redeclaration cases"

	case local_variable_hides_global_variable
		version 300 es
		values
		{
			input int in0 = [ 1 | 2 | 3 ];
			output int out0 = [ 1 | 2 | 3 ];
		}

		both ""
			#version 300 es
			precision mediump float;
			${DECLARATIONS}

			int a = -1;

			void main()
			{
				${SETUP}
				int a = in0;

				out0 = a;
				${OUTPUT}
			}
		""
	end

	case block_variable_hides_local_variable
		version 300 es
		values
		{
			input int in0 = [ 1 | 2 | 3 ];
			output int out0 = [ 1 | 2 | 3 ];
		}

		both ""
			#version 300 es
			precision mediump float;
			${DECLARATIONS}
			void main()
			{
				${SETUP}
				int a = in0;
				{
					int a = -1;
				}
				out0 = a;
				${OUTPUT}
			}
		""
	end

	case block_variable_hides_global_variable
		version 300 es
		values
		{
			input int in0 = [ 1 | 2 | 3 ];
			output int out0 = [ 1 | 2 | 3 ];
		}

		both ""
			#version 300 es
			precision mediump float;
			${DECLARATIONS}

			int a = -1;

			void main()
			{
				${SETUP}
				{
					int a = in0;

					out0 = a;
				}
				${OUTPUT}
			}
		""
	end

	case for_init_statement_variable_hides_local_variable
		version 300 es
		values
		{
			input int in0 = [ 1 | 2 | 3 ];
			output int out0 = [ 1 | 2 | 3 ];
		}

		both ""
			#version 300 es
			precision mediump float;
			${DECLARATIONS}
			void main()
			{
				${SETUP}
				int a = in0;
				for (int a = 0; a < 10; a++)
				{
				}
				out0 = a;
				${OUTPUT}
			}
		""
	end

	case while_condition_variable_hides_local_variable
		version 300 es
		values
		{
			input int in0 = [ 1 | 2 | 3 ];
			output int out0 = [ 1 | 2 | 3 ];
		}

		both ""
			#version 300 es
			precision mediump float;
			${DECLARATIONS}
			void main()
			{
				${SETUP}
				int a = in0;
				int i = 0;
				while (bool a = (i < 1))
				{
					i++;
				}
				out0 = a;
				${OUTPUT}
			}
		""
	end

	case for_init_statement_variable_hides_global_variable
		version 300 es
		values
		{
			input int in0 = [ 1 | 2 | 3 ];
			output int out0 = [ 1 | 2 | 3 ];
		}

		both ""
			#version 300 es
			precision mediump float;
			${DECLARATIONS}

			int a = 5;

			void main()
			{
				${SETUP}
				for (int a = 0; a < 10; a++)
				{
				}
				out0 = in0 + a - 5;
				${OUTPUT}
			}
		""
	end

	case while_condition_variable_hides_global_variable
		version 300 es
		values
		{
			input int in0 = [ 1 | 2 | 3 ];
			output int out0 = [ 1 | 2 | 3 ];
		}

		both ""
			#version 300 es
			precision mediump float;
			${DECLARATIONS}

			int a = 5;

			void main()
			{
				${SETUP}
				int i = 0;
				while (bool a = (i < 1))
				{
					i++;
				}
				out0 = in0 + a - 5;
				${OUTPUT}
			}
		""
	end

	case variable_in_if_hides_global_variable
		version 300 es
		values
		{
			input int in0 = [ 1 | 2 | 3 ];
			output int out0 = [ 1 | 2 | 3 ];
		}

		both ""
			#version 300 es
			precision mediump float;
			${DECLARATIONS}

			int a = 1;

			void main()
			{
				${SETUP}
				if (true)
					int a = 42;
				out0 = a*in0;
				${OUTPUT}
			}
		""
	end

	case variable_from_outer_scope_visible_in_initializer
		version 300 es
		values
		{
			input int in0 = [ 1 | 2 | 3 ];
			output int out0 = [ 1 | 2 | 3 ];
		}

		both ""
			#version 300 es
			precision mediump float;
			${DECLARATIONS}
			void main()
			{
				${SETUP}
				int a = in0;
				{
					int a = a+5, b = a-5;
					out0 = b;
					a = 42;
				}
				out0 = out0 + a - in0;
				${OUTPUT}
			}
		""
	end

	case local_int_variable_hides_struct_type
		version 300 es
		values
		{
			input int in0 = [ 1 | 2 | 3 ];
			output int out0 = [ 1 | 2 | 3 ];
		}

		both ""
			#version 300 es
			precision mediump float;
			${DECLARATIONS}

			struct S { int val; };

			void main()
			{
				${SETUP}
				int S = S(in0).val;
				out0 = S;
				${OUTPUT}
			}
		""
	end

	case local_struct_variable_hides_struct_type
		version 300 es
		values
		{
			input int in0 = [ 1 | 2 | 3 ];
			output int out0 = [ 1 | 2 | 3 ];
		}

		both ""
			#version 300 es
			precision mediump float;
			${DECLARATIONS}

			struct S { int val; };

			void main()
			{
				${SETUP}
				S S = S(in0);
				out0 = S.val;
				${OUTPUT}
			}
		""
	end

	case local_variable_hides_function
		version 300 es
		values
		{
			input int in0 = [ 1 | 2 | 3 ];
			output int out0 = [ 1 | 2 | 3 ];
		}

		both ""
			#version 300 es
			precision mediump float;
			${DECLARATIONS}

			int foo (int x) { return x; }

			void main()
			{
				${SETUP}
				int foo = in0;
				out0 = foo;
				${OUTPUT}
			}
		""
	end

	case function_parameter_hides_global_variable
		version 300 es
		values
		{
			input int in0 = [ 1 | 2 | 3 ];
			output int out0 = [ 1 | 2 | 3 ];
		}

		both ""
			#version 300 es
			precision mediump float;
			${DECLARATIONS}

			int a = -1;

			int func (int a) { return a; }

			void main()
			{
				${SETUP}
				out0 = func(in0);
				${OUTPUT}
			}
		""
	end

	case function_parameter_hides_struct_type
		version 300 es
		values
		{
			input int in0 = [ 1 | 2 | 3 ];
			output int out0 = [ 1 | 2 | 3 ];
		}

		both ""
			#version 300 es
			precision mediump float;
			${DECLARATIONS}

			struct S { int x; };

			int func (int S) { return S; }

			void main()
			{
				${SETUP}
				out0 = func(in0);
				${OUTPUT}
			}
		""
	end

	case function_parameter_hides_function
		version 300 es
		values
		{
			input int in0 = [ 1 | 2 | 3 ];
			output int out0 = [ 1 | 2 | 3 ];
		}

		both ""
			#version 300 es
			precision mediump float;
			${DECLARATIONS}

			int func (int func) { return func; }

			void main()
			{
				${SETUP}
				out0 = func(in0);
				${OUTPUT}
			}
		""
	end

	case local_variable_in_inner_scope_hides_function_parameter
		version 300 es
		values
		{
			input int in0 = [ 1 | 2 | 3 ];
			output int out0 = [ 1 | 2 | 3 ];
		}

		both ""
			#version 300 es
			precision mediump float;
			${DECLARATIONS}
			int func (int inp, int x) { { int x = 5; return inp + x - 5; } }

			void main()
			{
				${SETUP}
				out0 = func(in0, 42);
				${OUTPUT}
			}
		""
	end

	case redeclare_function
		version 300 es
		values
		{
			input int in0 = [ 1 | 2 | 3 ];
			output int out0 = [ 1 | 2 | 3 ];
		}

		both ""
			#version 300 es
			precision mediump float;
			${DECLARATIONS}

			int func (int x);
			int func (int);
			int func (int inp) { return inp; }

			void main()
			{
				${SETUP}
				out0 = func(in0);
				${OUTPUT}
			}
		""
	end

end

group invalid "Invalid scoping behavior"

	case redeclare_global_variable
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			precision mediump float;
			${DECLARATIONS}

			int a;
			float a;

			void main()
			{
				a = 1.0;
				${POSITION_FRAG_COLOR} = vec4(a);
			}
		""
	end

	case redeclare_local_variable
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			precision mediump float;
			${DECLARATIONS}

			void main()
			{
				int a;
				float a;
				a = 1.0;
				${POSITION_FRAG_COLOR} = vec4(a);
			}
		""
	end

	case redeclare_for_init_statement_variable
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			precision mediump float;
			${DECLARATIONS}

			void main()
			{
				for (int i = 0; i < 10; i++)
				{
					int i = 11;
				}
				${POSITION_FRAG_COLOR} = vec4(0.0);
			}
		""
	end

	case redeclare_for_condition_variable
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			precision mediump float;
			${DECLARATIONS}

			void main()
			{
				for (int i = 0; int a = (i < 10); i++)
				{
					int a = 0;
				}
				${POSITION_FRAG_COLOR} = vec4(0.0);
			}
		""
	end

	case redeclare_for_init_statement_variable_in_for_condition
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			precision mediump float;
			${DECLARATIONS}

			void main()
			{
				float a;
				for (int i = 0; int i = (i < 10); i++)
				{
					a = sin(i);
				}
				${POSITION_FRAG_COLOR} = vec4(a);
			}
		""
	end

	case redeclare_while_condition_variable
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			precision mediump float;
			${DECLARATIONS}

			void main()
			{
				int a = 0;
				while (int i = (a < 5))
				{
					int i = 11;
					a += i;
				}
				${POSITION_FRAG_COLOR} = vec4(0.0);
			}
		""
	end

	case redefine_function
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			precision mediump float;
			${DECLARATIONS}

			float func(float x);

			float func(float x) { return x + 1.0; }
			float func(float x) { return x + 2.0; }

			void main()
			{
				${POSITION_FRAG_COLOR} = vec4(func(1.0));
			}
		""
	end

	case redeclare_builtin
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			precision mediump float;
			${DECLARATIONS}

			float sin(float x);

			void main()
			{
				${POSITION_FRAG_COLOR} = vec4(sin(1.0));
			}
		""
	end

	case redefine_builtin
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			precision mediump float;
			${DECLARATIONS}

			float sin(float x) { return x + 1.0; }

			void main()
			{
				${POSITION_FRAG_COLOR} = vec4(sin(1.0));
			}
		""
	end

	case conflict_function_struct
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			precision mediump float;
			${DECLARATIONS}

			void f(int x);
			struct f { int x; };

			void main()
			{
				${POSITION_FRAG_COLOR} = vec4(1);
			}
		""
	end

	case conflict_function_variable
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			precision mediump float;
			${DECLARATIONS}

			void f(int x);
			float f;

			void main()
			{
				f = 1.0;
				${POSITION_FRAG_COLOR} = vec4(f);
			}
		""
	end

	case use_global_variable_before_declaration
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			precision mediump float;
			${DECLARATIONS}

			void func()
			{
				a = 2.0;
			}

			float a;

			void main()
			{
				func();
				${POSITION_FRAG_COLOR} = vec4(a);
			}
		""
	end

	case use_local_variable_before_declaration
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			precision mediump float;
			${DECLARATIONS}

			void main()
			{
				float a = 1.0;
				a = b;
				float b = 2.0;

				${POSITION_FRAG_COLOR} = vec4(a);
			}
		""
	end

	case use_struct_type_before_declaration
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			precision mediump float;
			${DECLARATIONS}

			float func (float x) { return S(x).val; }
			struct S { float val; };

			void main()
			{
				${POSITION_FRAG_COLOR} = vec4(func(1.0));
			}
		""
	end

	case use_function_before_declaration
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			precision mediump float;
			${DECLARATIONS}

			float func (float x) { return bar(x); }
			float bar (float x) { return x; }

			void main()
			{
				${POSITION_FRAG_COLOR} = vec4(func(1.0));
			}
		""
	end

	case use_variable_from_block_in_outer_scope
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			precision mediump float;
			${DECLARATIONS}

			void main()
			{
				{
					float a = 1.0;
				}
				${POSITION_FRAG_COLOR} = vec4(a);
			}
		""
	end

	case use_variable_from_if_in_outer_scope
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			precision mediump float;
			${DECLARATIONS}

			void main()
			{
				if (true)
					float a = 1.0;
				${POSITION_FRAG_COLOR} = vec4(a);
			}
		""
	end

	case use_variable_from_else_in_outer_scope
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			precision mediump float;
			${DECLARATIONS}

			void main()
			{
				if (false)
					float a = 1.0;
				else
					float b = 2.0;
				${POSITION_FRAG_COLOR} = vec4(b);
			}
		""
	end

	case use_variable_from_if_in_else
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			precision mediump float;
			${DECLARATIONS}

			void main()
			{
				float a = 1.0;
				if (true)
				{
					float b = 2.0;
				}
				else
				{
					a = b;
				}
				${POSITION_FRAG_COLOR} = vec4(a);
			}
		""
	end

	case use_variable_from_for_init_statement_in_outer_scope
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			precision mediump float;
			${DECLARATIONS}

			void main()
			{
				float x = 0.0;
				for (int i = 0; i < 10; i++)
				{
					x += sin(i);
				}
				${POSITION_FRAG_COLOR} = vec4(float(i));
			}
		""
	end

	case use_variable_from_while_condition_in_outer_scope
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			precision mediump float;
			${DECLARATIONS}

			void main()
			{
				int a = 1;
				while (bool b = (a == 1))
				{
					a++;
				}
				${POSITION_FRAG_COLOR} = vec4(float(b));
			}
		""
	end

	case use_parameter_names_from_function_declaration
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			precision mediump float;
			${DECLARATIONS}

			float func(float a, float b);

			float func(float x, float y) { return a+b; }

			void main()
			{
				${POSITION_FRAG_COLOR} = vec4(func(1.0, 2.0));
			}
		""
	end

	case variable_not_visible_in_own_initializer
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			precision mediump float;
			${DECLARATIONS}

			void main()
			{
				float x = x;
				${POSITION_FRAG_COLOR} = vec4(x);
			}
		""
	end

	case local_variable_hides_function_parameter
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			precision mediump float;
			${DECLARATIONS}
			float func (float inp, float x) { int x = 5.0; return inp + x - 5.0; }

			void main()
			{
				${POSITION_FRAG_COLOR} = vec4(func(1.0, 2.0));
			}
		""
	end

end # invalid
