1#include <stdarg.h> 2 3extern void abort (void); 4long x, y; 5 6inline void __attribute__((always_inline)) 7f1i (va_list ap) 8{ 9 x = va_arg (ap, double); 10 x += va_arg (ap, long); 11 x += va_arg (ap, double); 12} 13 14void 15f1 (int i, ...) 16{ 17 va_list ap; 18 va_start (ap, i); 19 f1i (ap); 20 va_end (ap); 21} 22 23inline void __attribute__((always_inline)) 24f2i (va_list ap) 25{ 26 y = va_arg (ap, int); 27 y += va_arg (ap, long); 28 y += va_arg (ap, double); 29 f1i (ap); 30} 31 32void 33f2 (int i, ...) 34{ 35 va_list ap; 36 va_start (ap, i); 37 f2i (ap); 38 va_end (ap); 39} 40 41long 42f3h (int i, long arg0, long arg1, long arg2, long arg3) 43{ 44 return i + arg0 + arg1 + arg2 + arg3; 45} 46 47long 48f3 (int i, ...) 49{ 50 long t, arg0, arg1, arg2, arg3; 51 va_list ap; 52 53 va_start (ap, i); 54 switch (i) 55 { 56 case 0: 57 t = f3h (i, 0, 0, 0, 0); 58 break; 59 case 1: 60 arg0 = va_arg (ap, long); 61 t = f3h (i, arg0, 0, 0, 0); 62 break; 63 case 2: 64 arg0 = va_arg (ap, long); 65 arg1 = va_arg (ap, long); 66 t = f3h (i, arg0, arg1, 0, 0); 67 break; 68 case 3: 69 arg0 = va_arg (ap, long); 70 arg1 = va_arg (ap, long); 71 arg2 = va_arg (ap, long); 72 t = f3h (i, arg0, arg1, arg2, 0); 73 break; 74 case 4: 75 arg0 = va_arg (ap, long); 76 arg1 = va_arg (ap, long); 77 arg2 = va_arg (ap, long); 78 arg3 = va_arg (ap, long); 79 t = f3h (i, arg0, arg1, arg2, arg3); 80 break; 81 default: 82 abort (); 83 } 84 va_end (ap); 85 86 return t; 87} 88 89void 90f4 (int i, ...) 91{ 92 va_list ap; 93 94 va_start (ap, i); 95 switch (i) 96 { 97 case 4: 98 y = va_arg (ap, double); 99 break; 100 case 5: 101 y = va_arg (ap, double); 102 y += va_arg (ap, double); 103 break; 104 default: 105 abort (); 106 } 107 f1i (ap); 108 va_end (ap); 109} 110 111int 112main (void) 113{ 114 f1 (3, 16.0, 128L, 32.0); 115 if (x != 176L) 116 abort (); 117 f2 (6, 5, 7L, 18.0, 19.0, 17L, 64.0); 118 if (x != 100L || y != 30L) 119 abort (); 120 if (f3 (0) != 0) 121 abort (); 122 if (f3 (1, 18L) != 19L) 123 abort (); 124 if (f3 (2, 18L, 100L) != 120L) 125 abort (); 126 if (f3 (3, 18L, 100L, 300L) != 421L) 127 abort (); 128 if (f3 (4, 18L, 71L, 64L, 86L) != 243L) 129 abort (); 130 f4 (4, 6.0, 9.0, 16L, 18.0); 131 if (x != 43L || y != 6L) 132 abort (); 133 f4 (5, 7.0, 21.0, 1.0, 17L, 126.0); 134 if (x != 144L || y != 28L) 135 abort (); 136 return 0; 137} 138