# Tests todo:
# - inout with varyings, attributes, uniforms (and arrays of 'em)
# - inout with arrays, array elements
# - inout with array elements
# - inout by-value semantics (arrays & elements & structs)

# Done:
# - control flow: return, return in loop, etc.

group datatypes "Function Parameter Data Types"

	case float_float
		version 300 es
		values
		{
			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
		}

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

			float func (float a)
			{
				return -a;
			}

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

	case float_vec2
		version 300 es
		values
		{
			input vec2 in0		= [ vec2(0.0, 1.0) | vec2(2.0, 2.5) ];
			output float out0	= [ -1.0 | -4.5 ];
		}

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

			float func (vec2 a)
			{
				return -(a.x + a.y);
			}

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

	case float_vec3
		version 300 es
		values
		{
			input vec3 in0		= [ vec3(0.0, 1.0, -2.0) | vec3(2.0, 2.5, -4.0) ];
			output float out0	= [ 1.0 | -0.5 ];
		}

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

			float func (vec3 a)
			{
				return -(a.x + a.y + a.z);
			}

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

	case float_vec4
		version 300 es
		values
		{
			input vec4 in0		= [ vec4(0.0, 1.0, -2.0, 0.5) | vec4(2.0, 2.5, 4.0, -7.0) ];
			output float out0	= [ 0.5 | -1.5 ];
		}

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

			float func (vec4 a)
			{
				return -(a.x + a.y + a.z + a.w);
			}

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

	case float_mat2
		version 300 es
		values
		{
			input mat2 in0		= [ mat2(0.0, 1.0, -2.0, 0.5) | mat2(2.0, 2.5, 4.0, -7.0) ];
			output float out0	= [ 0.5 | -1.5 ];
		}

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

			float func (mat2 a)
			{
				return -(a[0][0] + a[0][1] + a[1][0] + a[1][1]);
			}

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

	case float_mat3
		version 300 es
		values
		{
			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) ];
			output float out0	= [ -4.5 | -5.0 ];
		}

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

			float func (mat3 a)
			{
				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]);
			}

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

	case float_mat4
		version 300 es
		values
		{
			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) ];
			output float out0	= [ -5.5 | -9.0 ];
		}

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

			float func (mat4 a)
			{
				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]);
			}

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

	case int_int
		version 300 es
		values
		{
			input int in0		= [ -1 | 0 | 1 | 4 ];
			output int out0		= [ 1 | 0 | -1 | -4 ];
		}

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

			int func (int a)
			{
				return -a;
			}

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

	case int_ivec2
		version 300 es
		values
		{
			input ivec2 in0		= [ ivec2(-1, 0) | ivec2(1, 4) ];
			output int out0		= [ 1 | -5 ];
		}

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

			int func (ivec2 a)
			{
				return -(a.x + a.y);
			}

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

	case int_ivec3
		version 300 es
		values
		{
			input ivec3 in0		= [ ivec3(-1, 0, 2) | ivec3(1, 4, -8) ];
			output int out0		= [ -1 | 3 ];
		}

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

			int func (ivec3 a)
			{
				return -(a.x + a.y + a.z);
			}

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

	case int_ivec4
		version 300 es
		values
		{
			input ivec4 in0		= [ ivec4(-1, 0, 2, 2) | ivec4(1, 4, -8, 2) ];
			output int out0		= [ -3 | 1 ];
		}

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

			int func (ivec4 a)
			{
				return -(a.x + a.y + a.z + a.w);
			}

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

	case uint_uint
		version 300 es
		values
		{
			input uint in0		= [ 1 | 0 | 2 | 4 ];
			output uint out0	= [ 1 | 0 | 4 | 16 ];
		}

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

			uint func (uint a)
			{
				return a*a;
			}

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

	case uint_uvec2
		version 300 es
		values
		{
			input uvec2 in0		= [ uvec2(1, 0) | uvec2(2, 4) ];
			output uint out0	= [ 1 | 6 ];
		}

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

			uint func (uvec2 a)
			{
				return (a.x + a.y);
			}

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

	case uint_uvec3
		version 300 es
		values
		{
			input uvec3 in0		= [ uvec3(1, 0, 2) | uvec3(1, 4, 8) ];
			output uint out0		= [ 3 | 13 ];
		}

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

			uint func (uvec3 a)
			{
				return (a.x + a.y + a.z);
			}

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

	case uint_uvec4
		version 300 es
		values
		{
			input uvec4 in0		= [ uvec4(1, 0, 2, 2) | uvec4(1, 4, 8, 2) ];
			output uint out0	= [ 5 | 15 ];
		}

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

			uint func (uvec4 a)
			{
				return (a.x + a.y + a.z + a.w);
			}

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

	case bool_bool
		version 300 es
		values
		{
			input bool in0		= [ true | false ];
			output bool out0	= [ false | true ];
		}

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

			bool func (bool a)
			{
				return !a;
			}

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

	case bool_bvec2
		version 300 es
		values
		{
			input bvec2 in0		= [ bvec2(true, true) | bvec2(false, true) ];
			output bool out0	= [ false | true ];
		}

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

			bool func (bvec2 a)
			{
				return !(a.x == a.y);
			}

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

	case bool_bvec3
		version 300 es
		values
		{
			input bvec3 in0		= [ bvec3(true, true, false) | bvec3(true, false, false) ];
			output bool out0	= [ false | true ];
		}

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

			bool func (bvec3 a)
			{
				return (a.x == a.y) == a.z;
			}

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

	case bool_bvec4
		version 300 es
		values
		{
			input bvec4 in0		= [ bvec4(true, true, true, false) | bvec4(false, false, true, true) | bvec4(true, false, false, true) ];
			output bool out0	= [ false | true | true ];
		}

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

			bool func (bvec4 a)
			{
				return ((a.x == a.y) == (a.z == a.w));
			}

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

	case mat2
		version 300 es
		values
		{
			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) ];
			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) ];
		}

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

			mat2 func (mat2 a)
			{
				return -2.0*a;
			}

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


	case mat2x3
		version 300 es
		values
		{
			input mat2x3 in0	= [ mat2x3(2.5, 0.0, 1.0, -2.5, 1.0, 3.0) | mat2x3(0.0, 2.0, 1.5, -3.5, 2.0, 0.5) | mat2x3(-1.5, -3.5, 2.5, 0.0, 1.5, 3.0) ];
			output mat2x3 out0	= [ mat2x3(-5.0, -0.0, -2.0, 5.0, -2.0, -6.0) | mat2x3(-0.0, -4.0, -3.0, 7.0, -4.0, -1.0) | mat2x3(3.0, 7.0, -5.0, -0.0, -3.0, -6.0) ];
		}

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

			mat2x3 func (mat2x3 a)
			{
				return -2.0*a;
			}

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


	case mat2x4
		version 300 es
		values
		{
			input mat2x4 in0	= [ mat2x4(1.5, 3.0, -1.0, 2.5, -0.5, 3.5, 3.0, -3.0) | mat2x4(-2.5, -2.0, 3.5, -0.5, 1.0, -1.5, 0.0, -1.0) | mat2x4(-1.0, 0.5, 0.5, 3.0, 1.5, 3.0, 2.5, 3.5) ];
			output mat2x4 out0	= [ mat2x4(-3.0, -6.0, 2.0, -5.0, 1.0, -7.0, -6.0, 6.0) | mat2x4(5.0, 4.0, -7.0, 1.0, -2.0, 3.0, -0.0, 2.0) | mat2x4(2.0, -1.0, -1.0, -6.0, -3.0, -6.0, -5.0, -7.0) ];
		}

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

			mat2x4 func (mat2x4 a)
			{
				return -2.0*a;
			}

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


	case mat3x2
		version 300 es
		values
		{
			input mat3x2 in0	= [ mat3x2(1.5, -2.5, 2.5, 3.5, 3.0, 0.5) | mat3x2(1.5, -2.0, 2.5, 0.5, -1.5, -3.5) | mat3x2(2.5, 3.5, -3.0, 2.5, -0.5, -2.5) ];
			output mat3x2 out0	= [ mat3x2(-3.0, 5.0, -5.0, -7.0, -6.0, -1.0) | mat3x2(-3.0, 4.0, -5.0, -1.0, 3.0, 7.0) | mat3x2(-5.0, -7.0, 6.0, -5.0, 1.0, 5.0) ];
		}

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

			mat3x2 func (mat3x2 a)
			{
				return -2.0*a;
			}

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


	case mat3
		version 300 es
		values
		{
			input mat3 in0	= [ mat3(-1.5, 2.0, 3.0, -3.5, 1.0, -3.5, 1.5, -1.5, 3.0) | mat3(3.5, 0.0, 3.5, -1.5, -3.0, 0.5, -3.5, -2.5, -0.5) | mat3(1.0, -2.5, -3.5, 3.0, -1.5, 3.5, 3.0, -1.0, -0.5) ];
			output mat3 out0	= [ mat3(3.0, -4.0, -6.0, 7.0, -2.0, 7.0, -3.0, 3.0, -6.0) | mat3(-7.0, -0.0, -7.0, 3.0, 6.0, -1.0, 7.0, 5.0, 1.0) | mat3(-2.0, 5.0, 7.0, -6.0, 3.0, -7.0, -6.0, 2.0, 1.0) ];
		}

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

			mat3 func (mat3 a)
			{
				return -2.0*a;
			}

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


	case mat3x4
		version 300 es
		values
		{
			input mat3x4 in0	= [ mat3x4(0.0, 1.0, 0.5, 0.5, 1.0, 3.5, 0.0, -0.5, 1.5, -2.0, -1.5, 3.5) | mat3x4(0.0, 0.5, -3.5, -0.5, 0.5, -3.5, 1.0, 1.0, -3.5, 1.0, -0.5, 1.5) | mat3x4(-1.0, 1.5, 2.0, -3.5, -3.5, 1.5, 3.5, -2.0, -0.5, 0.5, -1.5, -1.0) ];
			output mat3x4 out0	= [ mat3x4(-0.0, -2.0, -1.0, -1.0, -2.0, -7.0, -0.0, 1.0, -3.0, 4.0, 3.0, -7.0) | mat3x4(-0.0, -1.0, 7.0, 1.0, -1.0, 7.0, -2.0, -2.0, 7.0, -2.0, 1.0, -3.0) | mat3x4(2.0, -3.0, -4.0, 7.0, 7.0, -3.0, -7.0, 4.0, 1.0, -1.0, 3.0, 2.0) ];
		}

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

			mat3x4 func (mat3x4 a)
			{
				return -2.0*a;
			}

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


	case mat4x2
		version 300 es
		values
		{
			input mat4x2 in0	= [ mat4x2(-1.5, -1.0, 0.5, -1.5, -1.0, 2.0, -3.5, 0.5) | mat4x2(2.0, -1.5, -2.0, 2.5, -2.0, -2.5, -0.5, 1.5) | mat4x2(-3.0, -1.5, -1.0, 2.5, -0.5, 2.5, -2.5, -1.0) ];
			output mat4x2 out0	= [ mat4x2(3.0, 2.0, -1.0, 3.0, 2.0, -4.0, 7.0, -1.0) | mat4x2(-4.0, 3.0, 4.0, -5.0, 4.0, 5.0, 1.0, -3.0) | mat4x2(6.0, 3.0, 2.0, -5.0, 1.0, -5.0, 5.0, 2.0) ];
		}

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

			mat4x2 func (mat4x2 a)
			{
				return -2.0*a;
			}

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


	case mat4x3
		version 300 es
		values
		{
			input mat4x3 in0	= [ mat4x3(1.0, 3.0, -0.5, -2.0, -3.0, 0.0, -2.5, 2.5, 2.5, -2.5, -1.5, 2.5) | mat4x3(1.0, 2.5, -1.0, -3.0, -1.5, 2.0, -1.5, -1.0, -0.5, -0.5, -0.5, 3.0) | mat4x3(-2.5, -3.5, 3.5, 3.0, 3.5, -0.5, 3.5, 3.0, -2.0, 2.0, 2.5, 1.0) ];
			output mat4x3 out0	= [ mat4x3(-2.0, -6.0, 1.0, 4.0, 6.0, -0.0, 5.0, -5.0, -5.0, 5.0, 3.0, -5.0) | mat4x3(-2.0, -5.0, 2.0, 6.0, 3.0, -4.0, 3.0, 2.0, 1.0, 1.0, 1.0, -6.0) | mat4x3(5.0, 7.0, -7.0, -6.0, -7.0, 1.0, -7.0, -6.0, 4.0, -4.0, -5.0, -2.0) ];
		}

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

			mat4x3 func (mat4x3 a)
			{
				return -2.0*a;
			}

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


	case mat4
		version 300 es
		values
		{
			input mat4 in0	= [ mat4(0.0, -1.5, -1.0, -2.0, -3.0, 0.5, -1.5, 2.5, -3.5, 3.0, 1.5, 3.0, 3.0, 3.0, 0.5, -3.5) | mat4(2.0, -2.5, -1.5, 1.0, 0.0, -0.5, 3.5, 1.0, -1.0, -2.0, 2.5, 0.0, 2.0, -1.0, -2.5, 0.5) | mat4(2.5, -2.5, 2.0, 3.0, 2.5, 2.5, -3.5, 1.0, 2.5, -3.5, -1.5, -1.5, 0.0, -0.5, 0.0, 2.0) ];
			output mat4 out0	= [ mat4(-0.0, 3.0, 2.0, 4.0, 6.0, -1.0, 3.0, -5.0, 7.0, -6.0, -3.0, -6.0, -6.0, -6.0, -1.0, 7.0) | mat4(-4.0, 5.0, 3.0, -2.0, -0.0, 1.0, -7.0, -2.0, 2.0, 4.0, -5.0, -0.0, -4.0, 2.0, 5.0, -1.0) | mat4(-5.0, 5.0, -4.0, -6.0, -5.0, -5.0, 7.0, -2.0, -5.0, 7.0, 3.0, 3.0, -0.0, 1.0, -0.0, -4.0) ];
		}

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

			mat4 func (mat4 a)
			{
				return -2.0*a;
			}

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

	case float_struct
		version 300 es
		values
		{
			input vec3 in0		= [ vec3(0.0, 1.0, -2.0) | vec3(2.0, 2.5, -4.0) ];
			output float out0	= [ 1.0 | -0.5 ];
		}

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

			struct Pos { float a, b, c; };

			float func (Pos p)
			{
				return -(p.a + p.b + p.c);
			}

			void main()
			{
				Pos p = Pos(in0.x, in0.y, in0.z);
				out0 = func(p);
				${OUTPUT}
			}
		""
	end

	case struct_struct
		version 300 es
		values
		{
			input vec3 in0		= [ vec3(0.0, 1.0, -2.0) | vec3(2.0, 2.5, -4.0) ];
			output float out0	= [ 1.0 | -0.5 ];
		}

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

			struct Pos { float a, b, c; };

			Pos func (Pos p)
			{
				return Pos(-p.a, -p.b, -p.c);
			}

			void main()
			{
				Pos p = Pos(in0.x, in0.y, in0.z);
				p = func(p);
				out0 = p.a + p.b + p.c;
				${OUTPUT}
			}
		""
	end

	case struct_nested_struct
		version 300 es
		values
		{
			input vec3 in0		= [ vec3(0.0, 1.0, -2.0) | vec3(2.0, 2.5, -4.0) ];
			output float out0	= [ 1.0 | -0.5 ];
		}

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

			struct Pos { float a, b, c; };
			struct Line { Pos start, end; };

			Line func (Pos p)
			{
				return Line(p, Pos(-p.a, -p.b, -p.c));
			}

			float sum (Pos p)
			{
				return (p.a + p.b + p.c);
			}

			void main()
			{
				Pos p = Pos(in0.x, in0.y, in0.z);
				Line line = func(p);
				out0 = sum(line.start) + (2.0 * sum(line.end));
				${OUTPUT}
			}
		""
	end

	case struct_constructor_highp_in_fragment
		version 300 es
		desc "passing highp vector to struct constructor in fragment shader yields all zeros"
		vertex ""
			#version 300 es
			${VERTEX_DECLARATIONS}
			void main()
			{
				${VERTEX_OUTPUT}
			}
		""
		fragment ""
			#version 300 es
			${FRAGMENT_DECLARATIONS}
			#ifdef GL_FRAGMENT_PRECISION_HIGH
			#define PRECISION highp
			#else
			#define PRECISION mediump
			#endif
			struct Test {
				PRECISION vec3 color;
			} ;
			void main() {
				PRECISION vec3 color = vec3(0.2, 2.0, 0.1);
				Test test = Test(color);
				// Bias the color so all components are guaranteed > 1.0.
				${FRAG_COLOR} = vec4(vec3(0.25, 0.55, 0.65) + vec3(4.0, 0.25, 4.0) * test.color, 1.0);
			}
		""
	end


