#include <metal_stdlib>

using namespace metal;
struct tint_private_vars_struct {
  int a;
  int b;
  int c;
};

void uses_a(thread tint_private_vars_struct* const tint_private_vars) {
  (*(tint_private_vars)).a = as_type<int>((as_type<uint>((*(tint_private_vars)).a) + as_type<uint>(1)));
}

void uses_b(thread tint_private_vars_struct* const tint_private_vars) {
  (*(tint_private_vars)).b = as_type<int>((as_type<uint>((*(tint_private_vars)).b) * as_type<uint>(2)));
}

void uses_a_and_b(thread tint_private_vars_struct* const tint_private_vars) {
  (*(tint_private_vars)).b = (*(tint_private_vars)).a;
}

void no_uses() {
}

void outer(thread tint_private_vars_struct* const tint_private_vars) {
  (*(tint_private_vars)).a = 0;
  uses_a(tint_private_vars);
  uses_a_and_b(tint_private_vars);
  uses_b(tint_private_vars);
  no_uses();
}

kernel void main1() {
  thread tint_private_vars_struct tint_private_vars = {};
  tint_private_vars.a = 42;
  uses_a(&(tint_private_vars));
  return;
}

kernel void main2() {
  thread tint_private_vars_struct tint_private_vars = {};
  tint_private_vars.b = 7;
  uses_b(&(tint_private_vars));
  return;
}

kernel void main3() {
  thread tint_private_vars_struct tint_private_vars = {};
  outer(&(tint_private_vars));
  no_uses();
  return;
}

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

