SKIP: FAILED

#version 310 es
precision mediump float;

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_303 = from;
  k = x_303;
  int x_304 = from;
  i = x_304;
  int x_305 = mid;
  j = (x_305 + 1);
  while (true) {
    int x_311 = i;
    int x_312 = mid;
    int x_314 = j;
    int x_315 = to;
    if (((x_311 <= x_312) & (x_314 <= x_315))) {
    } else {
      break;
    }
    int x_321 = data[i];
    int x_324 = data[j];
    if ((x_321 < x_324)) {
      int x_329 = k;
      k = (x_329 + 1);
      int x_331 = i;
      i = (x_331 + 1);
      int x_334 = data[x_331];
      temp[x_329] = x_334;
    } else {
      int x_336 = k;
      k = (x_336 + 1);
      int x_338 = j;
      j = (x_338 + 1);
      int x_341 = data[x_338];
      temp[x_336] = x_341;
    }
  }
  while (true) {
    int x_347 = i;
    int x_349 = i;
    int x_350 = mid;
    if (((x_347 < 10) & (x_349 <= x_350))) {
    } else {
      break;
    }
    int x_354 = k;
    k = (x_354 + 1);
    int x_356 = i;
    i = (x_356 + 1);
    int x_359 = data[x_356];
    temp[x_354] = x_359;
  }
  int x_361 = from;
  i_1 = x_361;
  while (true) {
    int x_366 = i_1;
    int x_367 = to;
    if ((x_366 <= x_367)) {
    } else {
      break;
    }
    int x_370 = i_1;
    int x_373 = temp[i_1];
    data[x_370] = x_373;
    {
      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;
          int x_170 = x_91;
          int x_171 = x_92;
          int x_173[10] = data;
          int tint_symbol_6[10] = int[10](0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
          data = tint_symbol_6;
          data = x_173;
          x_89 = ((x_170 + x_171) - 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_194 = tint_symbol.y;
  if ((int(x_194) < 30)) {
    int x_201 = data[0];
    grey = (0.5f + (float(x_201) / 10.0f));
  } else {
    float x_206 = tint_symbol.y;
    if ((int(x_206) < 60)) {
      int x_213 = data[1];
      grey = (0.5f + (float(x_213) / 10.0f));
    } else {
      float x_218 = tint_symbol.y;
      if ((int(x_218) < 90)) {
        int x_225 = data[2];
        grey = (0.5f + (float(x_225) / 10.0f));
      } else {
        float x_230 = tint_symbol.y;
        if ((int(x_230) < 120)) {
          int x_237 = data[3];
          grey = (0.5f + (float(x_237) / 10.0f));
        } else {
          float x_242 = tint_symbol.y;
          if ((int(x_242) < 150)) {
            discard;
          } else {
            float x_249 = tint_symbol.y;
            if ((int(x_249) < 180)) {
              int x_256 = data[5];
              grey = (0.5f + (float(x_256) / 10.0f));
            } else {
              float x_261 = tint_symbol.y;
              if ((int(x_261) < 210)) {
                int x_268 = data[6];
                grey = (0.5f + (float(x_268) / 10.0f));
              } else {
                float x_273 = tint_symbol.y;
                if ((int(x_273) < 240)) {
                  int x_280 = data[7];
                  grey = (0.5f + (float(x_280) / 10.0f));
                } else {
                  float x_285 = tint_symbol.y;
                  if ((int(x_285) < 270)) {
                    int x_292 = data[8];
                    grey = (0.5f + (float(x_292) / 10.0f));
                  } else {
                    discard;
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  float x_296 = grey;
  vec3 x_297 = vec3(x_296, x_296, x_296);
  x_GLF_color = vec4(x_297.x, x_297.y, x_297.z, 1.0f);
  return;
}

struct main_out {
  vec4 x_GLF_color_1;
};
struct tint_symbol_4 {
  vec4 tint_symbol_2;
};
struct tint_symbol_5 {
  vec4 x_GLF_color_1;
};

main_out tint_symbol_1_inner(vec4 tint_symbol_2) {
  tint_symbol = tint_symbol_2;
  main_1();
  main_out tint_symbol_7 = main_out(x_GLF_color);
  return tint_symbol_7;
}

tint_symbol_5 tint_symbol_1(tint_symbol_4 tint_symbol_3) {
  main_out inner_result = tint_symbol_1_inner(tint_symbol_3.tint_symbol_2);
  tint_symbol_5 wrapper_result = tint_symbol_5(vec4(0.0f, 0.0f, 0.0f, 0.0f));
  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
  return wrapper_result;
}
layout(location = 0) out vec4 x_GLF_color_1;
void main() {
  tint_symbol_4 inputs;
  inputs.tint_symbol_2 = gl_FragCoord;
  tint_symbol_5 outputs;
  outputs = tint_symbol_1(inputs);
  x_GLF_color_1 = outputs.x_GLF_color_1;
}


Error parsing GLSL shader:
ERROR: 0:32: '&' :  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:32: '' : compilation terminated 
ERROR: 2 compilation errors.  No code generated.



