#include <metal_stdlib>

using namespace metal;
struct main_out {
  float4 gl_Position;
  uint pos_1;
};
struct tint_symbol_2 {
  float4 position_param [[attribute(0)]];
};
struct tint_symbol_3 {
  uint pos_1 [[user(locn0)]];
  float4 gl_Position [[position]];
};

void main_1(thread float4* const tint_symbol_5, thread float4* const tint_symbol_6, thread uint* const tint_symbol_7) {
  float4 const x_22 = *(tint_symbol_5);
  *(tint_symbol_6) = x_22;
  *(tint_symbol_7) = 0u;
  return;
}

main_out tint_symbol_inner(float4 position_param, thread float4* const tint_symbol_8, thread float4* const tint_symbol_9, thread uint* const tint_symbol_10) {
  *(tint_symbol_8) = position_param;
  main_1(tint_symbol_8, tint_symbol_9, tint_symbol_10);
  main_out const tint_symbol_4 = {.gl_Position=*(tint_symbol_9), .pos_1=*(tint_symbol_10)};
  return tint_symbol_4;
}

vertex tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]]) {
  thread float4 tint_symbol_11 = 0.0f;
  thread float4 tint_symbol_12 = 0.0f;
  thread uint tint_symbol_13 = 0u;
  main_out const inner_result = tint_symbol_inner(tint_symbol_1.position_param, &(tint_symbol_11), &(tint_symbol_12), &(tint_symbol_13));
  tint_symbol_3 wrapper_result = {};
  wrapper_result.gl_Position = inner_result.gl_Position;
  wrapper_result.pos_1 = inner_result.pos_1;
  return wrapper_result;
}

