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

void *malloc(unsigned);
int puts(const char *s);

struct FunStructTest {
  int Test1;
  char *Pointer;
  int Array[12];
};

struct SubStruct {
  short X, Y;
};

struct Quad {
  int w;
  struct SubStruct SS;
  struct SubStruct *SSP;
  char c;
  int y;
};

struct Quad GlobalQuad = { 4, {1, 2}, 0, 3, 156 };

typedef int (*FuncPtr)(int);

unsigned PtrFunc(int (*Func)(int), int X) {
  return Func(X);
}

char PtrFunc2(FuncPtr FuncTab[30], int Num) {
  return FuncTab[Num]('b');
}

extern char SmallArgs2(char w, char x, long long Zrrk, char y, char z);
extern int SomeFunc(void);
char SmallArgs(char w, char x, char y, char z) {
  SomeFunc();
  return SmallArgs2(w-1, x+1, y, z, w);
}

static int F0(struct Quad Q, int i) {              /* Pass Q by value */
  struct Quad R;
  if (i) R.SS = Q.SS;
  Q.SSP = &R.SS;
  Q.w = Q.y = Q.c = 1;
  return Q.SS.Y + i + R.y - Q.c;
}

int F1(struct Quad *Q, int i) {             /* Pass Q by address */
  struct Quad R;
#if 0
  if (i) R.SS = Q->SS;
#else
  if (i) R = *Q;
#endif
  Q->w = Q->y = Q->c = 1;
  return Q->SS.Y+i+R.y-Q->c;
}


int BadFunc(float Val) {
  int Result;
  if (Val > 12.345) Result = 4;
  return Result;     /* Test use of undefined value */
}

int RealFunc(void) {
  return SomeUndefinedFunction(1, 4, 5);
}

extern int EF1(int *, char *, int *);

int Func(int Param, long long Param2) {
  int Result = Param;

  {{{{
      char c; int X;
      EF1(&Result, &c, &X);
    }}}

    {   // c & X are duplicate names!
      char c; int X;
      EF1(&Result, &c, &X);
    }

  }
  return Result;
}


short FunFunc(long long x, char z) {
  return x+z;
}

unsigned castTest(int X) { return X; }

double TestAdd(double X, float Y) {
  return X+Y+.5;
}

int func(int i, int j) {
  while (i != 20)
    i += 2;

  j += func(2, i);
  return (i * 3 + j*2)*j;
}

int SumArray(int Array[], int Num) {
  int i, Result = 0;
  for (i = 0; i < Num; ++i)
    Result += Array[i];

  return Result;
}

int ArrayParam(int Values[100]) {
  return EF1((int*)Values[50], (char*)1, &Values[50]);
}

int ArrayToSum(void) {
  int A[100], i;
  for (i = 0; i < 100; ++i)
    A[i] = i*4;

  return A[A[0]]; //SumArray(A, 100);
}


int ExternFunc(long long, unsigned*, short, unsigned char);

int main(int argc, char *argv[]) {
  unsigned i;
  puts("Hello world!\n");

  ExternFunc(-1, 0, (short)argc, 2);
  //func(argc, argc);

  for (i = 0; i < 10; i++)
    puts(argv[3]);
  return 0;
}

double MathFunc(double X, double Y, double Z,
                double AA, double BB, double CC, double DD,
                double EE, double FF, double GG, double HH,
                double aAA, double aBB, double aCC, double aDD,
                double aEE, double aFF) {
  return X + Y + Z + AA + BB + CC + DD + EE + FF + GG + HH
       + aAA + aBB + aCC + aDD + aEE + aFF;
}



void strcpy(char *s1, char *s2) {
  while (*s1++ = *s2++);
}

void strcat(char *s1, char *s2) {
  while (*s1++);
  s1--;
  while (*s1++ = *s2++);
}

int strcmp(char *s1, char *s2) {
  while (*s1++ == *s2++);
  if (*s1 == 0) {
    if (*s2 == 0) {
      return 0;
    } else {
      return -1;
    }
  } else {
    if (*s2 == 0) {
      return 1;
    } else {
      return (*(--s1) - *(--s2));
    }
  }
}