end # datatypes

group qualifiers "Function Parameter Qualifiers"

	case in_float
		version 300 es
		values
		{
			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
		}

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

			float func (in float a)
			{
				a = -a;
				return 2.0 * a;
			}

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

	case out_float
		version 300 es
		values
		{
			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
		}

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

			void func (out float a)
			{
				a = -1.0;
			}

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

	case inout_float
		version 300 es
		values
		{
			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
		}

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

			void func (inout float a)
			{
				a = -a;
			}

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

	case in_lowp_float
		version 300 es
		values
		{
			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
		}

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

			float func (in lowp float a)
			{
				a = -a;
				return 2.0 * a;
			}

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

	case out_lowp_float
		version 300 es
		values
		{
			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
		}

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

			void func (out lowp float a)
			{
				a = -1.0;
			}

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

	case inout_lowp_float
		version 300 es
		values
		{
			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
		}

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

			void func (inout lowp float a)
			{
				a = -a;
			}

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

	case in_highp_float
		version 300 es
		values
		{
			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
		}

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

			float func (in highp float a)
			{
				a = -a;
				return 2.0 * a;
			}

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

	case out_highp_float
		version 300 es
		values
		{
			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
		}

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

			void func (out highp float a)
			{
				a = -1.0;
			}

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

	case inout_highp_float
		version 300 es
		values
		{
			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
		}

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

			void func (inout highp float a)
			{
				a = -a;
			}

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

	case const_float
		version 300 es
		values
		{
			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
		}

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

			float func (const float a)
			{
				float b = -a;
				return 2.0 * b;
			}

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

	case const_in_float
		version 300 es
		values
		{
			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
		}

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

			float func (const in float a)
			{
				float b = -a;
				return 2.0 * b;
			}

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

	case in_int
		version 300 es
		values
		{
			input int in0		= [ 0 | 1 | -2 | 4 ];
			output int out0		= [ 0 | -1 | 2 | -4 ];
		}

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

			int func (in int a)
			{
				a = -a;
				return 2 * a;
			}

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

	case out_int
		version 300 es
		values
		{
			input int in0		= [ 0 | 1 | -2 | 6 ];
			output int out0		= [ 0 | -1 | 2 | -6 ];
		}

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

			void func (out int a)
			{
				a = -1;
			}

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

	case inout_int
		version 300 es
		values
		{
			input int in0		= [ 0 | 1 | -2 | 6 ];
			output int out0		= [ 0 | -1 | 2 | -6 ];
		}

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

			void func (inout int a)
			{
				a = -a;
			}

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

	case in_lowp_int
		version 300 es
		values
		{
			input int in0		= [ 0 | 1 | -2 | 4 ];
			output int out0		= [ 0 | -1 | 2 | -4 ];
		}

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

			int func (in lowp int a)
			{
				a = -a;
				return 2 * a;
			}

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

	case out_lowp_int
		version 300 es
		values
		{
			input int in0		= [ 0 | 1 | -2 | 6 ];
			output int out0		= [ 0 | -1 | 2 | -6 ];
		}

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

			void func (out lowp int a)
			{
				a = -1;
			}

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

	case inout_lowp_int
		version 300 es
		values
		{
			input int in0		= [ 0 | 1 | -2 | 6 ];
			output int out0		= [ 0 | -1 | 2 | -6 ];
		}

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

			void func (inout lowp int a)
			{
				a = -a;
			}

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

	case in_highp_int
		version 300 es
		values
		{
			input int in0		= [ 0 | 1 | -2 | 4 ];
			output int out0		= [ 0 | -1 | 2 | -4 ];
		}

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

			int func (in highp int a)
			{
				a = -a;
				return 2 * a;
			}

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

	case out_highp_int
		version 300 es
		values
		{
			input int in0		= [ 0 | 1 | -2 | 6 ];
			output int out0		= [ 0 | -1 | 2 | -6 ];
		}

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

			void func (out highp int a)
			{
				a = -1;
			}

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

	case inout_highp_int
		version 300 es
		values
		{
			input int in0		= [ 0 | 1 | -2 | 6 ];
			output int out0		= [ 0 | -1 | 2 | -6 ];
		}

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

			void func (inout highp int a)
			{
				a = -a;
			}

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

	case const_int
		version 300 es
		values
		{
			input int in0		= [ 0 | 1 | -2 | 4 ];
			output int out0		= [ 0 | -1 | 2 | -4 ];
		}

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

			int func (const int a)
			{
				int b = -a;
				return 2 * b;
			}

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

	case const_in_int
		version 300 es
		values
		{
			input int in0		= [ 0 | 1 | -2 | 4 ];
			output int out0		= [ 0 | -1 | 2 | -4 ];
		}

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

			int func (const in int a)
			{
				int b = -a;
				return 2 * b;
			}

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

	case in_bool
		version 300 es
		values
		{
			input bool in0		= [ true | false ];
			output bool out0	= [ true | true ];
		}

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

			bool func (in bool a)
			{
				a = !a;
				return a;
			}

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

	case out_bool
		version 300 es
		values
		{
			input bool in0		= [ true | false ];
			output bool out0	= [ false | true ];
		}

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

			void func (out bool a)
			{
				a = false;
			}

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

	case inout_bool
		version 300 es
		values
		{
			input bool in0		= [ true | false ];
			output bool out0	= [ false | true ];
		}

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

			void func (inout bool a)
			{
				a = !a;
			}

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

	case const_bool
		version 300 es
		values
		{
			input bool in0		= [ true | false ];
			output bool out0	= [ true | true ];
		}

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

			bool func (const bool a)
			{
				bool b = !a;
				return b;
			}

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

