SKIP: FAILED

#version 310 es
precision mediump float;

layout(location = 0) out vec4 x_GLF_color_1_1;
struct buf2 {
  float one;
};

struct strided_arr {
  float el;
};

struct buf0 {
  strided_arr x_GLF_uniform_float_values[1];
};

struct strided_arr_1 {
  int el;
};

struct buf1 {
  strided_arr_1 x_GLF_uniform_int_values[4];
};

mat4x2 m = mat4x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
layout(binding = 2) uniform buf2_1 {
  float one;
} x_10;

layout(binding = 0) uniform buf0_1 {
  strided_arr x_GLF_uniform_float_values[1];
} x_12;

vec4 tint_symbol = vec4(0.0f, 0.0f, 0.0f, 0.0f);
layout(binding = 1) uniform buf1_1 {
  strided_arr_1 x_GLF_uniform_int_values[4];
} x_16;

vec4 x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
void func0_i1_(inout int x) {
  int i = 0;
  bool x_137 = false;
  bool x_138 = false;
  bool x_138_phi = false;
  bool x_139_phi = false;
  int x_124 = x;
  bool x_125 = (x_124 < 1);
  x_139_phi = x_125;
  if (!(x_125)) {
    int x_129 = x;
    bool x_130 = (x_129 > 1);
    x_138_phi = x_130;
    if (x_130) {
      float x_134 = x_10.one;
      float x_136 = x_12.x_GLF_uniform_float_values[0].el;
      x_137 = (x_134 > x_136);
      x_138_phi = x_137;
    }
    x_138 = x_138_phi;
    x_139_phi = x_138;
  }
  if (x_139_phi) {
    return;
  }
  float x_143 = x_10.one;
  float x_145 = x_12.x_GLF_uniform_float_values[0].el;
  if ((x_143 == x_145)) {
    i = 0;
    while (true) {
      if ((i < 2)) {
      } else {
        break;
      }
      {
        int x_154 = x;
        int x_155 = clamp(x_154, 0, 3);
        int x_156 = i;
        float x_158 = x_12.x_GLF_uniform_float_values[0].el;
        float x_160 = m[x_155][x_156];
        m[x_155][x_156] = (x_160 + x_158);
        i = (i + 1);
      }
    }
  }
  return;
}

void func1_() {
  int param = 0;
  float x_167 = tint_symbol.y;
  if ((x_167 < 0.0f)) {
    return;
  }
  param = 1;
  func0_i1_(param);
  return;
}

void main_1() {
  m = mat4x2(vec2(0.0f, 0.0f), vec2(0.0f, 0.0f), vec2(0.0f, 0.0f), vec2(0.0f, 0.0f));
  func1_();
  func1_();
  mat4x2 x_54 = m;
  int x_56 = x_16.x_GLF_uniform_int_values[0].el;
  int x_59 = x_16.x_GLF_uniform_int_values[0].el;
  int x_62 = x_16.x_GLF_uniform_int_values[1].el;
  int x_65 = x_16.x_GLF_uniform_int_values[1].el;
  int x_68 = x_16.x_GLF_uniform_int_values[0].el;
  int x_71 = x_16.x_GLF_uniform_int_values[0].el;
  int x_74 = x_16.x_GLF_uniform_int_values[0].el;
  int x_77 = x_16.x_GLF_uniform_int_values[0].el;
  mat4x2 x_83 = mat4x2(vec2(float(x_56), float(x_59)), vec2(float(x_62), float(x_65)), vec2(float(x_68), float(x_71)), vec2(float(x_74), float(x_77)));
  if ((((all(equal(x_54[0u], x_83[0u])) & all(equal(x_54[1u], x_83[1u]))) & all(equal(x_54[2u], x_83[2u]))) & all(equal(x_54[3u], x_83[3u])))) {
    int x_107 = x_16.x_GLF_uniform_int_values[3].el;
    int x_110 = x_16.x_GLF_uniform_int_values[0].el;
    int x_113 = x_16.x_GLF_uniform_int_values[0].el;
    int x_116 = x_16.x_GLF_uniform_int_values[3].el;
    x_GLF_color = vec4(float(x_107), float(x_110), float(x_113), float(x_116));
  } else {
    int x_120 = x_16.x_GLF_uniform_int_values[0].el;
    float x_121 = float(x_120);
    x_GLF_color = vec4(x_121, x_121, x_121, x_121);
  }
  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:113: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' global bool' and a right operand of type ' global bool' (or there is no acceptable conversion)
ERROR: 0:113: '' : compilation terminated 
ERROR: 2 compilation errors.  No code generated.



