group valid "Valid scoping and name redeclaration cases"

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

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

			int a = -1;

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

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

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

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

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

		both ""
			#version 100
			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 100 es
		values
		{
			input int in0 = [ 1 | 2 | 3 ];
			output int out0 = [ 1 | 2 | 3 ];
		}

		both ""
			#version 100
			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 100 es
		require full_glsl_es_100_support
		values
		{
			input int in0 = [ 1 | 2 | 3 ];
			output int out0 = [ 1 | 2 | 3 ];
		}

		both ""
			#version 100
			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 100 es
		values
		{
			input int in0 = [ 1 | 2 | 3 ];
			output int out0 = [ 1 | 2 | 3 ];
		}

		both ""
			#version 100
			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 100 es
		require full_glsl_es_100_support
		values
		{
			input int in0 = [ 1 | 2 | 3 ];
			output int out0 = [ 1 | 2 | 3 ];
		}

		both ""
			#version 100
			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 100 es
		values
		{
			input int in0 = [ 1 | 2 | 3 ];
			output int out0 = [ 1 | 2 | 3 ];
		}

		both ""
			#version 100
			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 100 es
		values
		{
			input int in0 = [ 1 | 2 | 3 ];
			output int out0 = [ 1 | 2 | 3 ];
		}

		both ""
			#version 100
			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 100 es
		values
		{
			input int in0 = [ 1 | 2 | 3 ];
			output int out0 = [ 1 | 2 | 3 ];
		}

		both ""
			#version 100
			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 100 es
		values
		{
			input int in0 = [ 1 | 2 | 3 ];
			output int out0 = [ 1 | 2 | 3 ];
		}

		both ""
			#version 100
			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 100 es
		values
		{
			input int in0 = [ 1 | 2 | 3 ];
			output int out0 = [ 1 | 2 | 3 ];
		}

		both ""
			#version 100
			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 100 es
		values
		{
			input int in0 = [ 1 | 2 | 3 ];
			output int out0 = [ 1 | 2 | 3 ];
		}

		both ""
			#version 100
			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 100 es
		values
		{
			input int in0 = [ 1 | 2 | 3 ];
			output int out0 = [ 1 | 2 | 3 ];
		}

		both ""
			#version 100
			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 100 es
		values
		{
			input int in0 = [ 1 | 2 | 3 ];
			output int out0 = [ 1 | 2 | 3 ];
		}

		both ""
			#version 100
			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 100 es
		values
		{
			input int in0 = [ 1 | 2 | 3 ];
			output int out0 = [ 1 | 2 | 3 ];
		}

		both ""
			#version 100
			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 local_variable_hides_function_parameter
		version 100 es
		values
		{
			input int in0 = [ 1 | 2 | 3 ];
			output int out0 = [ 1 | 2 | 3 ];
		}

		both ""
			#version 100
			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

end

group invalid "Invalid scoping behavior"

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

			int a;
			float a;

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

	case redeclare_local_variable
		version 100 es
		expect compile_fail
		both ""
			#version 100
			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 100 es
		expect compile_fail
		both ""
			#version 100
			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 100 es
		expect compile_fail
		both ""
			#version 100
			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 100 es
		expect compile_fail
		both ""
			#version 100
			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 100 es
		expect compile_fail
		both ""
			#version 100
			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 redeclare_function
		version 100 es
		expect compile_fail
		both ""
			#version 100
			precision mediump float;
			${DECLARATIONS}

			float func(float x);
			float func(float x);

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

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

	case redefine_function
		version 100 es
		expect compile_fail
		both ""
			#version 100
			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 100 es
		expect compile_fail
		both ""
			#version 100
			precision mediump float;
			${DECLARATIONS}

			float sin(float x);

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

	case redefine_builtin
		version 100 es
		expect compile_fail
		both ""
			#version 100
			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 100 es
		expect compile_fail
		both ""
			#version 100
			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 100 es
		expect compile_fail
		both ""
			#version 100
			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 100 es
		expect compile_fail
		both ""
			#version 100
			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 100 es
		expect compile_fail
		both ""
			#version 100
			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 100 es
		expect compile_fail
		both ""
			#version 100
			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 100 es
		expect compile_fail
		both ""
			#version 100
			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 100 es
		expect compile_fail
		both ""
			#version 100
			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 100 es
		expect compile_fail
		both ""
			#version 100
			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 100 es
		expect compile_fail
		both ""
			#version 100
			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 100 es
		expect compile_fail
		both ""
			#version 100
			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 100 es
		expect compile_fail
		both ""
			#version 100
			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 100 es
		expect compile_fail
		both ""
			#version 100
			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 100 es
		expect compile_fail
		both ""
			#version 100
			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 100 es
		expect compile_fail
		both ""
			#version 100
			precision mediump float;
			${DECLARATIONS}

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

end # invalid
