13883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher// RUN: %clang_cc1 -emit-llvm %s  -o /dev/null
23883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher
33883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher// Test list stuff
43883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher
53883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christophervoid *malloc(unsigned);
63883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher
73883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher// Test opaque structure support.  the list type is defined later
83883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopherstruct list;
93883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher
103883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopherstruct list *PassThroughList(struct list *L) {
113883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher  return L;
123883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher}
133883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher
143883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher
153883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher// Recursive data structure tests...
163883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher
173883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christophertypedef struct list {
183883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher  int Data;
193883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher  struct list *Next;
203883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher} list;
213883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher
223883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopherlist *Data;
233883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher
243883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christophervoid foo() {
253883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher  static int Foo = 0;            // Test static local variable
263883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher  Foo += 1;                      // Increment static variable
273883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher
283883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher  Data = (list*)malloc(12);      // This is not a proper list allocation
293883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher}
303883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher
313883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopherextern list ListNode1;
323883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopherlist ListNode3 = { 4, 0          };
333883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopherlist ListNode2 = { 3, &ListNode3 };
343883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopherlist ListNode0 = { 1, &ListNode1 };
353883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopherlist ListNode1 = { 2, &ListNode2 };
363883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher
373883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher
383883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopherlist ListArray[10];
393883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher
403883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher// Iterative insert fn
413883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christophervoid InsertIntoListTail(list **L, int Data) {
423883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher  while (*L)
433883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher    L = &(*L)->Next;
443883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher  *L = (list*)malloc(sizeof(list));
453883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher  (*L)->Data = Data;
463883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher  (*L)->Next = 0;
473883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher}
483883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher
493883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher// Recursive list search fn
503883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopherlist *FindData(list *L, int Data) {
513883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher  if (L == 0) return 0;
523883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher  if (L->Data == Data) return L;
533883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher  return FindData(L->Next, Data);
543883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher}
553883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher
563883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christophervoid foundIt(void);
573883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher
583883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher// Driver fn...
593883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christophervoid DoListStuff() {
603883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher  list *MyList = 0;
613883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher  InsertIntoListTail(&MyList, 100);
623883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher  InsertIntoListTail(&MyList, 12);
633883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher  InsertIntoListTail(&MyList, 42);
643883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher  InsertIntoListTail(&MyList, 1123);
653883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher  InsertIntoListTail(&MyList, 1213);
663883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher
673883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher  if (FindData(MyList, 75)) foundIt();
683883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher  if (FindData(MyList, 42)) foundIt();
693883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher  if (FindData(MyList, 700)) foundIt();
703883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher}
713883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher
72