1*67e74705SXin Li // RUN: %clang_cc1 -emit-llvm %s -o /dev/null
2*67e74705SXin Li
3*67e74705SXin Li // Test list stuff
4*67e74705SXin Li
5*67e74705SXin Li void *malloc(unsigned);
6*67e74705SXin Li
7*67e74705SXin Li // Test opaque structure support. the list type is defined later
8*67e74705SXin Li struct list;
9*67e74705SXin Li
PassThroughList(struct list * L)10*67e74705SXin Li struct list *PassThroughList(struct list *L) {
11*67e74705SXin Li return L;
12*67e74705SXin Li }
13*67e74705SXin Li
14*67e74705SXin Li
15*67e74705SXin Li // Recursive data structure tests...
16*67e74705SXin Li
17*67e74705SXin Li typedef struct list {
18*67e74705SXin Li int Data;
19*67e74705SXin Li struct list *Next;
20*67e74705SXin Li } list;
21*67e74705SXin Li
22*67e74705SXin Li list *Data;
23*67e74705SXin Li
foo()24*67e74705SXin Li void foo() {
25*67e74705SXin Li static int Foo = 0; // Test static local variable
26*67e74705SXin Li Foo += 1; // Increment static variable
27*67e74705SXin Li
28*67e74705SXin Li Data = (list*)malloc(12); // This is not a proper list allocation
29*67e74705SXin Li }
30*67e74705SXin Li
31*67e74705SXin Li extern list ListNode1;
32*67e74705SXin Li list ListNode3 = { 4, 0 };
33*67e74705SXin Li list ListNode2 = { 3, &ListNode3 };
34*67e74705SXin Li list ListNode0 = { 1, &ListNode1 };
35*67e74705SXin Li list ListNode1 = { 2, &ListNode2 };
36*67e74705SXin Li
37*67e74705SXin Li
38*67e74705SXin Li list ListArray[10];
39*67e74705SXin Li
40*67e74705SXin Li // Iterative insert fn
InsertIntoListTail(list ** L,int Data)41*67e74705SXin Li void InsertIntoListTail(list **L, int Data) {
42*67e74705SXin Li while (*L)
43*67e74705SXin Li L = &(*L)->Next;
44*67e74705SXin Li *L = (list*)malloc(sizeof(list));
45*67e74705SXin Li (*L)->Data = Data;
46*67e74705SXin Li (*L)->Next = 0;
47*67e74705SXin Li }
48*67e74705SXin Li
49*67e74705SXin Li // Recursive list search fn
FindData(list * L,int Data)50*67e74705SXin Li list *FindData(list *L, int Data) {
51*67e74705SXin Li if (L == 0) return 0;
52*67e74705SXin Li if (L->Data == Data) return L;
53*67e74705SXin Li return FindData(L->Next, Data);
54*67e74705SXin Li }
55*67e74705SXin Li
56*67e74705SXin Li void foundIt(void);
57*67e74705SXin Li
58*67e74705SXin Li // Driver fn...
DoListStuff()59*67e74705SXin Li void DoListStuff() {
60*67e74705SXin Li list *MyList = 0;
61*67e74705SXin Li InsertIntoListTail(&MyList, 100);
62*67e74705SXin Li InsertIntoListTail(&MyList, 12);
63*67e74705SXin Li InsertIntoListTail(&MyList, 42);
64*67e74705SXin Li InsertIntoListTail(&MyList, 1123);
65*67e74705SXin Li InsertIntoListTail(&MyList, 1213);
66*67e74705SXin Li
67*67e74705SXin Li if (FindData(MyList, 75)) foundIt();
68*67e74705SXin Li if (FindData(MyList, 42)) foundIt();
69*67e74705SXin Li if (FindData(MyList, 700)) foundIt();
70*67e74705SXin Li }
71*67e74705SXin Li
72