SKIP: FAILED

#version 310 es
precision mediump float;

struct tint_padded_array_element {
  float el;
};
struct buf1 {
  tint_padded_array_element x_GLF_uniform_float_values[2];
};
struct tint_padded_array_element_1 {
  int el;
};
struct buf0 {
  tint_padded_array_element_1 x_GLF_uniform_int_values[3];
};

layout(binding = 1) uniform buf1_1 {
  tint_padded_array_element x_GLF_uniform_float_values[2];
} x_6;
layout(binding = 0) uniform buf0_1 {
  tint_padded_array_element_1 x_GLF_uniform_int_values[3];
} x_8;
vec4 x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);

void main_1() {
  mat3x2 m32 = mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
  float sums[3] = float[3](0.0f, 0.0f, 0.0f);
  int x_52_phi = 0;
  float x_40 = x_6.x_GLF_uniform_float_values[0].el;
  m32 = mat3x2(vec2(x_40, 0.0f), vec2(0.0f, x_40), vec2(0.0f, 0.0f));
  int x_45 = x_8.x_GLF_uniform_int_values[0].el;
  if ((x_45 == 1)) {
    m32[3][x_45] = x_40;
  }
  float tint_symbol_2[3] = float[3](x_40, x_40, x_40);
  sums = tint_symbol_2;
  x_52_phi = x_45;
  while (true) {
    int x_53 = 0;
    int x_52 = x_52_phi;
    int x_56 = x_8.x_GLF_uniform_int_values[2].el;
    if ((x_52 < x_56)) {
    } else {
      break;
    }
    {
      float x_60 = m32[x_52][x_45];
      int x_61_save = x_56;
      float x_62 = sums[x_61_save];
      sums[x_61_save] = (x_62 + x_60);
      x_53 = (x_52 + 1);
      x_52_phi = x_53;
    }
  }
  float x_65 = sums[x_45];
  float x_67 = x_6.x_GLF_uniform_float_values[1].el;
  int x_69 = x_8.x_GLF_uniform_int_values[1].el;
  float x_71 = sums[x_69];
  x_GLF_color = vec4(x_65, x_67, x_67, x_71);
  return;
}

struct main_out {
  vec4 x_GLF_color_1;
};
struct tint_symbol_1 {
  vec4 x_GLF_color_1;
};

main_out tint_symbol_inner() {
  main_1();
  main_out tint_symbol_3 = main_out(x_GLF_color);
  return tint_symbol_3;
}

tint_symbol_1 tint_symbol() {
  main_out inner_result = tint_symbol_inner();
  tint_symbol_1 wrapper_result = tint_symbol_1(vec4(0.0f, 0.0f, 0.0f, 0.0f));
  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
  return wrapper_result;
}
layout(location = 0) out vec4 x_GLF_color_1;
void main() {
  tint_symbol_1 outputs;
  outputs = tint_symbol();
  x_GLF_color_1 = outputs.x_GLF_color_1;
}


Error parsing GLSL shader:
ERROR: 0:33: '[' :  matrix index out of range '3'
ERROR: 0:33: '' : compilation terminated 
ERROR: 2 compilation errors.  No code generated.