end # qualifiers

group declarations "Function Declarations"

	case basic
		version 300 es
		values
		{
			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
		}

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

			float func (void);

			float func (void)
			{
				return -1.0;
			}

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

	case basic_arg
		version 300 es
		values
		{
			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
		}

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

			float func (float f);

			float func (float f)
			{
				return -f;
			}

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

	case define_after_use
		version 300 es
		values
		{
			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
		}

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

			float func (void);

			void main()
			{
				out0 = func() * in0;
				${OUTPUT}
			}

			float func (void)
			{
				return -1.0;
			}
		""
	end

	case double_declare
		version 300 es
		values
		{
			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
		}

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

			float func (void);

			float func (void);

			float func (void)
			{
				return -1.0;
			}

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

	case declare_after_define
		version 300 es
		values
		{
			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
		}

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

			float func (void)
			{
				return -1.0;
			}

			float func (void);

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

	case void_vs_no_void
		version 300 es
		values
		{
			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
		}

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

			float func ();

			void main()
			{
				out0 = func() * in0;
				${OUTPUT}
			}

			float func (void)
			{
				return -1.0;
			}
		""
	end

	case in_vs_no_in
		version 300 es
		values
		{
			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
		}

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

			float func (float f);

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

			float func (in float f)
			{
				return -f;
			}
		""
	end

	case default_vs_explicit_precision
		version 300 es
		values
		{
			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
		}

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

			float func (float f);

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

			float func (mediump float f)
			{
				return -f;
			}
		""
	end


