blob: 4f195250f36c7fa98165e241c53bfc90e453fc9c [file] [log] [blame]
group valid "Valid scoping and name redeclaration cases"
case local_variable_hides_global_variable
version 300 es
values
{
input int in0 = [ 1 | 2 | 3 ];
output int out0 = [ 1 | 2 | 3 ];
}
both ""
#version 300 es
precision mediump float;
${DECLARATIONS}
int a = -1;
void main()
{
${SETUP}
int a = in0;
out0 = a;
${OUTPUT}
}
""
end
case block_variable_hides_local_variable
version 300 es
values
{
input int in0 = [ 1 | 2 | 3 ];
output int out0 = [ 1 | 2 | 3 ];
}
both ""
#version 300 es
precision mediump float;
${DECLARATIONS}
void main()
{
${SETUP}
int a = in0;
{
int a = -1;
}
out0 = a;
${OUTPUT}
}
""
end
case block_variable_hides_global_variable
version 300 es
values
{
input int in0 = [ 1 | 2 | 3 ];
output int out0 = [ 1 | 2 | 3 ];
}
both ""
#version 300 es
precision mediump float;
${DECLARATIONS}
int a = -1;
void main()
{
${SETUP}
{
int a = in0;
out0 = a;
}
${OUTPUT}
}
""
end
case for_init_statement_variable_hides_local_variable
version 300 es
values
{
input int in0 = [ 1 | 2 | 3 ];
output int out0 = [ 1 | 2 | 3 ];
}
both ""
#version 300 es
precision mediump float;
${DECLARATIONS}
void main()
{
${SETUP}
int a = in0;
for (int a = 0; a < 10; a++)
{
}
out0 = a;
${OUTPUT}
}
""
end
case while_condition_variable_hides_local_variable
version 300 es
values
{
input int in0 = [ 1 | 2 | 3 ];
output int out0 = [ 1 | 2 | 3 ];
}
both ""
#version 300 es
precision mediump float;
${DECLARATIONS}
void main()
{
${SETUP}
int a = in0;
int i = 0;
while (bool a = (i < 1))
{
i++;
}
out0 = a;
${OUTPUT}
}
""
end
case for_init_statement_variable_hides_global_variable
version 300 es
values
{
input int in0 = [ 1 | 2 | 3 ];
output int out0 = [ 1 | 2 | 3 ];
}
both ""
#version 300 es
precision mediump float;
${DECLARATIONS}
int a = 5;
void main()
{
${SETUP}
for (int a = 0; a < 10; a++)
{
}
out0 = in0 + a - 5;
${OUTPUT}
}
""
end
case while_condition_variable_hides_global_variable
version 300 es
values
{
input int in0 = [ 1 | 2 | 3 ];
output int out0 = [ 1 | 2 | 3 ];
}
both ""
#version 300 es
precision mediump float;
${DECLARATIONS}
int a = 5;
void main()
{
${SETUP}
int i = 0;
while (bool a = (i < 1))
{
i++;
}
out0 = in0 + a - 5;
${OUTPUT}
}
""
end
case variable_in_if_hides_global_variable
version 300 es
values
{
input int in0 = [ 1 | 2 | 3 ];
output int out0 = [ 1 | 2 | 3 ];
}
both ""
#version 300 es
precision mediump float;
${DECLARATIONS}
int a = 1;
void main()
{
${SETUP}
if (true)
int a = 42;
out0 = a*in0;
${OUTPUT}
}
""
end
case variable_from_outer_scope_visible_in_initializer
version 300 es
values
{
input int in0 = [ 1 | 2 | 3 ];
output int out0 = [ 1 | 2 | 3 ];
}
both ""
#version 300 es
precision mediump float;
${DECLARATIONS}
void main()
{
${SETUP}
int a = in0;
{
int a = a+5, b = a-5;
out0 = b;
a = 42;
}
out0 = out0 + a - in0;
${OUTPUT}
}
""
end
case local_int_variable_hides_struct_type
version 300 es
values
{
input int in0 = [ 1 | 2 | 3 ];
output int out0 = [ 1 | 2 | 3 ];
}
both ""
#version 300 es
precision mediump float;
${DECLARATIONS}
struct S { int val; };
void main()
{
${SETUP}
int S = S(in0).val;
out0 = S;
${OUTPUT}
}
""
end
case local_struct_variable_hides_struct_type
version 300 es
values
{
input int in0 = [ 1 | 2 | 3 ];
output int out0 = [ 1 | 2 | 3 ];
}
both ""
#version 300 es
precision mediump float;
${DECLARATIONS}
struct S { int val; };
void main()
{
${SETUP}
S S = S(in0);
out0 = S.val;
${OUTPUT}
}
""
end
case local_variable_hides_function
version 300 es
values
{
input int in0 = [ 1 | 2 | 3 ];
output int out0 = [ 1 | 2 | 3 ];
}
both ""
#version 300 es
precision mediump float;
${DECLARATIONS}
int foo (int x) { return x; }
void main()
{
${SETUP}
int foo = in0;
out0 = foo;
${OUTPUT}
}
""
end
case function_parameter_hides_global_variable
version 300 es
values
{
input int in0 = [ 1 | 2 | 3 ];
output int out0 = [ 1 | 2 | 3 ];
}
both ""
#version 300 es
precision mediump float;
${DECLARATIONS}
int a = -1;
int func (int a) { return a; }
void main()
{
${SETUP}
out0 = func(in0);
${OUTPUT}
}
""
end
case function_parameter_hides_struct_type
version 300 es
values
{
input int in0 = [ 1 | 2 | 3 ];
output int out0 = [ 1 | 2 | 3 ];
}
both ""
#version 300 es
precision mediump float;
${DECLARATIONS}
struct S { int x; };
int func (int S) { return S; }
void main()
{
${SETUP}
out0 = func(in0);
${OUTPUT}
}
""
end
case function_parameter_hides_function
version 300 es
values
{
input int in0 = [ 1 | 2 | 3 ];
output int out0 = [ 1 | 2 | 3 ];
}
both ""
#version 300 es
precision mediump float;
${DECLARATIONS}
int func (int func) { return func; }
void main()
{
${SETUP}
out0 = func(in0);
${OUTPUT}
}
""
end
case local_variable_in_inner_scope_hides_function_parameter
version 300 es
values
{
input int in0 = [ 1 | 2 | 3 ];
output int out0 = [ 1 | 2 | 3 ];
}
both ""
#version 300 es
precision mediump float;
${DECLARATIONS}
int func (int inp, int x) { { int x = 5; return inp + x - 5; } }
void main()
{
${SETUP}
out0 = func(in0, 42);
${OUTPUT}
}
""
end
case redeclare_function
version 300 es
values
{
input int in0 = [ 1 | 2 | 3 ];
output int out0 = [ 1 | 2 | 3 ];
}
both ""
#version 300 es
precision mediump float;
${DECLARATIONS}
int func (int x);
int func (int);
int func (int inp) { return inp; }
void main()
{
${SETUP}
out0 = func(in0);
${OUTPUT}
}
""
end
end
group invalid "Invalid scoping behavior"
case redeclare_global_variable
version 300 es
expect compile_fail
both ""
#version 300 es
precision mediump float;
${DECLARATIONS}
int a;
float a;
void main()
{
a = 1.0;
${POSITION_FRAG_COLOR} = vec4(a);
}
""
end
case redeclare_local_variable
version 300 es
expect compile_fail
both ""
#version 300 es
precision mediump float;
${DECLARATIONS}
void main()
{
int a;
float a;
a = 1.0;
${POSITION_FRAG_COLOR} = vec4(a);
}
""
end
case redeclare_for_init_statement_variable
version 300 es
expect compile_fail
both ""
#version 300 es
precision mediump float;
${DECLARATIONS}
void main()
{
for (int i = 0; i < 10; i++)
{
int i = 11;
}
${POSITION_FRAG_COLOR} = vec4(0.0);
}
""
end
case redeclare_for_condition_variable
version 300 es
expect compile_fail
both ""
#version 300 es
precision mediump float;
${DECLARATIONS}
void main()
{
for (int i = 0; int a = (i < 10); i++)
{
int a = 0;
}
${POSITION_FRAG_COLOR} = vec4(0.0);
}
""
end
case redeclare_for_init_statement_variable_in_for_condition
version 300 es
expect compile_fail
both ""
#version 300 es
precision mediump float;
${DECLARATIONS}
void main()
{
float a;
for (int i = 0; int i = (i < 10); i++)
{
a = sin(i);
}
${POSITION_FRAG_COLOR} = vec4(a);
}
""
end
case redeclare_while_condition_variable
version 300 es
expect compile_fail
both ""
#version 300 es
precision mediump float;
${DECLARATIONS}
void main()
{
int a = 0;
while (int i = (a < 5))
{
int i = 11;
a += i;
}
${POSITION_FRAG_COLOR} = vec4(0.0);
}
""
end
case redefine_function
version 300 es
expect compile_fail
both ""
#version 300 es
precision mediump float;
${DECLARATIONS}
float func(float x);
float func(float x) { return x + 1.0; }
float func(float x) { return x + 2.0; }
void main()
{
${POSITION_FRAG_COLOR} = vec4(func(1.0));
}
""
end
case redeclare_builtin
version 300 es
expect compile_fail
both ""
#version 300 es
precision mediump float;
${DECLARATIONS}
float sin(float x);
void main()
{
${POSITION_FRAG_COLOR} = vec4(sin(1.0));
}
""
end
case redefine_builtin
version 300 es
expect compile_fail
both ""
#version 300 es
precision mediump float;
${DECLARATIONS}
float sin(float x) { return x + 1.0; }
void main()
{
${POSITION_FRAG_COLOR} = vec4(sin(1.0));
}
""
end
case conflict_function_struct
version 300 es
expect compile_fail
both ""
#version 300 es
precision mediump float;
${DECLARATIONS}
void f(int x);
struct f { int x; };
void main()
{
${POSITION_FRAG_COLOR} = vec4(1);
}
""
end
case conflict_function_variable
version 300 es
expect compile_fail
both ""
#version 300 es
precision mediump float;
${DECLARATIONS}
void f(int x);
float f;
void main()
{
f = 1.0;
${POSITION_FRAG_COLOR} = vec4(f);
}
""
end
case use_global_variable_before_declaration
version 300 es
expect compile_fail
both ""
#version 300 es
precision mediump float;
${DECLARATIONS}
void func()
{
a = 2.0;
}
float a;
void main()
{
func();
${POSITION_FRAG_COLOR} = vec4(a);
}
""
end
case use_local_variable_before_declaration
version 300 es
expect compile_fail
both ""
#version 300 es
precision mediump float;
${DECLARATIONS}
void main()
{
float a = 1.0;
a = b;
float b = 2.0;
${POSITION_FRAG_COLOR} = vec4(a);
}
""
end
case use_struct_type_before_declaration
version 300 es
expect compile_fail
both ""
#version 300 es
precision mediump float;
${DECLARATIONS}
float func (float x) { return S(x).val; }
struct S { float val; };
void main()
{
${POSITION_FRAG_COLOR} = vec4(func(1.0));
}
""
end
case use_function_before_declaration
version 300 es
expect compile_fail
both ""
#version 300 es
precision mediump float;
${DECLARATIONS}
float func (float x) { return bar(x); }
float bar (float x) { return x; }
void main()
{
${POSITION_FRAG_COLOR} = vec4(func(1.0));
}
""
end
case use_variable_from_block_in_outer_scope
version 300 es
expect compile_fail
both ""
#version 300 es
precision mediump float;
${DECLARATIONS}
void main()
{
{
float a = 1.0;
}
${POSITION_FRAG_COLOR} = vec4(a);
}
""
end
case use_variable_from_if_in_outer_scope
version 300 es
expect compile_fail
both ""
#version 300 es
precision mediump float;
${DECLARATIONS}
void main()
{
if (true)
float a = 1.0;
${POSITION_FRAG_COLOR} = vec4(a);
}
""
end
case use_variable_from_else_in_outer_scope
version 300 es
expect compile_fail
both ""
#version 300 es
precision mediump float;
${DECLARATIONS}
void main()
{
if (false)
float a = 1.0;
else
float b = 2.0;
${POSITION_FRAG_COLOR} = vec4(b);
}
""
end
case use_variable_from_if_in_else
version 300 es
expect compile_fail
both ""
#version 300 es
precision mediump float;
${DECLARATIONS}
void main()
{
float a = 1.0;
if (true)
{
float b = 2.0;
}
else
{
a = b;
}
${POSITION_FRAG_COLOR} = vec4(a);
}
""
end
case use_variable_from_for_init_statement_in_outer_scope
version 300 es
expect compile_fail
both ""
#version 300 es
precision mediump float;
${DECLARATIONS}
void main()
{
float x = 0.0;
for (int i = 0; i < 10; i++)
{
x += sin(i);
}
${POSITION_FRAG_COLOR} = vec4(float(i));
}
""
end
case use_variable_from_while_condition_in_outer_scope
version 300 es
expect compile_fail
both ""
#version 300 es
precision mediump float;
${DECLARATIONS}
void main()
{
int a = 1;
while (bool b = (a == 1))
{
a++;
}
${POSITION_FRAG_COLOR} = vec4(float(b));
}
""
end
case use_parameter_names_from_function_declaration
version 300 es
expect compile_fail
both ""
#version 300 es
precision mediump float;
${DECLARATIONS}
float func(float a, float b);
float func(float x, float y) { return a+b; }
void main()
{
${POSITION_FRAG_COLOR} = vec4(func(1.0, 2.0));
}
""
end
case variable_not_visible_in_own_initializer
version 300 es
expect compile_fail
both ""
#version 300 es
precision mediump float;
${DECLARATIONS}
void main()
{
float x = x;
${POSITION_FRAG_COLOR} = vec4(x);
}
""
end
case local_variable_hides_function_parameter
version 300 es
expect compile_fail
both ""
#version 300 es
precision mediump float;
${DECLARATIONS}
float func (float inp, float x) { int x = 5.0; return inp + x - 5.0; }
void main()
{
${POSITION_FRAG_COLOR} = vec4(func(1.0, 2.0));
}
""
end
end # invalid