SKIP: FAILED

#version 310 es
precision mediump float;

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

layout(binding = 0) uniform buf0_1 {
  vec2 injectionSwitch;
} x_6;

vec4 x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
void main_1() {
  int i = 0;
  int GLF_dead5cols = 0;
  int GLF_dead5rows = 0;
  int GLF_dead5c = 0;
  int GLF_dead5r = 0;
  int msb10 = 0;
  float donor_replacementGLF_dead5sums[9] = float[9](0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
  i = 0;
  while (true) {
    int x_45 = i;
    float x_47 = x_6.injectionSwitch.x;
    if ((x_45 >= int(x_47))) {
      break;
    }
    float x_53 = x_6.injectionSwitch.y;
    if ((0.0f > x_53)) {
      GLF_dead5cols = 2;
      {
        for(; (GLF_dead5cols <= 4); GLF_dead5cols = (GLF_dead5cols + 1)) {
          GLF_dead5rows = 2;
          {
            for(; (GLF_dead5rows <= 4); GLF_dead5rows = (GLF_dead5rows + 1)) {
              GLF_dead5c = 0;
              {
                for(; (GLF_dead5c < GLF_dead5cols); GLF_dead5c = (GLF_dead5c + 1)) {
                  GLF_dead5r = 0;
                  {
                    for(; (GLF_dead5r < GLF_dead5rows); GLF_dead5r = (GLF_dead5r + 1)) {
                      switch(msb10) {
                        case 1:
                        case 8: {
                          int x_96 = (((msb10 >= 0) & (msb10 < 9)) ? msb10 : 0);
                          float x_98 = donor_replacementGLF_dead5sums[x_96];
                          donor_replacementGLF_dead5sums[x_96] = (x_98 + 1.0f);
                          break;
                        }
                        default: {
                          break;
                        }
                      }
                    }
                  }
                }
              }
              msb10 = (msb10 + 1);
            }
          }
        }
      }
    }
    i = (i + 1);
    {
      if ((i < 200)) {
      } else {
        break;
      }
    }
  }
  x_GLF_color = vec4(1.0f, 0.0f, 0.0f, 1.0f);
  return;
}

struct main_out {
  vec4 x_GLF_color_1;
};

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

void main() {
  main_out inner_result = tint_symbol();
  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
  return;
}
Error parsing GLSL shader:
ERROR: 0:46: '&' :  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:46: '' : compilation terminated 
ERROR: 2 compilation errors.  No code generated.



