modernc.org/ccgo/v3@v3.16.14/lib/testdata/gcc-9.1.0/gcc/testsuite/gcc.c-torture/execute/stdarg-4.c (about)

     1  #include <stdarg.h>
     2  
     3  extern void abort (void);
     4  long x, y;
     5  
     6  inline void __attribute__((always_inline))
     7  f1i (va_list ap)
     8  {
     9    x = va_arg (ap, double);
    10    x += va_arg (ap, long);
    11    x += va_arg (ap, double);
    12  }
    13  
    14  void
    15  f1 (int i, ...)
    16  {
    17    va_list ap;
    18    va_start (ap, i);
    19    f1i (ap);
    20    va_end (ap);
    21  }
    22  
    23  inline void __attribute__((always_inline))
    24  f2i (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  
    32  void
    33  f2 (int i, ...)
    34  {
    35    va_list ap;
    36    va_start (ap, i);
    37    f2i (ap);
    38    va_end (ap);
    39  }
    40  
    41  long
    42  f3h (int i, long arg0, long arg1, long arg2, long arg3)
    43  {
    44    return i + arg0 + arg1 + arg2 + arg3;
    45  }
    46  
    47  long
    48  f3 (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  
    89  void
    90  f4 (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  
   111  int
   112  main (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  }