#include <metal_stdlib>

using namespace metal;
struct S {
  float field0;
  float field1;
};
struct tint_array_wrapper {
  float arr[2];
};
struct tint_symbol_2 {
  float x_1_param [[user(locn1)]] [[flat]];
  float x_1_param_1 [[user(locn2)]] [[flat]];
  float x_2_param [[user(locn5)]] [[flat]];
  float x_2_param_1 [[user(locn6)]] [[flat]];
};

void main_1() {
  return;
}

void tint_symbol_inner(float x_1_param, float x_1_param_1, float x_2_param, float x_2_param_1, thread tint_array_wrapper* const tint_symbol_3, thread S* const tint_symbol_4) {
  (*(tint_symbol_3)).arr[0] = x_1_param;
  (*(tint_symbol_3)).arr[1] = x_1_param_1;
  (*(tint_symbol_4)).field0 = x_2_param;
  (*(tint_symbol_4)).field1 = x_2_param_1;
  main_1();
}

fragment void tint_symbol(tint_symbol_2 tint_symbol_1 [[stage_in]]) {
  thread tint_array_wrapper tint_symbol_5 = {};
  thread S tint_symbol_6 = {};
  tint_symbol_inner(tint_symbol_1.x_1_param, tint_symbol_1.x_1_param_1, tint_symbol_1.x_2_param, tint_symbol_1.x_2_param_1, &(tint_symbol_5), &(tint_symbol_6));
  return;
}