end # declarations

group overloading "Function Overloading"

	case user_func_arg_type_simple
		version 300 es
		values
		{
			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
		}

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

			float func (float a)
			{
				return -a;
			}

			int func (int a)
			{
				return -a;
			}

			void main()
			{
				out0 = func(in0) * float(func(-1));
				${OUTPUT}
			}
		""
	end

	case user_func_arg_float_types
		version 300 es
		values
		{
			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
		}

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

			float func (float a) { return -a; }
			vec2 func (vec2 a) { return a.yx; }
			vec3 func (vec3 a) { return a.xxx; }
			vec4 func (vec4 a) { return a.wwww; }

			void main()
			{
				out0 = func(func(func(func(vec4(in0)).xyz).xy).x);
				${OUTPUT}
			}
		""
	end

	case user_func_arg_int_types
		version 300 es
		values
		{
			input int in0		= [ 0 | 1 | -2 | 6 ];
			output int out0		= [ 0 | -1 | 2 | -6 ];
		}

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

			int func (int a) { return -a; }
			ivec2 func (ivec2 a) { return a.yx; }
			ivec3 func (ivec3 a) { return a.xxx; }
			ivec4 func (ivec4 a) { return a.wwww; }

			void main()
			{
				${SETUP}
				out0 = func(func(func(func(ivec4(in0)).xyz).xy).x);
				${OUTPUT}
			}
		""
	end

	case user_func_arg_bool_types
		version 300 es
		values
		{
			input bool in0		= [ true | false ];
			output bool out0	= [ false | true ];
		}

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

			bool func (bool a) { return !a; }
			bvec2 func (bvec2 a) { return a.yx; }
			bvec3 func (bvec3 a) { return a.xxx; }
			bvec4 func (bvec4 a) { return a.wwww; }

			void main()
			{
				${SETUP}
				out0 = func(func(func(func(bvec4(in0)).xyz).xy).x);
				${OUTPUT}
			}
		""
	end

	case user_func_arg_basic_types
		version 300 es
		values
		{
			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
		}

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

			float func (float a) { return -a; }
			vec2 func (vec2 a) { return a.yx; }
			vec3 func (vec3 a) { return a.xxx; }
			vec4 func (vec4 a) { return a.wwww; }
			int func (int a) { return -a; }
			ivec2 func (ivec2 a) { return a.yx; }
			ivec3 func (ivec3 a) { return a.xxx; }
			ivec4 func (ivec4 a) { return a.wwww; }
			bool func (bool a) { return !a; }
			bvec2 func (bvec2 a) { return a.yx; }
			bvec3 func (bvec3 a) { return a.xxx; }
			bvec4 func (bvec4 a) { return a.wwww; }

			void main()
			{
				${SETUP}
				if (func(func(bvec4(false)).x))
					out0 = func(in0) * float(func(-1));
				else
					out0 = float(func(func(ivec4(func(func(func(vec4(0.5)).xyz).xy).xxxx)).xy).x);
				${OUTPUT}
			}
		""
	end

	case user_func_arg_complex_types
		version 300 es
		values
		{
			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
		}

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

			struct Pos { float a, b, c; };
			struct Line { Pos start, end; };

			float func (float a) { return -a; }
			float func (float a[4]) { return a[0] + a[3]; }
			vec2 func (vec2 a) { return a.yx; }
			vec3 func (vec3 a) { return a.xxx; }
			vec4 func (vec4 a) { return a.wwww; }
			vec4 func (vec4 a[4]) { return a[1] + a[2]; }
			int func (int a) { return -a; }
			ivec2 func (ivec2 a) { return a.yx; }
			ivec3 func (ivec3 a) { return a.xxx; }
			ivec4 func (ivec4 a) { return a.wwww; }
			bool func (bool a) { return !a; }
			bvec2 func (bvec2 a) { return a.yx; }
			bvec3 func (bvec3 a) { return a.xxx; }
			bvec4 func (bvec4 a) { return a.wwww; }
			Pos func (Pos a) { return a; }
			Line func (Line a) { return Line(a.end, a.start); }

			void main()
			{
				${SETUP}
				float arr[4];
				vec4 arr2[4];
				out0 = func(arr) + func(arr2).x;
				if (func(func(bvec4(false)).x))
					out0 = func(in0) * float(func(-1));
				else
					out0 = float(func(func(ivec4(func(func(func(vec4(0.5)).xyz).xy).xxxx)).xy).x);
				${OUTPUT}
			}
		""
	end

	case user_func_arguments
		version 300 es
		values
		{
			input float in0		= [ 0.0 | 1.0 | -2.0 | 2.5 ];
			output float out0	= [ 0.0 | -1.0 | 2.0 | -2.5 ];
		}

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

			float func (float a)
			{
				return -a;
			}

			float func (float a, float b)
			{
				return a * b;
			}

			void main()
			{
				out0 = func(in0) * func(-0.5, -2.0);
				${OUTPUT}
			}
		""
	end

	case array_size
		version 300 es
		values
		{
			output float out0	= [ 1.0 ];
		}

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

			float func (float f[3])
			{
				return f[0];
			}

			float func (float f[4])
			{
				return f[1];
			}

			void main ()
			{
				${SETUP}
				float[4] x = float[4] (-1.0, 1.0, 0.0, 0.0);
				out0 = func(x);
				${OUTPUT}
			}
		""
	end

