SKIP: FAILED

struct BST {
  int data;
  int leftIndex;
  int rightIndex;
};
struct QuicksortObject {
  int numbers[10];
};

static QuicksortObject obj = (QuicksortObject)0;
static BST tree[10] = (BST[10])0;
cbuffer cbuffer_x_50 : register(b0, space0) {
  uint4 x_50[1];
};
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_208 = data;
  node.data = x_208;
  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_217 = baseIndex;
    const int x_218 = treeIndex;
    if ((x_217 <= x_218)) {
    } else {
      break;
    }
    const int x_221 = data_1;
    const int x_224 = tree[baseIndex].data;
    if ((x_221 <= x_224)) {
      const int x_231 = tree[baseIndex].leftIndex;
      if ((x_231 == -1)) {
        const int x_236 = baseIndex;
        const int x_237 = treeIndex;
        tree[x_236].leftIndex = x_237;
        const int x_239 = treeIndex;
        const BST x_241 = tree[x_239];
        param = x_241;
        const int x_242 = data_1;
        param_1 = x_242;
        makeTreeNode_struct_BST_i1_i1_i11_i1_(param, param_1);
        tree[x_239] = param;
        return;
      } else {
        const int x_248 = tree[baseIndex].leftIndex;
        baseIndex = x_248;
        continue;
      }
      return;
    } else {
      const int x_251 = tree[baseIndex].rightIndex;
      if ((x_251 == -1)) {
        const int x_256 = baseIndex;
        const int x_257 = treeIndex;
        tree[x_256].rightIndex = x_257;
        const int x_259 = treeIndex;
        const BST x_261 = tree[x_259];
        param_2 = x_261;
        const int x_262 = data_1;
        param_3 = x_262;
        makeTreeNode_struct_BST_i1_i1_i11_i1_(param_2, param_3);
        tree[x_259] = param_2;
        return;
      } else {
        const int x_268 = tree[baseIndex].rightIndex;
        baseIndex = x_268;
        continue;
      }
      return;
    }
    return;
  }
  return;
}

int identity_i1_(inout int a) {
  const int x_202 = a;
  const int x_203 = a;
  obj.numbers[x_202] = x_203;
  const int x_206 = obj.numbers[2];
  return x_206;
}

int search_i1_(inout int target) {
  int index = 0;
  BST currentNode = (BST)0;
  int x_270 = 0;
  index = 0;
  while (true) {
    if ((index != -1)) {
    } else {
      break;
    }
    const BST x_280 = tree[index];
    currentNode = x_280;
    const int x_282 = currentNode.data;
    const int x_283 = target;
    if ((x_282 == x_283)) {
      const int x_287 = target;
      return x_287;
    }
    const int x_288 = target;
    const int x_290 = currentNode.data;
    if ((x_288 > x_290)) {
      const int x_296 = currentNode.rightIndex;
      x_270 = x_296;
    } else {
      const int x_298 = currentNode.leftIndex;
      x_270 = x_298;
    }
    index = x_270;
  }
  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 pp = 0;
  int looplimiter0 = 0;
  int i = 0;
  int param_24 = 0;
  int count = 0;
  int i_1 = 0;
  int result = 0;
  int param_25 = 0;
  treeIndex_1 = 0;
  const BST x_101 = tree[0];
  param_4 = x_101;
  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);
  pp = 0;
  looplimiter0 = 0;
  i = 0;
  {
    for(; (i < 10000); i = (i + 1)) {
      const int x_148 = looplimiter0;
      const float x_150 = asfloat(x_50[0].y);
      if ((x_148 >= int(x_150))) {
        const float x_156 = asfloat(x_50[0].y);
        param_24 = (1 + int(x_156));
        const int x_159 = identity_i1_(param_24);
        pp = x_159;
        break;
      }
      looplimiter0 = (looplimiter0 + 1);
    }
  }
  if ((pp != 2)) {
    return;
  }
  count = 0;
  i_1 = 0;
  {
    for(; (i_1 < 20); i_1 = (i_1 + 1)) {
      param_25 = i_1;
      const int x_176 = search_i1_(param_25);
      result = x_176;
      switch(i_1) {
        case 2:
        case 5:
        case 6:
        case 7:
        case 8:
        case 9:
        case 12:
        case 13:
        case 15:
        case 17: {
          if ((result == i_1)) {
            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_3 = {tint_symbol_1.x_GLF_color_1};
  return tint_symbol_3;
}
C:\src\tint\test\Shader@0x000002670FAA27F0(32,3-14): warning X3557: loop only executes for 0 iteration(s), forcing loop to unroll
C:\src\tint\test\Shader@0x000002670FAA27F0(32,3-14): warning X3557: loop only executes for 0 iteration(s), forcing loop to unroll
C:\src\tint\test\Shader@0x000002670FAA27F0(32,3-14): warning X3557: loop only executes for 1 iteration(s), forcing loop to unroll
C:\src\tint\test\Shader@0x000002670FAA27F0(32,3-14): warning X3557: loop only executes for 1 iteration(s), forcing loop to unroll
C:\src\tint\test\Shader@0x000002670FAA27F0(90,3-20): error X3500: array reference cannot be used as an l-value; not natively addressable
C:\src\tint\test\Shader@0x000002670FAA27F0(203,5-35): error X3511: forced to unroll loop, but unrolling failed.

