modernc.org/ccgo/v3@v3.16.14/lib/testdata/gcc-9.1.0/gcc/testsuite/gcc.c-torture/execute/stdarg-1.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  va_list *pap;
    10  
    11  void
    12  foo (int v, va_list ap)
    13  {
    14    switch (v)
    15      {
    16      case 5: foo_arg = va_arg (ap, int); break;
    17      default: abort ();
    18      }
    19  }
    20  
    21  void
    22  bar (int v)
    23  {
    24    if (v == 0x4006)
    25      {
    26        if (va_arg (gap, double) != 17.0
    27  	  || va_arg (gap, long) != 129L)
    28  	abort ();
    29      }
    30    else if (v == 0x4008)
    31      {
    32        if (va_arg (*pap, long long) != 14LL
    33  	  || va_arg (*pap, long double) != 131.0L
    34  	  || va_arg (*pap, int) != 17)
    35  	abort ();
    36      }
    37    bar_arg = v;
    38  }
    39  
    40  void
    41  f0 (int i, ...)
    42  {
    43  }
    44  
    45  void
    46  f1 (int i, ...)
    47  {
    48    va_list ap;
    49    va_start (ap, i);
    50    va_end (ap);
    51  }
    52  
    53  void
    54  f2 (int i, ...)
    55  {
    56    va_list ap;
    57    va_start (ap, i);
    58    bar (d);
    59    x = va_arg (ap, long);
    60    bar (x);
    61    va_end (ap);
    62  }
    63  
    64  void
    65  f3 (int i, ...)
    66  {
    67    va_list ap;
    68    va_start (ap, i);
    69    d = va_arg (ap, double);
    70    va_end (ap);
    71  }
    72  
    73  void
    74  f4 (int i, ...)
    75  {
    76    va_list ap;
    77    va_start (ap, i);
    78    x = va_arg (ap, double);
    79    foo (i, ap);
    80    va_end (ap);
    81  }
    82  
    83  void
    84  f5 (int i, ...)
    85  {
    86    va_list ap;
    87    va_start (ap, i);
    88    va_copy (gap, ap);
    89    bar (i);
    90    va_end (ap);
    91    va_end (gap);
    92  }
    93  
    94  void
    95  f6 (int i, ...)
    96  {
    97    va_list ap;
    98    va_start (ap, i);
    99    bar (d);
   100    va_arg (ap, long);
   101    va_arg (ap, long);
   102    x = va_arg (ap, long);
   103    bar (x);
   104    va_end (ap);
   105  }
   106  
   107  void
   108  f7 (int i, ...)
   109  {
   110    va_list ap;
   111    va_start (ap, i);
   112    pap = &ap;
   113    bar (i);
   114    va_end (ap);
   115  }
   116  
   117  void
   118  f8 (int i, ...)
   119  {
   120    va_list ap;
   121    va_start (ap, i);
   122    pap = &ap;
   123    bar (i);
   124    d = va_arg (ap, double);
   125    va_end (ap);
   126  }
   127  
   128  int
   129  main (void)
   130  {
   131    f0 (1);
   132    f1 (2);
   133    d = 31.0;
   134    f2 (3, 28L);
   135    if (bar_arg != 28 || x != 28)
   136      abort ();
   137    f3 (4, 131.0);
   138    if (d != 131.0)
   139      abort ();
   140    f4 (5, 16.0, 128);
   141    if (x != 16 || foo_arg != 128)
   142      abort ();
   143    f5 (0x4006, 17.0, 129L);
   144    if (bar_arg != 0x4006)
   145      abort ();
   146    f6 (7, 12L, 14L, -31L);
   147    if (bar_arg != -31)
   148      abort ();
   149    f7 (0x4008, 14LL, 131.0L, 17, 26.0);
   150    if (bar_arg != 0x4008)
   151      abort ();
   152    f8 (0x4008, 14LL, 131.0L, 17, 27.0);
   153    if (bar_arg != 0x4008 || d != 27.0)
   154      abort ();
   155    return 0;
   156  }