SKIP: FAILED

#version 310 es
precision mediump float;

layout(location = 0) out vec4 x_GLF_color_1_1;
struct buf0 {
  vec2 injectionSwitch;
};

int data[10] = int[10](0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
int temp[10] = int[10](0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
layout(binding = 0) uniform buf0_1 {
  vec2 injectionSwitch;
} x_28;

vec4 tint_symbol = vec4(0.0f, 0.0f, 0.0f, 0.0f);
vec4 x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
void merge_i1_i1_i1_(inout int from, inout int mid, inout int to) {
  int k = 0;
  int i = 0;
  int j = 0;
  int i_1 = 0;
  int x_302 = from;
  k = x_302;
  int x_303 = from;
  i = x_303;
  int x_304 = mid;
  j = (x_304 + 1);
  while (true) {
    int x_310 = i;
    int x_311 = mid;
    int x_313 = j;
    int x_314 = to;
    if (((x_310 <= x_311) & (x_313 <= x_314))) {
    } else {
      break;
    }
    int x_320 = data[i];
    int x_323 = data[j];
    if ((x_320 < x_323)) {
      int x_328 = k;
      k = (x_328 + 1);
      int x_330 = i;
      i = (x_330 + 1);
      int x_333 = data[x_330];
      temp[x_328] = x_333;
    } else {
      int x_335 = k;
      k = (x_335 + 1);
      int x_337 = j;
      j = (x_337 + 1);
      int x_340 = data[x_337];
      temp[x_335] = x_340;
    }
  }
  while (true) {
    int x_346 = i;
    int x_348 = i;
    int x_349 = mid;
    if (((x_346 < 10) & (x_348 <= x_349))) {
    } else {
      break;
    }
    int x_353 = k;
    k = (x_353 + 1);
    int x_355 = i;
    i = (x_355 + 1);
    int x_358 = data[x_355];
    temp[x_353] = x_358;
  }
  int x_360 = from;
  i_1 = x_360;
  while (true) {
    int x_365 = i_1;
    int x_366 = to;
    if ((x_365 <= x_366)) {
    } else {
      break;
    }
    int x_369 = i_1;
    int x_372 = temp[i_1];
    data[x_369] = x_372;
    {
      i_1 = (i_1 + 1);
    }
  }
  return;
}

void main_1() {
  int x_85 = 0;
  int x_86 = 0;
  int x_87 = 0;
  int x_88 = 0;
  int x_89 = 0;
  int x_90 = 0;
  int x_91 = 0;
  int x_92 = 0;
  int x_93 = 0;
  int x_94 = 0;
  int i_3 = 0;
  int j_1 = 0;
  float grey = 0.0f;
  float x_96 = x_28.injectionSwitch.x;
  i_3 = int(x_96);
  while (true) {
    switch(i_3) {
      case 9: {
        data[i_3] = -5;
        break;
      }
      case 8: {
        data[i_3] = -4;
        break;
      }
      case 7: {
        data[i_3] = -3;
        break;
      }
      case 6: {
        data[i_3] = -2;
        break;
      }
      case 5: {
        data[i_3] = -1;
        break;
      }
      case 4: {
        data[i_3] = 0;
        break;
      }
      case 3: {
        data[i_3] = 1;
        break;
      }
      case 2: {
        data[i_3] = 2;
        break;
      }
      case 1: {
        data[i_3] = 3;
        break;
      }
      case 0: {
        data[i_3] = 4;
        break;
      }
      default: {
        break;
      }
    }
    i_3 = (i_3 + 1);
    {
      if ((i_3 < 10)) {
      } else {
        break;
      }
    }
  }
  j_1 = 0;
  {
    for(; (j_1 < 10); j_1 = (j_1 + 1)) {
      int x_145 = j_1;
      int x_148 = data[j_1];
      temp[x_145] = x_148;
    }
  }
  x_94 = 0;
  x_93 = 9;
  x_92 = 1;
  {
    for(; (x_92 <= x_93); x_92 = (2 * x_92)) {
      x_91 = x_94;
      {
        for(; (x_91 < x_93); x_91 = (x_91 + (2 * x_92))) {
          x_90 = x_91;
          x_89 = ((x_91 + x_92) - 1);
          x_88 = min(((x_91 + (2 * x_92)) - 1), x_93);
          x_87 = x_90;
          x_86 = x_89;
          x_85 = x_88;
          merge_i1_i1_i1_(x_87, x_86, x_85);
        }
      }
    }
  }
  float x_193 = tint_symbol.y;
  if ((int(x_193) < 30)) {
    int x_200 = data[0];
    grey = (0.5f + (float(x_200) / 10.0f));
  } else {
    float x_205 = tint_symbol.y;
    if ((int(x_205) < 60)) {
      int x_212 = data[1];
      grey = (0.5f + (float(x_212) / 10.0f));
    } else {
      float x_217 = tint_symbol.y;
      if ((int(x_217) < 90)) {
        int x_224 = data[2];
        grey = (0.5f + (float(x_224) / 10.0f));
      } else {
        float x_229 = tint_symbol.y;
        if ((int(x_229) < 120)) {
          int x_236 = data[3];
          grey = (0.5f + (float(x_236) / 10.0f));
        } else {
          float x_241 = tint_symbol.y;
          if ((int(x_241) < 150)) {
            discard;
          } else {
            float x_248 = tint_symbol.y;
            if ((int(x_248) < 180)) {
              int x_255 = data[5];
              grey = (0.5f + (float(x_255) / 10.0f));
            } else {
              float x_260 = tint_symbol.y;
              if ((int(x_260) < 210)) {
                int x_267 = data[6];
                grey = (0.5f + (float(x_267) / 10.0f));
              } else {
                float x_272 = tint_symbol.y;
                if ((int(x_272) < 240)) {
                  int x_279 = data[7];
                  grey = (0.5f + (float(x_279) / 10.0f));
                } else {
                  float x_284 = tint_symbol.y;
                  if ((int(x_284) < 270)) {
                    int x_291 = data[8];
                    grey = (0.5f + (float(x_291) / 10.0f));
                  } else {
                    discard;
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  float x_295 = grey;
  vec3 x_296 = vec3(x_295, x_295, x_295);
  x_GLF_color = vec4(x_296.x, x_296.y, x_296.z, 1.0f);
  return;
}

struct main_out {
  vec4 x_GLF_color_1;
};

main_out tint_symbol_1(vec4 tint_symbol_2) {
  tint_symbol = tint_symbol_2;
  main_1();
  main_out tint_symbol_3 = main_out(x_GLF_color);
  return tint_symbol_3;
}

void main() {
  main_out inner_result = tint_symbol_1(gl_FragCoord);
  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
  return;
}
Error parsing GLSL shader:
ERROR: 0:33: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' temp bool' and a right operand of type ' temp bool' (or there is no acceptable conversion)
ERROR: 0:33: '' : compilation terminated 
ERROR: 2 compilation errors.  No code generated.



