/* Conformance Test 3.3.3.1:  Ensure correct macro expansion for nested */
/*                            macros and nested macro calls             */

int printf(const char *, ...);

#define    addMult(a,b,c)  mult ( (add((a),(c))), (b) )
#define    mult(x,y)       (y) * (x)
#define    add(i,j)        (i) + (j)

int main (void)
  {
   long i, j, k, m;

   i = 2;
   j = 3;
   k = 5;

   m = addMult (i, j, k);
   if (m != 21)
       goto Fail;

   m = addMult ( (mult (j,k)), (add (m,i)), 4 );
   if (m != 437)
       goto Fail;

   j = add ( (mult (k,i)), (addMult ((m), (mult ((i), (add (m,m))) ), (k))));
   if (j != 772626)
       goto Fail;

   printf ("Passed Conformance Test 3.3.3.1\n");
   return 0;

Fail:
   printf ("Failed Conformance Test 3.3.3.1\n");
  }
