#include <metal_stdlib>

using namespace metal;
void uses_a(thread int* const tint_symbol) {
  *(tint_symbol) = (*(tint_symbol) + 1);
}

void uses_b(thread int* const tint_symbol_1) {
  *(tint_symbol_1) = (*(tint_symbol_1) * 2);
}

void uses_a_and_b(thread int* const tint_symbol_2, thread int* const tint_symbol_3) {
  *(tint_symbol_2) = *(tint_symbol_3);
}

void no_uses() {
}

void outer(thread int* const tint_symbol_4, thread int* const tint_symbol_5) {
  *(tint_symbol_4) = 0;
  uses_a(tint_symbol_4);
  uses_a_and_b(tint_symbol_5, tint_symbol_4);
  uses_b(tint_symbol_5);
  no_uses();
}

kernel void main1() {
  thread int tint_symbol_7 = 0;
  thread int* const tint_symbol_6 = &(tint_symbol_7);
  *(tint_symbol_6) = 42;
  uses_a(tint_symbol_6);
  return;
}

kernel void main2() {
  thread int tint_symbol_9 = 0;
  thread int* const tint_symbol_8 = &(tint_symbol_9);
  *(tint_symbol_8) = 7;
  uses_b(tint_symbol_8);
  return;
}

kernel void main3() {
  thread int tint_symbol_11 = 0;
  thread int* const tint_symbol_10 = &(tint_symbol_11);
  thread int tint_symbol_13 = 0;
  thread int* const tint_symbol_12 = &(tint_symbol_13);
  outer(tint_symbol_10, tint_symbol_12);
  no_uses();
  return;
}

kernel void main4() {
  no_uses();
  return;
}

