// RUN: %clang_cc1 -emit-llvm %s  -o /dev/null

// Test list stuff

void *malloc(unsigned);

// Test opaque structure support.  the list type is defined later
struct list;

struct list *PassThroughList(struct list *L) {
  return L;
}


// Recursive data structure tests...

typedef struct list {
  int Data;
  struct list *Next;
} list;

list *Data;

void foo(void) {
  static int Foo = 0;            // Test static local variable
  Foo += 1;                      // Increment static variable

  Data = (list*)malloc(12);      // This is not a proper list allocation
}

extern list ListNode1;
list ListNode3 = { 4, 0          };
list ListNode2 = { 3, &ListNode3 };
list ListNode0 = { 1, &ListNode1 };
list ListNode1 = { 2, &ListNode2 };


list ListArray[10];

// Iterative insert fn
void InsertIntoListTail(list **L, int Data) {
  while (*L)
    L = &(*L)->Next;
  *L = (list*)malloc(sizeof(list));
  (*L)->Data = Data;
  (*L)->Next = 0;
}

// Recursive list search fn
list *FindData(list *L, int Data) {
  if (L == 0) return 0;
  if (L->Data == Data) return L;
  return FindData(L->Next, Data);
}

void foundIt(void);

// Driver fn...
void DoListStuff(void) {
  list *MyList = 0;
  InsertIntoListTail(&MyList, 100);
  InsertIntoListTail(&MyList, 12);
  InsertIntoListTail(&MyList, 42);
  InsertIntoListTail(&MyList, 1123);
  InsertIntoListTail(&MyList, 1213);

  if (FindData(MyList, 75)) foundIt();
  if (FindData(MyList, 42)) foundIt();
  if (FindData(MyList, 700)) foundIt();
}