end # overloading

group array_arguments "Arrays as Arguments"

	case local_in_float
		version 300 es
		values
		{
			input vec4 in0		= [ vec4(0.0, 1.0, 2.0, -4.0) | vec4(-7.5, 12.125, -0.25, 16.0) ];
			output vec4 out0	= [ vec4(0.0, -1.0, -2.0, 4.0) | vec4(7.5, -12.125, 0.25, -16.0) ];
		}

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

			float func (in float a[4])
			{
				a[0] = -1.0;
				a[2] = -4.0;
				a[3] = -3.0 * a[1];
				return a[0];
			}

			void main()
			{
				float arr[4];
				arr[0] = in0.x;
				arr[1] = in0.y;
				arr[2] = in0.z;
				arr[3] = in0.w;
				float f = func(arr);
				out0 = f * vec4(arr[0], arr[1], arr[2], arr[3]);
				${OUTPUT}
			}
		""
	end

	case global_in_float
		version 300 es
		values
		{
			input vec4 in0		= [ vec4(0.0, 1.0, 2.0, -4.0) | vec4(-7.5, 12.125, -0.25, 16.0) ];
			output vec4 out0	= [ vec4(0.0, -1.0, -2.0, 4.0) | vec4(7.5, -12.125, 0.25, -16.0) ];
		}

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

			float func (in float a[4])
			{
				a[0] = -1.0;
				a[2] = -4.0;
				a[3] = -3.0 * a[1];
				return a[0];
			}

			float arr[4];

			void main()
			{
				arr[0] = in0.x;
				arr[1] = in0.y;
				arr[2] = in0.z;
				arr[3] = in0.w;
				float f = func(arr);
				out0 = f * vec4(arr[0], arr[1], arr[2], arr[3]);
				${OUTPUT}
			}
		""
	end

	case local_in_int
		version 300 es
		values
		{
			input ivec4 in0		= [ ivec4(0, 1, 2, -4) | ivec4(-7, -11, 13, 19) ];
			output ivec4 out0	= [ ivec4(0, -1, -2, 4) | ivec4(7, 11, -13, -19) ];
		}

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

			int func (in int a[4])
			{
				a[0] = -1;
				a[2] = -4;
				a[3] = -3 * a[1];
				return a[0];
			}

			void main()
			{
				${SETUP}
				int arr[4];
				arr[0] = in0.x;
				arr[1] = in0.y;
				arr[2] = in0.z;
				arr[3] = in0.w;
				int f = func(arr);
				out0 = f * ivec4(arr[0], arr[1], arr[2], arr[3]);
				${OUTPUT}
			}
		""
	end

	case global_in_int
		version 300 es
		values
		{
			input ivec4 in0		= [ ivec4(0, 1, 2, 4) | ivec4(-7, -11, 13, 19) ];
			output ivec4 out0	= [ ivec4(0, -1, -2, -4) | ivec4(7, 11, -13, -19) ];
		}

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

			int func (in int a[4])
			{
				a[0] = -1;
				a[2] = -4;
				a[3] = -3 * a[1];
				return a[0];
			}

			int arr[4];

			void main()
			{
				${SETUP}
				arr[0] = in0.x;
				arr[1] = in0.y;
				arr[2] = in0.z;
				arr[3] = in0.w;
				int f = func(arr);
				out0 = f * ivec4(arr[0], arr[1], arr[2], arr[3]);
				${OUTPUT}
			}

		""
	end

	case local_in_bool
		version 300 es
		values
		{
			input bvec4 in0		= [ bvec4(true, true, false, true) | bvec4(false, false, false, false) ];
			output bvec4 out0	= [ bvec4(false, false, true, false) | bvec4(true, true, true, true) ];
		}

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

			bool func (in bool a[4])
			{
				a[0] = false;
				a[2] = true;
				a[3] = !a[1];
				return a[0];
			}

			void main()
			{
				${SETUP}
				bool arr[4];
				arr[0] = !in0.x;
				arr[1] = !in0.y;
				arr[2] = !in0.z;
				arr[3] = !in0.w;
				func(arr);
				out0 = bvec4(arr[0], arr[1], arr[2], arr[3]);
				${OUTPUT}
			}
		""
	end

	case global_in_bool
		version 300 es
		values
		{
			input bvec4 in0		= [ bvec4(true, true, false, true) | bvec4(false, false, false, false) ];
			output bvec4 out0	= [ bvec4(false, false, true, false) | bvec4(true, true, true, true) ];
		}

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

			bool func (in bool a[4])
			{
				a[0] = false;
				a[2] = true;
				a[3] = !a[1];
				return a[0];
			}

			bool arr[4];

			void main()
			{
				${SETUP}
				arr[0] = !in0.x;
				arr[1] = !in0.y;
				arr[2] = !in0.z;
				arr[3] = !in0.w;
				func(arr);
				out0 = bvec4(arr[0], arr[1], arr[2], arr[3]);
				${OUTPUT}
			}
		""
	end

	case test_helpers
		version 300 es
		desc "Check that helper functions are supported properly."
		values
		{
			input vec4 in0		= [ vec4(0.0, 1.0, 2.0, -4.0) | vec4(-7.5, 12.125, -0.25, 16.0) ];
			output float out0	= [ 1.0 | 1.0 ];
		}

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

			vec4 get (in float arr[4]);
			void set (out float arr[4], vec4 val);
			void negate (inout float arr[4]);
			bool test (in float arr[4], vec4 ref);
			bool isEqual (in float a[4], in float b[4]);

			void main()
			{
				float arr[4];
				set(arr, in0);
				negate(arr);
				out0 = float(test(arr, -in0));
				${OUTPUT}
			}

			float absDiff (vec4 a, vec4 b) { vec4 d = abs(a - b); return max(max(d.x, d.y), max(d.z, d.w)); }
			vec4 get (in float arr[4]) { return vec4(arr[0], arr[1], arr[2], arr[3]); }
			void set (out float arr[4], vec4 val) { arr[0] = val.x; arr[1] = val.y; arr[2] = val.z; arr[3] = val.w; }
			void negate (inout float arr[4]) { set(arr, -get(arr)); }
			bool test (in float arr[4], vec4 ref) { return (absDiff(get(arr), ref) < 0.1); }
			bool isEqual (in float a[4], in float b[4]) { return (absDiff(get(a), get(b)) < 0.1); }
		""
	end

	case copy_local_in_on_call
		version 300 es
		desc "Check that local 'in' arguments are copied on call and don't alias."
		values
		{
			input vec4 in0		= [ vec4(0.0, 1.0, 2.0, -4.0) | vec4(-7.5, 12.125, -0.25, 16.0) ];
			output vec4 out0	= [ vec4(0.0, -1.0, -2.0, 4.0) | vec4(7.5, -12.125, 0.25, -16.0) ];
		}

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

			vec4 get (in float arr[4]);
			void set (out float arr[4], vec4 val);
			void negate (inout float arr[4]);
			bool test (in float arr[4], vec4 ref);
			bool isEqual (in float a[4], in float b[4]);

			float func (in float a[4], in float b[4])
			{
				a[0] = 2.123;
				a[2] = -4.123;
				return isEqual(a, b) ? 1.0 : -1.0;
			}

			void main()
			{
				float arr[4];
				set(arr, in0);
				out0 = in0 * func(arr, arr);
				${OUTPUT}
			}

			float absDiff (vec4 a, vec4 b) { vec4 d = abs(a - b); return max(max(d.x, d.y), max(d.z, d.w)); }
			vec4 get (in float arr[4]) { return vec4(arr[0], arr[1], arr[2], arr[3]); }
			void set (out float arr[4], vec4 val) { arr[0] = val.x; arr[1] = val.y; arr[2] = val.z; arr[3] = val.w; }
			void negate (inout float arr[4]) { set(arr, -get(arr)); }
			bool test (in float arr[4], vec4 ref) { return (absDiff(get(arr), ref) < 0.1); }
			bool isEqual (in float a[4], in float b[4]) { return (absDiff(get(a), get(b)) < 0.1); }
		""
	end

	case copy_global_in_on_call
		version 300 es
		desc "Check that global 'in' arguments are copied on call and don't alias."
		values
		{
			input vec4 in0		= [ vec4(0.0, 1.0, 2.0, -4.0) | vec4(-7.5, 12.125, -0.25, 16.0) ];
			output vec4 out0	= [ vec4(0.0, -1.0, -2.0, 4.0) | vec4(7.5, -12.125, 0.25, -16.0) ];
		}

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

			vec4 get (in float arr[4]);
			void set (out float arr[4], vec4 val);
			void negate (inout float arr[4]);
			bool test (in float arr[4], vec4 ref);
			bool isEqual (in float a[4], in float b[4]);

			float func (in float a[4], in float b[4])
			{
				a[0] = 2.123;
				a[2] = -4.123;
				return isEqual(a, b) ? 1.0 : -1.0;
			}

			float arr[4];

			void main()
			{
				set(arr, in0);
				out0 = in0 * func(arr, arr);
				${OUTPUT}
			}

			float absDiff (vec4 a, vec4 b) { vec4 d = abs(a - b); return max(max(d.x, d.y), max(d.z, d.w)); }
			vec4 get (in float arr[4]) { return vec4(arr[0], arr[1], arr[2], arr[3]); }
			void set (out float arr[4], vec4 val) { arr[0] = val.x; arr[1] = val.y; arr[2] = val.z; arr[3] = val.w; }
			void negate (inout float arr[4]) { set(arr, -get(arr)); }
			bool test (in float arr[4], vec4 ref) { return (absDiff(get(arr), ref) < 0.1); }
			bool isEqual (in float a[4], in float b[4]) { return (absDiff(get(a), get(b)) < 0.1); }
		""
	end

	case copy_local_inout_on_call
		version 300 es
		desc "Check that local 'in' arguments are copied on call and don't alias."
		values
		{
			input vec4 in0		= [ vec4(0.0, 1.0, 2.0, -4.0) | vec4(-7.5, 12.125, -0.25, 16.0) ];
			output vec4 out0	= [ vec4(0.0, -1.0, -2.0, 4.0) | vec4(7.5, -12.125, 0.25, -16.0) ];
		}

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

			vec4 get (in float arr[4]);
			void set (out float arr[4], vec4 val);
			void negate (inout float arr[4]);
			bool test (in float arr[4], vec4 ref);
			bool isEqual (in float a[4], in float b[4]);

			float func (inout float a[4], inout float b[4])
			{
				negate(a);
				return isEqual(a, b) ? 1.0 : -1.0;
			}

			void main()
			{
				float arr[4];
				set(arr, in0);
				float m = func(arr, arr); // returns -1.0
				float n = float(test(arr, in0) || test(arr, -in0));
				out0 = in0 * m * n;
				${OUTPUT}
			}

			float absDiff (vec4 a, vec4 b) { vec4 d = abs(a - b); return max(max(d.x, d.y), max(d.z, d.w)); }
			vec4 get (in float arr[4]) { return vec4(arr[0], arr[1], arr[2], arr[3]); }
			void set (out float arr[4], vec4 val) { arr[0] = val.x; arr[1] = val.y; arr[2] = val.z; arr[3] = val.w; }
			void negate (inout float arr[4]) { set(arr, -get(arr)); }
			bool test (in float arr[4], vec4 ref) { return (absDiff(get(arr), ref) < 0.1); }
			bool isEqual (in float a[4], in float b[4]) { return (absDiff(get(a), get(b)) < 0.1); }
		""
	end

	case copy_global_inout_on_call
		version 300 es
		desc "Check that global 'in' arguments are copied on call and don't alias."
		values
		{
			input vec4 in0		= [ vec4(0.0, 1.0, 2.0, -4.0) | vec4(-7.5, 12.125, -0.25, 16.0) ];
			output vec4 out0	= [ vec4(0.0, -1.0, -2.0, 4.0) | vec4(7.5, -12.125, 0.25, -16.0) ];
		}

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

			vec4 get (in float arr[4]);
			void set (out float arr[4], vec4 val);
			void negate (inout float arr[4]);
			bool test (in float arr[4], vec4 ref);
			bool isEqual (in float a[4], in float b[4]);

			float func (in float a[4], in float b[4])
			{
				negate(a);
				return isEqual(a, b) ? 1.0 : -1.0;
			}

			float arr[4];

			void main()
			{
				set(arr, in0);
				float m = func(arr, arr); // returns -1.0
				float n = float(test(arr, in0) || test(arr, -in0));
				out0 = in0 * m * n;
				${OUTPUT}
			}

			float absDiff (vec4 a, vec4 b) { vec4 d = abs(a - b); return max(max(d.x, d.y), max(d.z, d.w)); }
			vec4 get (in float arr[4]) { return vec4(arr[0], arr[1], arr[2], arr[3]); }
			void set (out float arr[4], vec4 val) { arr[0] = val.x; arr[1] = val.y; arr[2] = val.z; arr[3] = val.w; }
			void negate (inout float arr[4]) { set(arr, -get(arr)); }
			bool test (in float arr[4], vec4 ref) { return (absDiff(get(arr), ref) < 0.1); }
			bool isEqual (in float a[4], in float b[4]) { return (absDiff(get(a), get(b)) < 0.1); }
		""
	end

