#include <metal_stdlib>

using namespace metal;
struct S {
  float field0;
  float field1;
  float field2;
  float field3;
  float field4;
  float field5;
};
struct main_out {
  float x_1_1;
  float x_1_2;
  float x_1_3;
  float x_1_4;
  float x_1_5;
  float x_1_6;
};
struct tint_symbol_1 {
  float x_1_1 [[color(1)]];
  float x_1_2 [[color(2)]] [[centroid_perspective]];
  float x_1_3 [[color(3)]] [[sample_perspective]];
  float x_1_4 [[color(4)]] [[no_perspective]];
  float x_1_5 [[color(5)]] [[centroid_no_perspective]];
  float x_1_6 [[color(6)]] [[sample_no_perspective]];
};

void main_1() {
  return;
}

main_out tint_symbol_inner(thread S* const tint_symbol_3) {
  main_1();
  main_out const tint_symbol_2 = {.x_1_1=(*(tint_symbol_3)).field0, .x_1_2=(*(tint_symbol_3)).field1, .x_1_3=(*(tint_symbol_3)).field2, .x_1_4=(*(tint_symbol_3)).field3, .x_1_5=(*(tint_symbol_3)).field4, .x_1_6=(*(tint_symbol_3)).field5};
  return tint_symbol_2;
}

fragment tint_symbol_1 tint_symbol() {
  thread S tint_symbol_4 = {};
  main_out const inner_result = tint_symbol_inner(&(tint_symbol_4));
  tint_symbol_1 wrapper_result = {};
  wrapper_result.x_1_1 = inner_result.x_1_1;
  wrapper_result.x_1_2 = inner_result.x_1_2;
  wrapper_result.x_1_3 = inner_result.x_1_3;
  wrapper_result.x_1_4 = inner_result.x_1_4;
  wrapper_result.x_1_5 = inner_result.x_1_5;
  wrapper_result.x_1_6 = inner_result.x_1_6;
  return wrapper_result;
}

