#include <metal_stdlib>

using namespace metal;
struct Communicators {
  float alice;
  float4 bob;
};
struct main_out {
  float4 x_2_1;
  float x_3_1;
  float4 x_3_2;
};
struct tint_symbol_2 {
  float x_1_param [[attribute(9)]];
  float4 x_1_param_1 [[attribute(11)]];
};
struct tint_symbol_3 {
  float x_3_1 [[user(locn9)]];
  float4 x_3_2 [[user(locn11)]];
  float4 x_2_1 [[position]];
};

void main_1() {
  return;
}

main_out tint_symbol_inner(float x_1_param, float4 x_1_param_1, thread Communicators* const tint_symbol_5, thread float4* const tint_symbol_6, thread Communicators* const tint_symbol_7) {
  (*(tint_symbol_5)).alice = x_1_param;
  (*(tint_symbol_5)).bob = x_1_param_1;
  main_1();
  main_out const tint_symbol_4 = {.x_2_1=*(tint_symbol_6), .x_3_1=(*(tint_symbol_7)).alice, .x_3_2=(*(tint_symbol_7)).bob};
  return tint_symbol_4;
}

vertex tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]]) {
  thread Communicators tint_symbol_8 = {};
  thread float4 tint_symbol_9 = 0.0f;
  thread Communicators tint_symbol_10 = {};
  main_out const inner_result = tint_symbol_inner(tint_symbol_1.x_1_param, tint_symbol_1.x_1_param_1, &(tint_symbol_8), &(tint_symbol_9), &(tint_symbol_10));
  tint_symbol_3 wrapper_result = {};
  wrapper_result.x_2_1 = inner_result.x_2_1;
  wrapper_result.x_3_1 = inner_result.x_3_1;
  wrapper_result.x_3_2 = inner_result.x_3_2;
  return wrapper_result;
}