#			vec4 get (in float arr[4]);
#			void set (out float arr[4], vec4 val);
#			void negate (inout float arr[4]);
#			bool test (in float arr[4], vec4 ref);
#			bool isEqual (in float a[4], in float b[4]);

#			float absDiff (vec4 a, vec4 b) { vec4 d = abs(a - b); return max(max(d.x, d.y), max(d.z, d.w)); }
#			vec4 get (in float arr[4]) { return vec4(arr[0], arr[1], arr[2], arr[3]); }
#			void set (out float arr[4], vec4 val) { arr[0] = val.x; arr[1] = val.y; arr[2] = val.z; arr[3] = val.w; }
#			void negate (inout float arr[4]) { set(arr, -get(arr)); }
#			bool test (in float arr[4], vec4 ref) { return (absDiff(get(arr), ref) < 0.1); }
#			bool isEqual (in float a[4], in float b[4]) { return (absDiff(get(a), get(b)) < 0.1); }

end # array_arguments

#group qualifiers "Function Parameter Qualifiers"
#
#end # qualifiers

group control_flow "Control Flow In Functions"

	case simple_return
		version 300 es
		values
		{
			input float in0		= [ -0.5 | 1.5 ];
			output float out0	= [ 0.5 | -1.5 ];
		}

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

			float func (float a)
			{
				return -a;
				a = a * -1.0;
				return 1.0;
			}

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

	case return_in_if
		version 300 es
		values
		{
			input float in0		= [ -0.5 | 1.5 ];
			output float out0	= [ 0.5 | -1.5 ];
		}

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

			float func (float a)
			{
				if (a != 0.0)
					return -a;
				return 1.0;
			}

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

	case return_in_else
		version 300 es
		values
		{
			input float in0		= [ -0.5 | 1.5 ];
			output float out0	= [ 0.5 | -1.5 ];
		}

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

			float func (float a)
			{
				if (a == 0.0)
					return 1.0;
				else
					return -a;
				return 1.0;
			}

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

	case return_in_loop
		version 300 es
		values
		{
			input float in0		= [ -0.5 | 1.5 ];
			output float out0	= [ 0.5 | -1.5 ];
		}

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

			float func (float a)
			{
				while (a < 100.0)
					return -a;
				return 1.0;
			}

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

	case return_in_loop_if
		version 300 es
		values
		{
			input float in0		= [ -0.5 | 1.5 ];
			output float out0	= [ 0.5 | -1.5 ];
		}

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

			float func (float a)
			{
				while (a < 100.0)
				{
					a = -a;
					if (a != 0.0)
						return a;
					else
						return -1.0;
				}
				return 1.0;
			}

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

	case return_after_loop
		version 300 es
		values
		{
			input float in0		= [ -0.5 | 1.5 ];
			output float out0	= [ 0.5 | -1.5 ];
		}

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

			float func (float a)
			{
				for (int i = 0; i < 5; i++)
					a = -a;
				return a;
			}

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

	case return_after_break
		version 300 es
		values
		{
			input float in0		= [ -0.5 | 1.5 ];
			output float out0	= [ 0.5 | -1.5 ];
		}

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

			float func (float a)
			{
				for (int i = 0; i < 6; i++)
				{
					a = -a;
					if (i == 4)
						break;
				}
				return a;
			}

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

	case return_after_continue
		version 300 es
		values
		{
			input float in0		= [ -0.5 | 1.5 ];
			output float out0	= [ 0.5 | -1.5 ];
		}

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

			float func (float a)
			{
				for (int i = 0; i < 6; i++)
				{
					if (i == 4)
						continue;
					a = -a;
				}
				return a;
			}

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

	case return_in_nested_loop
		version 300 es
		values
		{
			input float in0		= [ -0.5 | 1.5 ];
			output float out0	= [ 0.5 | -1.5 ];
		}

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

			float func (float a)
			{
				for (int i = 0; i < 6; i++)
				{
					a = -a;
					for (int j = 0; j < 4; j++)
					{
						a = -a;
						if (i == 1)
							return a;
					}
					if (i == 4)
						return 1.0;
				}
				return 1.0;
			}

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

	case return_after_loop_sequence
		version 300 es
		values
		{
			input float in0		= [ -0.5 | 1.5 ];
			output float out0	= [ 0.5 | -1.5 ];
		}

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

			float func (float a)
			{
				int i;
				for (i = 0; i < 6; i++) // negate a
				{
					a = -a;
					if (i == 4)
						a = -a;
				}

				for (; i < 10; i++) // keep a
				{
					if (i == 8)
						continue;
					else if (i == 9)
						break;
					a = -a;
				}

				return a;
			}

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

	case mixed_return_break_continue
		version 300 es
		values
		{
			input float in0		= [ -0.5 | 1.5 ];
			output float out0	= [ 0.5 | -1.5 ];
		}

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

			float func (float a)
			{
				int i;
				for (i = 0; i < 6; i++)
				{
					if (i == 0)
						continue;
					else if (i == 1)
					{
					}
					else if (i == 3)
						break;
					else
						return a;
					a = -a;
				}

				return 1.0;
			}

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

