SKIP: FAILED

#version 310 es
precision mediump float;

struct buf0 {
  vec2 injectionSwitch;
};

struct buf1 {
  vec2 resolution;
};

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_254 = from;
  k = x_254;
  int x_255 = from;
  i = x_255;
  int x_256 = mid;
  j = (x_256 + 1);
  while (true) {
    int x_262 = i;
    int x_263 = mid;
    int x_265 = j;
    int x_266 = to;
    if (((x_262 <= x_263) & (x_265 <= x_266))) {
    } else {
      break;
    }
    int x_272 = data[i];
    int x_275 = data[j];
    if ((x_272 < x_275)) {
      int x_280 = k;
      k = (x_280 + 1);
      int x_282 = i;
      i = (x_282 + 1);
      int x_285 = data[x_282];
      temp[x_280] = x_285;
    } else {
      int x_287 = k;
      k = (x_287 + 1);
      int x_289 = j;
      j = (x_289 + 1);
      int x_292 = data[x_289];
      temp[x_287] = x_292;
    }
  }
  while (true) {
    int x_298 = i;
    int x_300 = i;
    int x_301 = mid;
    if (((x_298 < 10) & (x_300 <= x_301))) {
    } else {
      break;
    }
    int x_305 = k;
    k = (x_305 + 1);
    int x_307 = i;
    i = (x_307 + 1);
    int x_310 = data[x_307];
    temp[x_305] = x_310;
  }
  int x_312 = from;
  i_1 = x_312;
  while (true) {
    int x_317 = i_1;
    int x_318 = to;
    if ((x_317 <= x_318)) {
    } else {
      break;
    }
    int x_321 = i_1;
    int x_324 = temp[i_1];
    data[x_321] = x_324;
    {
      i_1 = (i_1 + 1);
    }
  }
  return;
}

void mergeSort_() {
  int low = 0;
  int high = 0;
  int m = 0;
  int i_2 = 0;
  int from_1 = 0;
  int mid_1 = 0;
  int to_1 = 0;
  int param = 0;
  int param_1 = 0;
  int param_2 = 0;
  low = 0;
  high = 9;
  m = 1;
  {
    for(; (m <= high); m = (2 * m)) {
      i_2 = low;
      {
        for(; (i_2 < high); i_2 = (i_2 + (2 * m))) {
          from_1 = i_2;
          mid_1 = ((i_2 + m) - 1);
          to_1 = min(((i_2 + (2 * m)) - 1), high);
          param = from_1;
          param_1 = mid_1;
          param_2 = to_1;
          merge_i1_i1_i1_(param, param_1, param_2);
        }
      }
    }
  }
  return;
}

void main_1() {
  int i_3 = 0;
  int j_1 = 0;
  float grey = 0.0f;
  float x_87 = x_28.injectionSwitch.x;
  i_3 = int(x_87);
  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_136 = j_1;
      int x_139 = data[j_1];
      temp[x_136] = x_139;
    }
  }
  mergeSort_();
  float x_145 = tint_symbol.y;
  if ((int(x_145) < 30)) {
    int x_152 = data[0];
    grey = (0.5f + (float(x_152) / 10.0f));
  } else {
    float x_157 = tint_symbol.y;
    if ((int(x_157) < 60)) {
      int x_164 = data[1];
      grey = (0.5f + (float(x_164) / 10.0f));
    } else {
      float x_169 = tint_symbol.y;
      if ((int(x_169) < 90)) {
        int x_176 = data[2];
        grey = (0.5f + (float(x_176) / 10.0f));
      } else {
        float x_181 = tint_symbol.y;
        if ((int(x_181) < 120)) {
          int x_188 = data[3];
          grey = (0.5f + (float(x_188) / 10.0f));
        } else {
          float x_193 = tint_symbol.y;
          if ((int(x_193) < 150)) {
            discard;
          } else {
            float x_200 = tint_symbol.y;
            if ((int(x_200) < 180)) {
              int x_207 = data[5];
              grey = (0.5f + (float(x_207) / 10.0f));
            } else {
              float x_212 = tint_symbol.y;
              if ((int(x_212) < 210)) {
                int x_219 = data[6];
                grey = (0.5f + (float(x_219) / 10.0f));
              } else {
                float x_224 = tint_symbol.y;
                if ((int(x_224) < 240)) {
                  int x_231 = data[7];
                  grey = (0.5f + (float(x_231) / 10.0f));
                } else {
                  float x_236 = tint_symbol.y;
                  if ((int(x_236) < 270)) {
                    int x_243 = data[8];
                    grey = (0.5f + (float(x_243) / 10.0f));
                  } else {
                    discard;
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  float x_247 = grey;
  vec3 x_248 = vec3(x_247, x_247, x_247);
  x_GLF_color = vec4(x_248.x, x_248.y, x_248.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_6 = main_out(x_GLF_color);
  return tint_symbol_6;
}

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:36: '&' :  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:36: '' : compilation terminated 
ERROR: 2 compilation errors.  No code generated.



