SKIP: FAILED

struct BST {
  int data;
  int leftIndex;
  int rightIndex;
};

static BST tree[10] = (BST[10])0;
static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);

void makeTreeNode_struct_BST_i1_i1_i11_i1_(inout BST node, inout int data) {
  const int x_158 = data;
  node.data = x_158;
  node.leftIndex = -1;
  node.rightIndex = -1;
  return;
}

void insert_i1_i1_(inout int treeIndex, inout int data_1) {
  int baseIndex = 0;
  BST param = (BST)0;
  int param_1 = 0;
  BST param_2 = (BST)0;
  int param_3 = 0;
  baseIndex = 0;
  while (true) {
    const int x_167 = baseIndex;
    const int x_168 = treeIndex;
    if ((x_167 <= x_168)) {
    } else {
      break;
    }
    const int x_171 = data_1;
    const int x_174 = tree[baseIndex].data;
    if ((x_171 <= x_174)) {
      const int x_181 = tree[baseIndex].leftIndex;
      if ((x_181 == -1)) {
        const int x_186 = baseIndex;
        const int x_187 = treeIndex;
        tree[x_186].leftIndex = x_187;
        const int x_189 = treeIndex;
        const BST x_191 = tree[x_189];
        param = x_191;
        const int x_192 = data_1;
        param_1 = x_192;
        makeTreeNode_struct_BST_i1_i1_i11_i1_(param, param_1);
        tree[x_189] = param;
        return;
      } else {
        const int x_198 = tree[baseIndex].leftIndex;
        baseIndex = x_198;
        continue;
      }
      return;
    } else {
      const int x_201 = tree[baseIndex].rightIndex;
      if ((x_201 == -1)) {
        const int x_206 = baseIndex;
        const int x_207 = treeIndex;
        tree[x_206].rightIndex = x_207;
        const int x_209 = treeIndex;
        const BST x_211 = tree[x_209];
        param_2 = x_211;
        const int x_212 = data_1;
        param_3 = x_212;
        makeTreeNode_struct_BST_i1_i1_i11_i1_(param_2, param_3);
        tree[x_209] = param_2;
        return;
      } else {
        const int x_218 = tree[baseIndex].rightIndex;
        baseIndex = x_218;
        continue;
      }
      return;
    }
    return;
  }
  return;
}

int search_i1_(inout int target) {
  int index = 0;
  BST currentNode = (BST)0;
  int x_220 = 0;
  index = 0;
  while (true) {
    if ((index != -1)) {
    } else {
      break;
    }
    const BST x_230 = tree[index];
    currentNode = x_230;
    const int x_232 = currentNode.data;
    const int x_233 = target;
    if ((x_232 == x_233)) {
      const int x_237 = target;
      return x_237;
    }
    const int x_238 = target;
    const int x_240 = currentNode.data;
    if ((x_238 > x_240)) {
      const int x_246 = currentNode.rightIndex;
      x_220 = x_246;
    } else {
      const int x_248 = currentNode.leftIndex;
      x_220 = x_248;
    }
    index = x_220;
  }
  return -1;
}

void main_1() {
  int treeIndex_1 = 0;
  BST param_4 = (BST)0;
  int param_5 = 0;
  int param_6 = 0;
  int param_7 = 0;
  int param_8 = 0;
  int param_9 = 0;
  int param_10 = 0;
  int param_11 = 0;
  int param_12 = 0;
  int param_13 = 0;
  int param_14 = 0;
  int param_15 = 0;
  int param_16 = 0;
  int param_17 = 0;
  int param_18 = 0;
  int param_19 = 0;
  int param_20 = 0;
  int param_21 = 0;
  int param_22 = 0;
  int param_23 = 0;
  int count = 0;
  int i = 0;
  int result = 0;
  int param_24 = 0;
  treeIndex_1 = 0;
  const BST x_84 = tree[0];
  param_4 = x_84;
  param_5 = 9;
  makeTreeNode_struct_BST_i1_i1_i11_i1_(param_4, param_5);
  tree[0] = param_4;
  treeIndex_1 = (treeIndex_1 + 1);
  param_6 = treeIndex_1;
  param_7 = 5;
  insert_i1_i1_(param_6, param_7);
  treeIndex_1 = (treeIndex_1 + 1);
  param_8 = treeIndex_1;
  param_9 = 12;
  insert_i1_i1_(param_8, param_9);
  treeIndex_1 = (treeIndex_1 + 1);
  param_10 = treeIndex_1;
  param_11 = 15;
  insert_i1_i1_(param_10, param_11);
  treeIndex_1 = (treeIndex_1 + 1);
  param_12 = treeIndex_1;
  param_13 = 7;
  insert_i1_i1_(param_12, param_13);
  treeIndex_1 = (treeIndex_1 + 1);
  param_14 = treeIndex_1;
  param_15 = 8;
  insert_i1_i1_(param_14, param_15);
  treeIndex_1 = (treeIndex_1 + 1);
  param_16 = treeIndex_1;
  param_17 = 2;
  insert_i1_i1_(param_16, param_17);
  treeIndex_1 = (treeIndex_1 + 1);
  param_18 = treeIndex_1;
  param_19 = 6;
  insert_i1_i1_(param_18, param_19);
  treeIndex_1 = (treeIndex_1 + 1);
  param_20 = treeIndex_1;
  param_21 = 17;
  insert_i1_i1_(param_20, param_21);
  treeIndex_1 = (treeIndex_1 + 1);
  param_22 = treeIndex_1;
  param_23 = 13;
  insert_i1_i1_(param_22, param_23);
  count = 0;
  i = 0;
  {
    for(; (i < 20); i = (i + 1)) {
      param_24 = i;
      const int x_132 = search_i1_(param_24);
      result = x_132;
      switch(i) {
        case 2:
        case 5:
        case 6:
        case 7:
        case 8:
        case 9:
        case 12:
        case 13:
        case 15:
        case 17: {
          if ((result == i)) {
            count = (count + 1);
          }
          break;
        }
        default: {
          if ((result == -1)) {
            count = (count + 1);
          }
          break;
        }
      }
    }
  }
  if ((count == 20)) {
    x_GLF_color = float4(1.0f, 0.0f, 0.0f, 1.0f);
  } else {
    x_GLF_color = float4(0.0f, 0.0f, 1.0f, 1.0f);
  }
  return;
}

struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol {
  float4 x_GLF_color_1 : SV_Target0;
};

tint_symbol main() {
  main_1();
  const main_out tint_symbol_1 = {x_GLF_color};
  const tint_symbol tint_symbol_2 = {tint_symbol_1.x_GLF_color_1};
  return tint_symbol_2;
}
C:\src\tint\test\Shader@0x000001C35344C010(25,3-14): warning X3557: loop only executes for 0 iteration(s), forcing loop to unroll
C:\src\tint\test\Shader@0x000001C35344C010(25,3-14): warning X3557: loop only executes for 0 iteration(s), forcing loop to unroll
C:\src\tint\test\Shader@0x000001C35344C010(25,3-14): warning X3557: loop only executes for 1 iteration(s), forcing loop to unroll
C:\src\tint\test\Shader@0x000001C35344C010(25,3-14): warning X3557: loop only executes for 1 iteration(s), forcing loop to unroll
internal error: compilation aborted unexpectedly