end # control_flow

group misc "Miscellaneous"

	case multi_arg_float
		version 300 es
		values
		{
			input vec4 in0		= [ vec4(0.0, 1.0, -2.0, 0.5) | vec4(2.0, 2.5, 4.0, -7.0) ];
			output float out0	= [ 0.5 | -1.5 ]; # -sum(in0)
		}

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

			float sum(vec4 v) { return (v.x + v.y + v.z + v.w); }

			float func (float a, vec3 b, vec2 c, vec2 d, vec4 e)
			{
				return -sum(vec4(a, b) + vec4(c, d)) + sum(e);
			}

			void main()
			{
				${SETUP}
				out0 = func(in0.y, in0.xzw, in0.wz, in0.yx, in0);
				${OUTPUT}
			}
		""
	end

	case multi_arg_int
		version 300 es
		values
		{
			input ivec4 in0		= [ ivec4(-1, 0, 2, 2) | ivec4(1, 4, -8, 2) ];
			output int out0		= [ -3 | 1 ];
		}

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

			int sum(ivec4 v) { return (v.x + v.y + v.z + v.w); }

			int func (int a, ivec3 b, ivec2 c, ivec2 d, ivec4 e)
			{
				return -sum(ivec4(a, b) + ivec4(c, d)) + sum(e);
			}

			void main()
			{
				${SETUP}
				out0 = func(in0.y, in0.xzw, in0.wz, in0.yx, in0);
				${OUTPUT}
			}
		""
	end

	case argument_eval_order_1
		version 300 es
		values
		{
			input int in0	= [  0 | 1 | 3 | 5 ];
			output int out0	= [ -1 | 5 | 11 | 17 ];
		}

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

			int func (float a, int b, bool c, int d)
			{
				if (c)
					return b + int(a) + d;
				else
					return -1;
			}

			void main ()
			{
				${SETUP}
				float v0 = float(in0);
				int v1 = in0;
				out0 = func((v0 += 1.0), v1++, (v0 > 1.5), v1);
				${OUTPUT}
			}
		""
	end

	case argument_eval_order_2
		version 300 es
		values
		{
			input int in0	= [ 0 | -1 | 3 | 5 ];
			output int out0	= [ 3 | -1 | 9 | 13 ];
		}

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

			int g;

			int modG (int v)
			{
				g += v;
				return v;
			}

			int func (float a, int b, bool c, int d)
			{
				if (c)
					return b + int(a) + d;
				else
					return -1;
			}

			void main ()
			{
				${SETUP}
				out0 = func(float(g = in0), modG(2), --g > 0, g);
				${OUTPUT}
			}
		""
	end

