SKIP: FAILED

#version 310 es
precision mediump float;

groupshared int a;

void uses_a() {
  a = (a + 1);
}

struct tint_symbol_1 {
  uint local_invocation_index;
};

void main1_inner(uint local_invocation_index) {
  {
    a = 0;
  }
  GroupMemoryBarrierWithGroupSync();
  a = 42;
  uses_a();
}

struct tint_symbol_3 {
  uint local_invocation_index_1;
};
struct tint_symbol_5 {
  uint local_invocation_index_2;
};

layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
void main1(tint_symbol_1 tint_symbol) {
  main1_inner(tint_symbol.local_invocation_index);
  return;
}
void main() {
  tint_symbol_1 inputs;
  inputs.local_invocation_index = uint(gl_LocalInvocationIndex);
  main1(inputs);
}


Error parsing GLSL shader:
ERROR: 0:4: '' :  syntax error, unexpected IDENTIFIER
ERROR: 1 compilation errors.  No code generated.



#version 310 es
precision mediump float;

groupshared int b;

void uses_b() {
  b = (b * 2);
}

struct tint_symbol_1 {
  uint local_invocation_index;
};
struct tint_symbol_3 {
  uint local_invocation_index_1;
};

void main2_inner(uint local_invocation_index_1) {
  {
    b = 0;
  }
  GroupMemoryBarrierWithGroupSync();
  b = 7;
  uses_b();
}

struct tint_symbol_5 {
  uint local_invocation_index_2;
};

layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
void main2(tint_symbol_3 tint_symbol_2) {
  main2_inner(tint_symbol_2.local_invocation_index_1);
  return;
}
void main() {
  tint_symbol_3 inputs;
  inputs.local_invocation_index_1 = uint(gl_LocalInvocationIndex);
  main2(inputs);
}


Error parsing GLSL shader:
ERROR: 0:4: '' :  syntax error, unexpected IDENTIFIER
ERROR: 1 compilation errors.  No code generated.



#version 310 es
precision mediump float;

groupshared int a;
groupshared int b;

void uses_a() {
  a = (a + 1);
}

void uses_b() {
  b = (b * 2);
}

void uses_a_and_b() {
  b = a;
}

void no_uses() {
}

void outer() {
  a = 0;
  uses_a();
  uses_a_and_b();
  uses_b();
  no_uses();
}

struct tint_symbol_1 {
  uint local_invocation_index;
};
struct tint_symbol_3 {
  uint local_invocation_index_1;
};
struct tint_symbol_5 {
  uint local_invocation_index_2;
};

void main3_inner(uint local_invocation_index_2) {
  {
    a = 0;
    b = 0;
  }
  GroupMemoryBarrierWithGroupSync();
  outer();
  no_uses();
}

layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
void main3(tint_symbol_5 tint_symbol_4) {
  main3_inner(tint_symbol_4.local_invocation_index_2);
  return;
}
void main() {
  tint_symbol_5 inputs;
  inputs.local_invocation_index_2 = uint(gl_LocalInvocationIndex);
  main3(inputs);
}


Error parsing GLSL shader:
ERROR: 0:4: '' :  syntax error, unexpected IDENTIFIER
ERROR: 1 compilation errors.  No code generated.



#version 310 es
precision mediump float;

void no_uses() {
}

struct tint_symbol_1 {
  uint local_invocation_index;
};
struct tint_symbol_3 {
  uint local_invocation_index_1;
};
struct tint_symbol_5 {
  uint local_invocation_index_2;
};

layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
void main4() {
  no_uses();
  return;
}
void main() {
  main4();
}


