struct S {
  data : i32;
};

struct buf0 {
  one : i32;
};

[[group(0), binding(0)]] var<uniform> x_11 : buf0;

var<private> x_GLF_color : vec4<f32>;

fn func_struct_S_i11_i1_(s : ptr<function, S>, x : ptr<function, i32>) -> i32 {
  let x_17 : i32 = (*(s)).data;
  if ((x_17 == 1)) {
    let x_18 : i32 = *(x);
    let x_19 : i32 = (*(s)).data;
    return (x_18 + x_19);
  } else {
    let x_21 : i32 = *(x);
    return x_21;
  }
  return 0;
}

fn main_1() {
  var a : i32;
  var arr : array<S, 1>;
  var i : i32;
  var param : S;
  var param_1 : i32;
  var param_2 : S;
  var param_3 : i32;
  a = 0;
  let x_22 : i32 = x_11.one;
  arr[0].data = x_22;
  i = 0;
  loop {
    let x_23 : i32 = i;
    let x_24 : i32 = x_11.one;
    if ((x_23 < (5 + x_24))) {
    } else {
      break;
    }
    let x_26 : i32 = i;
    if (((x_26 % 2) != 0)) {
      let x_74 : S = arr[0];
      param = x_74;
      let x_28 : i32 = i;
      param_1 = x_28;
      let x_29 : i32 = func_struct_S_i11_i1_(&(param), &(param_1));
      let x_75 : S = param;
      arr[0] = x_75;
      a = x_29;
    } else {
      let x_78 : S = arr[0];
      param_2 = x_78;
      param_3 = 1;
      let x_30 : i32 = func_struct_S_i11_i1_(&(param_2), &(param_3));
      let x_79 : S = param_2;
      arr[0] = x_79;
      a = x_30;
    }

    continuing {
      let x_31 : i32 = i;
      i = (x_31 + 1);
    }
  }
  let x_33 : i32 = a;
  if ((x_33 == 6)) {
    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
  } else {
    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
  }
  return;
}

struct main_out {
  [[location(0)]]
  x_GLF_color_1 : vec4<f32>;
};

[[stage(fragment)]]
fn main() -> main_out {
  main_1();
  return main_out(x_GLF_color);
}
