#include <metal_stdlib>

using namespace metal;
struct VertexInputs0 {
  uint vertex_index;
  int loc0;
};
struct VertexInputs1 {
  uint loc1;
  float4 loc3;
};
struct tint_symbol_2 {
  int loc0 [[attribute(0)]];
  uint loc1 [[attribute(1)]];
  uint loc1_1 [[attribute(2)]];
  float4 loc3 [[attribute(3)]];
};
struct tint_symbol_3 {
  float4 value [[position]];
};

float4 tint_symbol_inner(VertexInputs0 inputs0, uint loc1, uint instance_index, VertexInputs1 inputs1) {
  uint const foo = (inputs0.vertex_index + instance_index);
  return float4();
}

vertex tint_symbol_3 tint_symbol(uint vertex_index [[vertex_id]], uint instance_index [[instance_id]], tint_symbol_2 tint_symbol_1 [[stage_in]]) {
  VertexInputs0 const tint_symbol_4 = {.vertex_index=vertex_index, .loc0=tint_symbol_1.loc0};
  VertexInputs1 const tint_symbol_5 = {.loc1=tint_symbol_1.loc1_1, .loc3=tint_symbol_1.loc3};
  float4 const inner_result = tint_symbol_inner(tint_symbol_4, tint_symbol_1.loc1, instance_index, tint_symbol_5);
  tint_symbol_3 wrapper_result = {};
  wrapper_result.value = inner_result;
  return wrapper_result;
}

