1b025734047dd8b630c34cea53b371361adb2a65aEric Christopher// RUN: %clang_cc1 -w -emit-llvm %s  -o /dev/null
2b025734047dd8b630c34cea53b371361adb2a65aEric Christopher
3b025734047dd8b630c34cea53b371361adb2a65aEric Christophervoid *malloc(unsigned);
4b025734047dd8b630c34cea53b371361adb2a65aEric Christopherint puts(const char *s);
5b025734047dd8b630c34cea53b371361adb2a65aEric Christopher
6b025734047dd8b630c34cea53b371361adb2a65aEric Christopherstruct FunStructTest {
7b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  int Test1;
8b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  char *Pointer;
9b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  int Array[12];
10b025734047dd8b630c34cea53b371361adb2a65aEric Christopher};
11b025734047dd8b630c34cea53b371361adb2a65aEric Christopher
12b025734047dd8b630c34cea53b371361adb2a65aEric Christopherstruct SubStruct {
13b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  short X, Y;
14b025734047dd8b630c34cea53b371361adb2a65aEric Christopher};
15b025734047dd8b630c34cea53b371361adb2a65aEric Christopher
16b025734047dd8b630c34cea53b371361adb2a65aEric Christopherstruct Quad {
17b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  int w;
18b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  struct SubStruct SS;
19b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  struct SubStruct *SSP;
20b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  char c;
21b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  int y;
22b025734047dd8b630c34cea53b371361adb2a65aEric Christopher};
23b025734047dd8b630c34cea53b371361adb2a65aEric Christopher
24b025734047dd8b630c34cea53b371361adb2a65aEric Christopherstruct Quad GlobalQuad = { 4, {1, 2}, 0, 3, 156 };
25b025734047dd8b630c34cea53b371361adb2a65aEric Christopher
26b025734047dd8b630c34cea53b371361adb2a65aEric Christophertypedef int (*FuncPtr)(int);
27b025734047dd8b630c34cea53b371361adb2a65aEric Christopher
28b025734047dd8b630c34cea53b371361adb2a65aEric Christopherunsigned PtrFunc(int (*Func)(int), int X) {
29b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  return Func(X);
30b025734047dd8b630c34cea53b371361adb2a65aEric Christopher}
31b025734047dd8b630c34cea53b371361adb2a65aEric Christopher
32b025734047dd8b630c34cea53b371361adb2a65aEric Christopherchar PtrFunc2(FuncPtr FuncTab[30], int Num) {
33b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  return FuncTab[Num]('b');
34b025734047dd8b630c34cea53b371361adb2a65aEric Christopher}
35b025734047dd8b630c34cea53b371361adb2a65aEric Christopher
36b025734047dd8b630c34cea53b371361adb2a65aEric Christopherextern char SmallArgs2(char w, char x, long long Zrrk, char y, char z);
37b025734047dd8b630c34cea53b371361adb2a65aEric Christopherextern int SomeFunc(void);
38b025734047dd8b630c34cea53b371361adb2a65aEric Christopherchar SmallArgs(char w, char x, char y, char z) {
39b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  SomeFunc();
40b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  return SmallArgs2(w-1, x+1, y, z, w);
41b025734047dd8b630c34cea53b371361adb2a65aEric Christopher}
42b025734047dd8b630c34cea53b371361adb2a65aEric Christopher
43b025734047dd8b630c34cea53b371361adb2a65aEric Christopherstatic int F0(struct Quad Q, int i) {              /* Pass Q by value */
44b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  struct Quad R;
45b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  if (i) R.SS = Q.SS;
46b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  Q.SSP = &R.SS;
47b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  Q.w = Q.y = Q.c = 1;
48b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  return Q.SS.Y + i + R.y - Q.c;
49b025734047dd8b630c34cea53b371361adb2a65aEric Christopher}
50b025734047dd8b630c34cea53b371361adb2a65aEric Christopher
51b025734047dd8b630c34cea53b371361adb2a65aEric Christopherint F1(struct Quad *Q, int i) {             /* Pass Q by address */
52b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  struct Quad R;
53b025734047dd8b630c34cea53b371361adb2a65aEric Christopher#if 0
54b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  if (i) R.SS = Q->SS;
55b025734047dd8b630c34cea53b371361adb2a65aEric Christopher#else
56b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  if (i) R = *Q;
57b025734047dd8b630c34cea53b371361adb2a65aEric Christopher#endif
58b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  Q->w = Q->y = Q->c = 1;
59b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  return Q->SS.Y+i+R.y-Q->c;
60b025734047dd8b630c34cea53b371361adb2a65aEric Christopher}
61b025734047dd8b630c34cea53b371361adb2a65aEric Christopher
62b025734047dd8b630c34cea53b371361adb2a65aEric Christopher
63b025734047dd8b630c34cea53b371361adb2a65aEric Christopherint BadFunc(float Val) {
64b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  int Result;
65b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  if (Val > 12.345) Result = 4;
66b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  return Result;     /* Test use of undefined value */
67b025734047dd8b630c34cea53b371361adb2a65aEric Christopher}
68b025734047dd8b630c34cea53b371361adb2a65aEric Christopher
69b025734047dd8b630c34cea53b371361adb2a65aEric Christopherint RealFunc(void) {
70b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  return SomeUndefinedFunction(1, 4, 5);
71b025734047dd8b630c34cea53b371361adb2a65aEric Christopher}
72b025734047dd8b630c34cea53b371361adb2a65aEric Christopher
73b025734047dd8b630c34cea53b371361adb2a65aEric Christopherextern int EF1(int *, char *, int *);
74b025734047dd8b630c34cea53b371361adb2a65aEric Christopher
75b025734047dd8b630c34cea53b371361adb2a65aEric Christopherint Func(int Param, long long Param2) {
76b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  int Result = Param;
77b025734047dd8b630c34cea53b371361adb2a65aEric Christopher
78b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  {{{{
79b025734047dd8b630c34cea53b371361adb2a65aEric Christopher      char c; int X;
80b025734047dd8b630c34cea53b371361adb2a65aEric Christopher      EF1(&Result, &c, &X);
81b025734047dd8b630c34cea53b371361adb2a65aEric Christopher    }}}
82b025734047dd8b630c34cea53b371361adb2a65aEric Christopher
83b025734047dd8b630c34cea53b371361adb2a65aEric Christopher    {   // c & X are duplicate names!
84b025734047dd8b630c34cea53b371361adb2a65aEric Christopher      char c; int X;
85b025734047dd8b630c34cea53b371361adb2a65aEric Christopher      EF1(&Result, &c, &X);
86b025734047dd8b630c34cea53b371361adb2a65aEric Christopher    }
87b025734047dd8b630c34cea53b371361adb2a65aEric Christopher
88b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  }
89b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  return Result;
90b025734047dd8b630c34cea53b371361adb2a65aEric Christopher}
91b025734047dd8b630c34cea53b371361adb2a65aEric Christopher
92b025734047dd8b630c34cea53b371361adb2a65aEric Christopher
93b025734047dd8b630c34cea53b371361adb2a65aEric Christophershort FunFunc(long long x, char z) {
94b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  return x+z;
95b025734047dd8b630c34cea53b371361adb2a65aEric Christopher}
96b025734047dd8b630c34cea53b371361adb2a65aEric Christopher
97b025734047dd8b630c34cea53b371361adb2a65aEric Christopherunsigned castTest(int X) { return X; }
98b025734047dd8b630c34cea53b371361adb2a65aEric Christopher
99b025734047dd8b630c34cea53b371361adb2a65aEric Christopherdouble TestAdd(double X, float Y) {
100b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  return X+Y+.5;
101b025734047dd8b630c34cea53b371361adb2a65aEric Christopher}
102b025734047dd8b630c34cea53b371361adb2a65aEric Christopher
103b025734047dd8b630c34cea53b371361adb2a65aEric Christopherint func(int i, int j) {
104b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  while (i != 20)
105b025734047dd8b630c34cea53b371361adb2a65aEric Christopher    i += 2;
106b025734047dd8b630c34cea53b371361adb2a65aEric Christopher
107b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  j += func(2, i);
108b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  return (i * 3 + j*2)*j;
109b025734047dd8b630c34cea53b371361adb2a65aEric Christopher}
110b025734047dd8b630c34cea53b371361adb2a65aEric Christopher
111b025734047dd8b630c34cea53b371361adb2a65aEric Christopherint SumArray(int Array[], int Num) {
112b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  int i, Result = 0;
113b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  for (i = 0; i < Num; ++i)
114b025734047dd8b630c34cea53b371361adb2a65aEric Christopher    Result += Array[i];
115b025734047dd8b630c34cea53b371361adb2a65aEric Christopher
116b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  return Result;
117b025734047dd8b630c34cea53b371361adb2a65aEric Christopher}
118b025734047dd8b630c34cea53b371361adb2a65aEric Christopher
119b025734047dd8b630c34cea53b371361adb2a65aEric Christopherint ArrayParam(int Values[100]) {
120b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  return EF1((int*)Values[50], (char*)1, &Values[50]);
121b025734047dd8b630c34cea53b371361adb2a65aEric Christopher}
122b025734047dd8b630c34cea53b371361adb2a65aEric Christopher
123b025734047dd8b630c34cea53b371361adb2a65aEric Christopherint ArrayToSum(void) {
124b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  int A[100], i;
125b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  for (i = 0; i < 100; ++i)
126b025734047dd8b630c34cea53b371361adb2a65aEric Christopher    A[i] = i*4;
127b025734047dd8b630c34cea53b371361adb2a65aEric Christopher
128b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  return A[A[0]]; //SumArray(A, 100);
129b025734047dd8b630c34cea53b371361adb2a65aEric Christopher}
130b025734047dd8b630c34cea53b371361adb2a65aEric Christopher
131b025734047dd8b630c34cea53b371361adb2a65aEric Christopher
132b025734047dd8b630c34cea53b371361adb2a65aEric Christopherint ExternFunc(long long, unsigned*, short, unsigned char);
133b025734047dd8b630c34cea53b371361adb2a65aEric Christopher
134b025734047dd8b630c34cea53b371361adb2a65aEric Christopherint main(int argc, char *argv[]) {
135b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  unsigned i;
136b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  puts("Hello world!\n");
137b025734047dd8b630c34cea53b371361adb2a65aEric Christopher
138b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  ExternFunc(-1, 0, (short)argc, 2);
139b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  //func(argc, argc);
140b025734047dd8b630c34cea53b371361adb2a65aEric Christopher
141b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  for (i = 0; i < 10; i++)
142b025734047dd8b630c34cea53b371361adb2a65aEric Christopher    puts(argv[3]);
143b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  return 0;
144b025734047dd8b630c34cea53b371361adb2a65aEric Christopher}
145b025734047dd8b630c34cea53b371361adb2a65aEric Christopher
146b025734047dd8b630c34cea53b371361adb2a65aEric Christopherdouble MathFunc(double X, double Y, double Z,
147b025734047dd8b630c34cea53b371361adb2a65aEric Christopher                double AA, double BB, double CC, double DD,
148b025734047dd8b630c34cea53b371361adb2a65aEric Christopher                double EE, double FF, double GG, double HH,
149b025734047dd8b630c34cea53b371361adb2a65aEric Christopher                double aAA, double aBB, double aCC, double aDD,
150b025734047dd8b630c34cea53b371361adb2a65aEric Christopher                double aEE, double aFF) {
151b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  return X + Y + Z + AA + BB + CC + DD + EE + FF + GG + HH
152b025734047dd8b630c34cea53b371361adb2a65aEric Christopher       + aAA + aBB + aCC + aDD + aEE + aFF;
153b025734047dd8b630c34cea53b371361adb2a65aEric Christopher}
154b025734047dd8b630c34cea53b371361adb2a65aEric Christopher
155b025734047dd8b630c34cea53b371361adb2a65aEric Christopher
156b025734047dd8b630c34cea53b371361adb2a65aEric Christopher
157b025734047dd8b630c34cea53b371361adb2a65aEric Christophervoid strcpy(char *s1, char *s2) {
158b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  while (*s1++ = *s2++);
159b025734047dd8b630c34cea53b371361adb2a65aEric Christopher}
160b025734047dd8b630c34cea53b371361adb2a65aEric Christopher
161b025734047dd8b630c34cea53b371361adb2a65aEric Christophervoid strcat(char *s1, char *s2) {
162b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  while (*s1++);
163b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  s1--;
164b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  while (*s1++ = *s2++);
165b025734047dd8b630c34cea53b371361adb2a65aEric Christopher}
166b025734047dd8b630c34cea53b371361adb2a65aEric Christopher
167b025734047dd8b630c34cea53b371361adb2a65aEric Christopherint strcmp(char *s1, char *s2) {
168b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  while (*s1++ == *s2++);
169b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  if (*s1 == 0) {
170b025734047dd8b630c34cea53b371361adb2a65aEric Christopher    if (*s2 == 0) {
171b025734047dd8b630c34cea53b371361adb2a65aEric Christopher      return 0;
172b025734047dd8b630c34cea53b371361adb2a65aEric Christopher    } else {
173b025734047dd8b630c34cea53b371361adb2a65aEric Christopher      return -1;
174b025734047dd8b630c34cea53b371361adb2a65aEric Christopher    }
175b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  } else {
176b025734047dd8b630c34cea53b371361adb2a65aEric Christopher    if (*s2 == 0) {
177b025734047dd8b630c34cea53b371361adb2a65aEric Christopher      return 1;
178b025734047dd8b630c34cea53b371361adb2a65aEric Christopher    } else {
179b025734047dd8b630c34cea53b371361adb2a65aEric Christopher      return (*(--s1) - *(--s2));
180b025734047dd8b630c34cea53b371361adb2a65aEric Christopher    }
181b025734047dd8b630c34cea53b371361adb2a65aEric Christopher  }
182b025734047dd8b630c34cea53b371361adb2a65aEric Christopher}
183