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_251 = from;
  k = x_251;
  int x_252 = from;
  i = x_252;
  int x_253 = mid;
  j = (x_253 + 1);
  while (true) {
    int x_259 = i;
    int x_260 = mid;
    int x_262 = j;
    int x_263 = to;
    if (((x_259 <= x_260) & (x_262 <= x_263))) {
    } else {
      break;
    }
    int x_269 = data[i];
    int x_272 = data[j];
    if ((x_269 < x_272)) {
      int x_277 = k;
      k = (x_277 + 1);
      int x_279 = i;
      i = (x_279 + 1);
      int x_282 = data[x_279];
      temp[x_277] = x_282;
    } else {
      int x_284 = k;
      k = (x_284 + 1);
      int x_286 = j;
      j = (x_286 + 1);
      int x_289 = data[x_286];
      temp[x_284] = x_289;
    }
  }
  while (true) {
    int x_295 = i;
    int x_297 = i;
    int x_298 = mid;
    if (((x_295 < 10) & (x_297 <= x_298))) {
    } else {
      break;
    }
    int x_302 = k;
    k = (x_302 + 1);
    int x_304 = i;
    i = (x_304 + 1);
    int x_307 = data[x_304];
    temp[x_302] = x_307;
  }
  int x_309 = from;
  i_1 = x_309;
  while (true) {
    int x_314 = i_1;
    int x_315 = to;
    if ((x_314 <= x_315)) {
    } else {
      break;
    }
    int x_318 = i_1;
    int x_321 = temp[i_1];
    data[x_318] = x_321;
    {
      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_84 = x_28.injectionSwitch.x;
  i_3 = int(x_84);
  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_133 = j_1;
      int x_136 = data[j_1];
      temp[x_133] = x_136;
    }
  }
  mergeSort_();
  float x_142 = tint_symbol.y;
  if ((int(x_142) < 30)) {
    int x_149 = data[0];
    grey = (0.5f + (float(x_149) / 10.0f));
  } else {
    float x_154 = tint_symbol.y;
    if ((int(x_154) < 60)) {
      int x_161 = data[1];
      grey = (0.5f + (float(x_161) / 10.0f));
    } else {
      float x_166 = tint_symbol.y;
      if ((int(x_166) < 90)) {
        int x_173 = data[2];
        grey = (0.5f + (float(x_173) / 10.0f));
      } else {
        float x_178 = tint_symbol.y;
        if ((int(x_178) < 120)) {
          int x_185 = data[3];
          grey = (0.5f + (float(x_185) / 10.0f));
        } else {
          float x_190 = tint_symbol.y;
          if ((int(x_190) < 150)) {
            discard;
          } else {
            float x_197 = tint_symbol.y;
            if ((int(x_197) < 180)) {
              int x_204 = data[5];
              grey = (0.5f + (float(x_204) / 10.0f));
            } else {
              float x_209 = tint_symbol.y;
              if ((int(x_209) < 210)) {
                int x_216 = data[6];
                grey = (0.5f + (float(x_216) / 10.0f));
              } else {
                float x_221 = tint_symbol.y;
                if ((int(x_221) < 240)) {
                  int x_228 = data[7];
                  grey = (0.5f + (float(x_228) / 10.0f));
                } else {
                  float x_233 = tint_symbol.y;
                  if ((int(x_233) < 270)) {
                    int x_240 = data[8];
                    grey = (0.5f + (float(x_240) / 10.0f));
                  } else {
                    discard;
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  float x_244 = grey;
  vec3 x_245 = vec3(x_244, x_244, x_244);
  x_GLF_color = vec4(x_245.x, x_245.y, x_245.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.



