SKIP: FAILED

#version 310 es
precision mediump float;

layout(location = 0) out vec4 x_GLF_color_1_1;
struct buf0 {
  uint one;
};

layout(binding = 0) uniform buf0_1 {
  uint one;
} x_6;

vec4 x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
void main_1() {
  uint a = 0u;
  uint b = 0u;
  uint c = 0u;
  uint d = 0u;
  uint e = 0u;
  uint f = 0u;
  uint x_41 = x_6.one;
  a = ((77u + x_41) >> 32u);
  uint x_45 = x_6.one;
  b = ((3243u + x_45) >> 33u);
  uint x_49 = x_6.one;
  c = ((23u + x_49) >> 345u);
  uint x_53 = x_6.one;
  d = ((2395u + x_53) << 32u);
  uint x_57 = x_6.one;
  e = ((290485u + x_57) << 33u);
  uint x_61 = x_6.one;
  f = ((44321u + x_61) << 345u);
  if ((a != 1u)) {
    a = 1u;
  }
  if ((b != 0u)) {
    b = 0u;
  }
  if ((c != 1u)) {
    c = 1u;
  }
  if ((d != 0u)) {
    d = 0u;
  }
  if ((e != 1u)) {
    e = 1u;
  }
  if ((f != 0u)) {
    f = 0u;
  }
  if (((((((a == 1u) & (b == 0u)) & (c == 1u)) & (d == 0u)) & (e == 1u)) & (f == 0u))) {
    x_GLF_color = vec4(1.0f, 0.0f, 0.0f, 1.0f);
  } else {
    x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.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:51: '&' :  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:51: '' : compilation terminated 
ERROR: 2 compilation errors.  No code generated.



