SKIP: FAILED

#version 310 es
precision mediump float;

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

struct buf0 {
  vec2 resolution;
};

layout(binding = 1) uniform buf1_1 {
  vec2 injectionSwitch;
} x_11;

vec4 x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
vec4 tint_symbol = vec4(0.0f, 0.0f, 0.0f, 0.0f);
layout(binding = 0) uniform buf0_1 {
  vec2 resolution;
} x_19;

int pointInTriangle_vf2_vf2_vf2_vf2_(inout vec2 p, inout vec2 a, inout vec2 b, inout vec2 c) {
  float x_78 = 0.0f;
  float x_79 = 0.0f;
  float x_80 = 0.0f;
  vec2 param = vec2(0.0f, 0.0f);
  vec2 param_1 = vec2(0.0f, 0.0f);
  vec2 param_2 = vec2(0.0f, 0.0f);
  vec2 param_3 = vec2(0.0f, 0.0f);
  vec2 param_4 = vec2(0.0f, 0.0f);
  vec2 param_5 = vec2(0.0f, 0.0f);
  bool x_147 = false;
  bool x_203 = false;
  bool x_148_phi = false;
  bool x_204_phi = false;
  float x_82 = p.x;
  float x_84 = a.x;
  float x_87 = p.y;
  float x_89 = a.y;
  float x_93 = b.x;
  float x_94 = a.x;
  float x_97 = b.y;
  float x_98 = a.y;
  param = vec2((x_82 - x_84), (x_87 - x_89));
  param_1 = vec2((x_93 - x_94), (x_97 - x_98));
  float x_102 = param.x;
  float x_104 = param_1.y;
  float x_107 = param_1.x;
  float x_109 = param.y;
  float x_111 = ((x_102 * x_104) - (x_107 * x_109));
  x_80 = x_111;
  float x_112 = p.x;
  float x_113 = b.x;
  float x_115 = p.y;
  float x_116 = b.y;
  float x_120 = c.x;
  float x_121 = b.x;
  float x_124 = c.y;
  float x_125 = b.y;
  param_2 = vec2((x_112 - x_113), (x_115 - x_116));
  param_3 = vec2((x_120 - x_121), (x_124 - x_125));
  float x_129 = param_2.x;
  float x_131 = param_3.y;
  float x_134 = param_3.x;
  float x_136 = param_2.y;
  float x_138 = ((x_129 * x_131) - (x_134 * x_136));
  x_79 = x_138;
  bool x_139 = (x_111 < 0.0f);
  bool x_141 = (x_139 & (x_138 < 0.0f));
  x_148_phi = x_141;
  if (!(x_141)) {
    x_147 = ((x_111 >= 0.0f) & (x_138 >= 0.0f));
    x_148_phi = x_147;
  }
  int x_153_phi = 0;
  if (!(x_148_phi)) {
    x_153_phi = 0;
    while (true) {
      int x_154 = 0;
      int x_164_phi = 0;
      int x_153 = x_153_phi;
      float x_159 = x_11.injectionSwitch.y;
      int x_160 = int(x_159);
      if ((x_153 < x_160)) {
      } else {
        break;
      }
      x_GLF_color = vec4(1.0f, 1.0f, 1.0f, 1.0f);
      x_164_phi = 0;
      while (true) {
        int x_165 = 0;
        int x_164 = x_164_phi;
        if ((x_164 < x_160)) {
        } else {
          break;
        }
        x_GLF_color = vec4(1.0f, 1.0f, 1.0f, 1.0f);
        {
          x_165 = (x_164 + 1);
          x_164_phi = x_165;
        }
      }
      {
        x_154 = (x_153 + 1);
        x_153_phi = x_154;
      }
    }
    return 0;
  }
  float x_171 = p.x;
  float x_172 = c.x;
  float x_174 = p.y;
  float x_175 = c.y;
  float x_178 = a.x;
  float x_179 = c.x;
  float x_181 = a.y;
  float x_182 = c.y;
  param_4 = vec2((x_171 - x_172), (x_174 - x_175));
  param_5 = vec2((x_178 - x_179), (x_181 - x_182));
  float x_186 = param_4.x;
  float x_188 = param_5.y;
  float x_191 = param_5.x;
  float x_193 = param_4.y;
  float x_195 = ((x_186 * x_188) - (x_191 * x_193));
  x_78 = x_195;
  bool x_197 = (x_139 & (x_195 < 0.0f));
  x_204_phi = x_197;
  if (!(x_197)) {
    x_203 = ((x_111 >= 0.0f) & (x_195 >= 0.0f));
    x_204_phi = x_203;
  }
  if (!(x_204_phi)) {
    return 0;
  }
  return 1;
}

void main_1() {
  vec2 param_6 = vec2(0.0f, 0.0f);
  vec2 param_7 = vec2(0.0f, 0.0f);
  vec2 param_8 = vec2(0.0f, 0.0f);
  vec2 param_9 = vec2(0.0f, 0.0f);
  vec4 x_60 = tint_symbol;
  vec2 x_63 = x_19.resolution;
  param_6 = (vec2(x_60.x, x_60.y) / x_63);
  param_7 = vec2(0.699999988f, 0.300000012f);
  param_8 = vec2(0.5f, 0.899999976f);
  param_9 = vec2(0.100000001f, 0.400000006f);
  int x_65 = pointInTriangle_vf2_vf2_vf2_vf2_(param_6, param_7, param_8, param_9);
  if ((x_65 == 1)) {
    float x_71 = x_11.injectionSwitch.y;
    float x_73 = x_11.injectionSwitch.x;
    if ((x_71 >= x_73)) {
      x_GLF_color = vec4(1.0f, 0.0f, 0.0f, 1.0f);
    }
  } else {
    x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 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:70: '&' :  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:70: '' : compilation terminated 
ERROR: 2 compilation errors.  No code generated.



