modernc.org/ccgo/v3@v3.16.14/lib/testdata/gcc-9.1.0/gcc/testsuite/gcc.c-torture/execute/stdarg-2.c (about) 1 #include <stdarg.h> 2 3 extern void abort (void); 4 5 int foo_arg, bar_arg; 6 long x; 7 double d; 8 va_list gap; 9 10 void 11 foo (int v, va_list ap) 12 { 13 switch (v) 14 { 15 case 5: 16 foo_arg = va_arg (ap, int); 17 foo_arg += va_arg (ap, double); 18 foo_arg += va_arg (ap, long long); 19 break; 20 case 8: 21 foo_arg = va_arg (ap, long long); 22 foo_arg += va_arg (ap, double); 23 break; 24 case 11: 25 foo_arg = va_arg (ap, int); 26 foo_arg += va_arg (ap, long double); 27 break; 28 default: 29 abort (); 30 } 31 } 32 33 void 34 bar (int v) 35 { 36 if (v == 0x4002) 37 { 38 if (va_arg (gap, int) != 13 || va_arg (gap, double) != -14.0) 39 abort (); 40 } 41 bar_arg = v; 42 } 43 44 void 45 f1 (int i, ...) 46 { 47 va_start (gap, i); 48 x = va_arg (gap, long); 49 va_end (gap); 50 } 51 52 void 53 f2 (int i, ...) 54 { 55 va_start (gap, i); 56 bar (i); 57 va_end (gap); 58 } 59 60 void 61 f3 (int i, ...) 62 { 63 va_list aps[10]; 64 va_start (aps[4], i); 65 x = va_arg (aps[4], long); 66 va_end (aps[4]); 67 } 68 69 void 70 f4 (int i, ...) 71 { 72 va_list aps[10]; 73 va_start (aps[4], i); 74 bar (i); 75 va_end (aps[4]); 76 } 77 78 void 79 f5 (int i, ...) 80 { 81 va_list aps[10]; 82 va_start (aps[4], i); 83 foo (i, aps[4]); 84 va_end (aps[4]); 85 } 86 87 struct A { int i; va_list g; va_list h[2]; }; 88 89 void 90 f6 (int i, ...) 91 { 92 struct A a; 93 va_start (a.g, i); 94 x = va_arg (a.g, long); 95 va_end (a.g); 96 } 97 98 void 99 f7 (int i, ...) 100 { 101 struct A a; 102 va_start (a.g, i); 103 bar (i); 104 va_end (a.g); 105 } 106 107 void 108 f8 (int i, ...) 109 { 110 struct A a; 111 va_start (a.g, i); 112 foo (i, a.g); 113 va_end (a.g); 114 } 115 116 void 117 f10 (int i, ...) 118 { 119 struct A a; 120 va_start (a.h[1], i); 121 x = va_arg (a.h[1], long); 122 va_end (a.h[1]); 123 } 124 125 void 126 f11 (int i, ...) 127 { 128 struct A a; 129 va_start (a.h[1], i); 130 bar (i); 131 va_end (a.h[1]); 132 } 133 134 void 135 f12 (int i, ...) 136 { 137 struct A a; 138 va_start (a.h[1], i); 139 foo (i, a.h[1]); 140 va_end (a.h[1]); 141 } 142 143 int 144 main (void) 145 { 146 f1 (1, 79L); 147 if (x != 79L) 148 abort (); 149 f2 (0x4002, 13, -14.0); 150 if (bar_arg != 0x4002) 151 abort (); 152 f3 (3, 2031L); 153 if (x != 2031) 154 abort (); 155 f4 (4, 18); 156 if (bar_arg != 4) 157 abort (); 158 f5 (5, 1, 19.0, 18LL); 159 if (foo_arg != 38) 160 abort (); 161 f6 (6, 18L); 162 if (x != 18L) 163 abort (); 164 f7 (7); 165 if (bar_arg != 7) 166 abort (); 167 f8 (8, 2031LL, 13.0); 168 if (foo_arg != 2044) 169 abort (); 170 f10 (9, 180L); 171 if (x != 180L) 172 abort (); 173 f11 (10); 174 if (bar_arg != 10) 175 abort (); 176 f12 (11, 2030, 12.0L); 177 if (foo_arg != 2042) 178 abort (); 179 return 0; 180 }