#include <metal_stdlib>

using namespace metal;
struct Interface {
  int i;
  uint u;
  int4 vi;
  uint4 vu;
  float4 pos;
};
struct tint_symbol {
  int i [[user(locn0)]] [[flat]];
  uint u [[user(locn1)]] [[flat]];
  int4 vi [[user(locn2)]] [[flat]];
  uint4 vu [[user(locn3)]] [[flat]];
  float4 pos [[position]];
};
struct tint_symbol_2 {
  int i [[user(locn0)]] [[flat]];
  uint u [[user(locn1)]] [[flat]];
  int4 vi [[user(locn2)]] [[flat]];
  uint4 vu [[user(locn3)]] [[flat]];
};
struct tint_symbol_3 {
  int value [[color(0)]];
};

Interface vert_main_inner() {
  Interface const tint_symbol_4 = {};
  return tint_symbol_4;
}

vertex tint_symbol vert_main() {
  Interface const inner_result = vert_main_inner();
  tint_symbol wrapper_result = {};
  wrapper_result.i = inner_result.i;
  wrapper_result.u = inner_result.u;
  wrapper_result.vi = inner_result.vi;
  wrapper_result.vu = inner_result.vu;
  wrapper_result.pos = inner_result.pos;
  return wrapper_result;
}

int frag_main_inner(Interface inputs) {
  return inputs.i;
}

fragment tint_symbol_3 frag_main(float4 pos [[position]], tint_symbol_2 tint_symbol_1 [[stage_in]]) {
  Interface const tint_symbol_5 = {.i=tint_symbol_1.i, .u=tint_symbol_1.u, .vi=tint_symbol_1.vi, .vu=tint_symbol_1.vu, .pos=pos};
  int const inner_result_1 = frag_main_inner(tint_symbol_5);
  tint_symbol_3 wrapper_result_1 = {};
  wrapper_result_1.value = inner_result_1;
  return wrapper_result_1;
}