end # misc

group invalid "Invalid Functions"
	case break_in_body
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			precision mediump float;
			${DECLARATIONS}

			void func ()
			{
				break;
			}

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

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

			void func ()
			{
				continue;
			}

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

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

			void func ()
			{
				return 1.0;
			}

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

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

			void func (float f)
			{
			}

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

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

			void func (float f)
			{
			}

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

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

			void func (in f)
			{
			}

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

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

			void func (float f)
			{
			}

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

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

			void func (vec2 f)
			{
			}

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

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

			void func (vec3 f)
			{
			}

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

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

			void func (vec3 f);

			void func (vec3 f)
			{
			}

			void func (vec3 f)
			{
			}

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

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

			void func (vec3 f);

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

			float func (vec3 f)
			{
				return f.x;
			}
		""
	end

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

			void func (vec3 f[]);

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

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

			void func (vec3 f[3]);
			void func (vec3 f[3])
			{
			}

			void main ()
			{
				vec3 array[4];
				func(array);
				${POSITION_FRAG_COLOR} = vec4(1.0);
			}
		""
	end

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

			void func (vec3 f);
			void func (const vec3 f)
			{
			}

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

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

			void func (vec3 f[3]);
			void func (const vec3 f[3])
			{
			}

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

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

			void func (out vec3 f);
			void func (inout vec3 f)
			{
			}

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

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

			func (float f);
			func (inout vec3 f[3])
			{
			}

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

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

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

			void func (float f)
			{
			}

		""
	end

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

			float func (lowp float f)
			{
				return f;
			}

			float func (mediump float f)
			{
				return f;
			}

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

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

			void func (in float f)
			{
			}

			void func (out float f)
			{
				f = 1.0;
			}

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

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

			void func (in float f)
			{
			}

			void func (inout float f)
			{
				f = -f;
			}

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

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

			void func (out float f)
			{
				f = -1.0;
			}

			void func (inout float f)
			{
				f = -f;
			}

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

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

			float func (float f)
			{
				return f;
			}

			int func (float f)
			{
				return int(f);
			}

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

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

			lowp float func (float f)
			{
				return f;
			}

			mediump float func (float f)
			{
				return f;
			}

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

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

			float func (float f)
			{
				return f;
			}

			const float func (float f)
			{
				return f;
			}

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

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

			float func (float f)
			{
				return;
				return 1.0;
			}

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

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

			void main ()
			{
				float func (float f);

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

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

			void main ()
			{
				float func (float f)
				{
					return 1.0;
				}

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

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

			struct foo { float a; }

			float foo (float f)
			{
				return 1.0;
			}

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

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

			void func (vec3 f)
			{
			}

			void func (const vec3 f)
			{
			}

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

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

			void func (vec3 f)
			{
				uniform float u;
			}

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

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

			void func (vec3 f)
			{
				in float v;
			}

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

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

			void func (vec3 f)
			{
				in float a;
			}

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

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

			void func (vec3 f)
			{
				inout float a;
			}

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

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

			void func (uniform vec3 f)
			{
			}

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

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

			uniform float func (vec3 f)
			{
				return f.x;
			}

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

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

			in float func (vec3 f)
			{
				return f.x;
			}

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

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

			out float func (vec3 f)
			{
				return f.x;
			}

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

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

			inout float func (vec3 f)
			{
				return f.x;
			}

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

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

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

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

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

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

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

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

			float func (const float f)
			{
				f = 1.0;
			}

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

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

			float func (const float f[3])
			{
				f[0] = 1.0;
			}

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

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

			float func (const int i)
			{
				const int z = i+1;
				return float(z);
			}

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

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

			float func (const int i)
			{
				float f[i];
				f[0] = 1.0;
				return f[0];
			}

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

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

			int sin (int x)
			{
				return int(sin(float(x)));
			}

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

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

			float sin (float x)
			{
				return 0.0;
			}

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

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

			float fib (float x)
			{
				if (x <= 1.0)
					return x;
				else
					return fib(x-2.0) + fib(x-1.0);
			}

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

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

			float rec (float x)
			{
				if (x <= 0.0)
					return 0.0;
				else
					return rec(x-1.0);
			}

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

	case dynamic_conditional_recursion
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			precision mediump float;
			${DECLARATIONS}
			uniform float ua;
			uniform float ub;

			float funcA (float x);
			float funcB (float x);

			float funcA (float x)
			{
				if (ub+x > 0.0)
					funcB(x*2.0);
				else
					return ub;
			}

			float funcB (float x)
			{
				return sqrt(funcA(x));
			}

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

	case dynamic_loop_recursion
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			precision mediump float;
			${DECLARATIONS}
			uniform float ua;
			uniform float ub;

			float funcA (float x);
			float funcB (float x);

			float funcA (float x)
			{
				for (float z = 0.0; z < ub+x; z++)
				{
					if (z > 2.0)
						funcB(z*2.0);
					else
						return z;
				}
			}

			float funcB (float x)
			{
				return sqrt(funcA(x));
			}

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

	case dynamic_switch_recursion
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			precision mediump float;
			${DECLARATIONS}
			uniform float ua;
			uniform mediump int ub;

			float funcA (float x);
			float funcB (float x);

			float funcA (float x)
			{
				switch (ub + int(x))
				{
					case 0: return ua-1.0;
					case 1: return ua;
					case 2: return funcB(x*2.0);
					default: return 0.0;
				}
			}

			float funcB (float x)
			{
				return sqrt(funcA(x));
			}

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

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

			int func (const int a)
			{
				a = -a;
				return 2 * a;
			}

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

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

			int func (const int a)
			{
				const int b = -a;
				return 2 * b;
			}

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

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

			int func (const int a)
			{
				int arr[a];
				arr[1] = 3;
				return arr[1];
			}

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

end # invalid
