struct S {
  arr : array<i32, 2>;
};

[[block]]
struct buf0 {
  one : i32;
};

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

var<private> x_GLF_color : vec4<f32>;

fn func_struct_S_i1_2_1_i1_(s : ptr<function, S>, x : ptr<function, i32>) -> i32 {
  let x_16 : i32 = *(x);
  (*(s)).arr[1] = (x_16 + 1);
  let x_18 : i32 = x_9.one;
  let x_19 : i32 = (*(s)).arr[x_18];
  let x_20 : i32 = *(x);
  if ((x_19 == x_20)) {
    return -1;
  }
  let x_21 : i32 = *(x);
  return x_21;
}

fn main_1() {
  var a : i32;
  var i : i32;
  var j : i32;
  var s_1 : S;
  var param : S;
  var param_1 : i32;
  a = 0;
  i = 0;
  loop {
    let x_22 : i32 = i;
    let x_23 : i32 = x_9.one;
    if ((x_22 < (2 + x_23))) {
    } else {
      break;
    }
    j = 0;
    loop {
      let x_25 : i32 = j;
      let x_26 : i32 = x_9.one;
      if ((x_25 < (3 + x_26))) {
      } else {
        break;
      }
      let x_28 : i32 = i;
      let x_29 : i32 = j;
      let x_79 : S = s_1;
      param = x_79;
      param_1 = (x_28 + x_29);
      let x_31 : i32 = func_struct_S_i1_2_1_i1_(&(param), &(param_1));
      let x_32 : i32 = a;
      a = (x_32 + x_31);

      continuing {
        let x_34 : i32 = j;
        j = (x_34 + 1);
      }
    }

    continuing {
      let x_36 : i32 = i;
      i = (x_36 + 1);
    }
  }
  let x_38 : i32 = a;
  if ((x_38 == 30)) {
    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);
}
