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