group invalid_declarations "Invalid declarations"
	case in_in_vertex_main
		version 300 es
		expect compile_fail
		vertex ""
			#version 300 es
			${VERTEX_DECLARATIONS}
			void main()
			{
				in mediump float val;
				gl_Position = vec4(1.0);
			}
		""
		fragment ""
			#version 300 es
			${FRAGMENT_DECLARATIONS}
			void main()
			{
				${FRAG_COLOR} = vec4(1.0);
			}
		""
	end

	case out_in_vertex_main
		version 300 es
		expect compile_fail
		vertex ""
			#version 300 es
			${VERTEX_DECLARATIONS}
			void main()
			{
				out mediump float val;
				gl_Position = vec4(1.0);
			}
		""
		fragment ""
			#version 300 es
			in mediump float val;
			${FRAGMENT_DECLARATIONS}
			void main()
			{
				${FRAG_COLOR} = vec4(1.0);
			}
		""
	end

	case in_in_fragment_main
		version 300 es
		expect compile_fail
		vertex ""
			#version 300 es
			out mediump float val;
			${VERTEX_DECLARATIONS}
			void main()
			{
				gl_Position = vec4(1.0);
			}
		""
		fragment ""
			#version 300 es
			${FRAGMENT_DECLARATIONS}
			void main()
			{
				in mediump float val;
				${FRAG_COLOR} = vec4(1.0);
			}
		""
	end

	case out_in_fragment_main
		version 300 es
		expect compile_fail
		vertex ""
			#version 300 es
			${VERTEX_DECLARATIONS}
			void main()
			{
				gl_Position = vec4(1.0);
			}
		""
		fragment ""
			#version 300 es
			${FRAGMENT_DECLARATIONS}
			void main()
			{
				out mediump float val;
				${FRAG_COLOR} = vec4(1.0);
			}
		""
	end

	case uniform_in_vertex_main
		version 300 es
		expect compile_fail
		vertex ""
			#version 300 es
			${VERTEX_DECLARATIONS}
			void main()
			{
				uniform mediump float val;
				gl_Position = vec4(1.0);
			}
		""
		fragment ""
			#version 300 es
			${FRAGMENT_DECLARATIONS}
			void main()
			{
				${FRAG_COLOR} = vec4(1.0);
			}
		""
	end

	case uniform_in_fragment_main
		version 300 es
		expect compile_fail
		vertex ""
			#version 300 es
			${VERTEX_DECLARATIONS}
			void main()
			{
				gl_Position = vec4(1.0);
			}
		""
		fragment ""
			#version 300 es
			${FRAGMENT_DECLARATIONS}
			void main()
			{
				uniform mediump float val;
				${FRAG_COLOR} = vec4(1.0);
			}
		""
	end

	case uniform_block_in_main
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			${DECLARATIONS}
			void main()
			{
				uniform Block { mediump float val; };
				${OUTPUT}
			}
		""
	end

	case invariant_attribute
		version 300 es
		expect compile_fail
		vertex ""
			#version 300 es
			invariant in mediump float val;
			${VERTEX_DECLARATIONS}
			void main()
			{
				gl_Position = vec4(1.0);
			}
		""
		fragment ""
			#version 300 es
			${FRAGMENT_DECLARATIONS}
			void main()
			{
				${FRAG_COLOR} = vec4(1.0);
			}
		""
	end

	case invariant_uniform
		version 300 es
		expect compile_fail
		vertex ""
			#version 300 es
			invariant uniform mediump float val;
			${VERTEX_DECLARATIONS}
			void main()
			{
				gl_Position = vec4(1.0);
			}
		""
		fragment ""
			#version 300 es
			${FRAGMENT_DECLARATIONS}
			void main()
			{
				${FRAG_COLOR} = vec4(1.0);
			}
		""
	end

	case invariant_uniform_block_1
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			invariant uniform Block { mediump float val; };
			${DECLARATIONS}
			void main()
			{
				${OUTPUT}
			}
		""
	end

	case invariant_uniform_block_2
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			uniform Block { invariant mediump float val; };
			${DECLARATIONS}
			void main()
			{
				${OUTPUT}
			}
		""
	end

	case uniform_block_layout_qualifier
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			layout(foobar) uniform Block
			{
				mediump float val;
			};
			${DECLARATIONS}
			void main()
			{
				${OUTPUT}
			}
		""
	end

	case uniform_block_member_layout_qualifier
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			${DECLARATIONS}
			uniform Block
			{
				layout(foobar) uniform mediump float val;
			};
			void main()
			{
				${OUTPUT}
			}
		""
	end

	case uniform_block_nested_struct_definition
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			${DECLARATIONS}
			uniform Block
			{
				struct S
				{
					mediump float v;
					struct T
					{
						highp int i;
					} t;
				} s;
			};
			void main()
			{
				${OUTPUT}
			}
		""
	end

	case nested_uniform_block
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			${DECLARATIONS}
			uniform Block
			{
				uniform Block2
				{
					mediump float v;
				} block2;
			} block;
			void main()
			{
				${OUTPUT}
			}
		""
	end

	case uniform_block_sampler_2d
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			${DECLARATIONS}
			uniform Block
			{
				uniform sampler2D s;
			};
			void main()
			{
				${OUTPUT}
			}
		""
	end

	case uniform_block_sampler_cube
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			${DECLARATIONS}
			uniform Block
			{
				uniform samplerCube s;
			};
			void main()
			{
				${OUTPUT}
			}
		""
	end

	case uniform_block_missing_member_semicolon
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			${DECLARATIONS}
			uniform Block
			{
				mediump float var
			};
			void main()
			{
				${OUTPUT}
			}
		""
	end

	case uniform_block_missing_end_semicolon
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			${DECLARATIONS}
			uniform Block
			{
				mediump float var;
			}
			void main()
			{
				${OUTPUT}
			}
		""
	end

	case uniform_block_duplicate_member_name_1
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			${DECLARATIONS}
			uniform Block
			{
				mediump float var;
				mediump float var;
			};
			void main()
			{
				${OUTPUT}
			}
		""
	end

	case uniform_block_duplicate_member_name_2
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			${DECLARATIONS}
			uniform Block
			{
				mediump float var;
			};
			uniform Block2
			{
				mediump float var;
			};
			void main()
			{
				${OUTPUT}
			}
		""
	end

	case uniform_block_duplicate_member_name_3
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			${DECLARATIONS}
			uniform mediump float var;
			uniform Block
			{
				mediump float var;
			};
			void main()
			{
				${OUTPUT}
			}
		""
	end

	case uniform_block_duplicate_block_name
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			${DECLARATIONS}
			uniform Block
			{
				mediump float var;
			};
			uniform Block
			{
				mediump float var2;
			};
			void main()
			{
				${OUTPUT}
			}
		""
	end

	case uniform_block_duplicate_instance_name_1
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			${DECLARATIONS}
			uniform Block
			{
				mediump float var;
			} block;
			uniform Block2
			{
				mediump float var2;
			} block;
			void main()
			{
				${OUTPUT}
			}
		""
	end

	case uniform_block_duplicate_instance_name_2
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			${DECLARATIONS}
			uniform mediump float block;
			uniform Block
			{
				mediump float var;
			} block;
			void main()
			{
				${OUTPUT}
			}
		""
	end

	case uniform_block_duplicate_instance_name_3
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			${DECLARATIONS}
			uniform Block
			{
				mediump float block;
			};
			uniform Block2
			{
				mediump float var2;
			} block;
			void main()
			{
				${OUTPUT}
			}
		""
	end

	case uniform_block_array_without_instance_name_1
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			${DECLARATIONS}
			uniform Block[2]
			{
				mediump float var;
			};
			void main()
			{
				${OUTPUT}
			}
		""
	end

	case uniform_block_array_without_instance_name_2
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			${DECLARATIONS}
			uniform Block
			{
				mediump float var;
			} [2];
			void main()
			{
				${OUTPUT}
			}
		""
	end

	case uniform_block_in
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			${DECLARATIONS}
			uniform Block
			{
				in mediump float var;
			};
			void main()
			{
				${OUTPUT}
			}
		""
	end

	case uniform_block_out
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			${DECLARATIONS}
			uniform Block
			{
				out mediump float var;
			};
			void main()
			{
				${OUTPUT}
			}
		""
	end

	case uniform_block_const
		version 300 es
		expect compile_fail
		both ""
			#version 300 es
			${DECLARATIONS}
			uniform Block
			{
				const mediump float var;
			};
			void main()
			{
				${OUTPUT}
			}
		""
	end

end # invalid_declarations