modernc.org/ccgo/v3@v3.16.14/lib/testdata/gcc-9.1.0/gcc/testsuite/gcc.c-torture/execute/stdarg-3.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  struct S1 { int i; double d; int j; double e; } s1;
    10  struct S2 { double d; long i; } s2;
    11  int y;
    12  
    13  void
    14  bar (int v)
    15  {
    16    bar_arg = v;
    17  }
    18  
    19  void
    20  f1 (int i, ...)
    21  {
    22    va_list ap;
    23    va_start (ap, i);
    24    while (i-- > 0)
    25      x = va_arg (ap, long);
    26    va_end (ap);
    27  }
    28  
    29  void
    30  f2 (int i, ...)
    31  {
    32    va_list ap;
    33    va_start (ap, i);
    34    while (i-- > 0)
    35      d = va_arg (ap, double);
    36    va_end (ap);
    37  }
    38  
    39  void
    40  f3 (int i, ...)
    41  {
    42    va_list ap;
    43    int j = i;
    44    while (j-- > 0)
    45      {
    46        va_start (ap, i);
    47        x = va_arg (ap, long);
    48        va_end (ap);
    49        bar (x);
    50      }
    51  }
    52  
    53  void
    54  f4 (int i, ...)
    55  {
    56    va_list ap;
    57    int j = i;
    58    while (j-- > 0)
    59      {
    60        va_start (ap, i);
    61        d = va_arg (ap, double);
    62        va_end (ap);
    63        bar (d + 4.0);
    64      }
    65  }
    66  
    67  void
    68  f5 (int i, ...)
    69  {
    70    va_list ap;
    71    va_start (ap, i);
    72    while (i-- > 0)
    73      s1 = va_arg (ap, struct S1);
    74    va_end (ap);
    75  }
    76  
    77  void
    78  f6 (int i, ...)
    79  {
    80    va_list ap;
    81    va_start (ap, i);
    82    while (i-- > 0)
    83      s2 = va_arg (ap, struct S2);
    84    va_end (ap);
    85  }
    86  
    87  void
    88  f7 (int i, ...)
    89  {
    90    va_list ap;
    91    int j = i;
    92    while (j-- > 0)
    93      {
    94        va_start (ap, i);
    95        s1 = va_arg (ap, struct S1);
    96        va_end (ap);
    97        bar (s1.i);
    98      }
    99  }
   100  
   101  void
   102  f8 (int i, ...)
   103  {
   104    va_list ap;
   105    int j = i;
   106    while (j-- > 0)
   107      {
   108        va_start (ap, i);
   109        s2 = va_arg (ap, struct S2);
   110        y = va_arg (ap, int);
   111        va_end (ap);
   112        bar (s2.i);
   113      }
   114  }
   115  
   116  int
   117  main (void)
   118  {
   119    struct S1 a1, a3;
   120    struct S2 a2, a4;
   121  
   122    f1 (7, 1L, 2L, 3L, 5L, 7L, 9L, 11L, 13L);
   123    if (x != 11L)
   124      abort ();
   125    f2 (6, 1.0, 2.0, 4.0, 8.0, 16.0, 32.0, 64.0);
   126    if (d != 32.0)
   127      abort ();
   128    f3 (2, 1L, 3L);
   129    if (bar_arg != 1L || x != 1L)
   130      abort ();
   131    f4 (2, 17.0, 19.0);
   132    if (bar_arg != 21 || d != 17.0)
   133      abort ();
   134    a1.i = 131;
   135    a1.j = 251;
   136    a1.d = 15.0;
   137    a1.e = 191.0;
   138    a3 = a1;
   139    a3.j = 254;
   140    a3.e = 178.0;
   141    f5 (2, a1, a3, a1);
   142    if (s1.i != 131 || s1.j != 254 || s1.d != 15.0 || s1.e != 178.0)
   143      abort ();
   144    f5 (3, a1, a3, a1);
   145    if (s1.i != 131 || s1.j != 251 || s1.d != 15.0 || s1.e != 191.0)
   146      abort ();
   147    a2.i = 138;
   148    a2.d = 16.0;
   149    a4.i = 257;
   150    a4.d = 176.0;
   151    f6 (2, a2, a4, a2);
   152    if (s2.i != 257 || s2.d != 176.0)
   153      abort ();
   154    f6 (3, a2, a4, a2);
   155    if (s2.i != 138 || s2.d != 16.0)
   156      abort ();
   157    f7 (2, a3, a1, a1);
   158    if (s1.i != 131 || s1.j != 254 || s1.d != 15.0 || s1.e != 178.0)
   159      abort ();
   160    if (bar_arg != 131)
   161      abort ();
   162    f8 (3, a4, a2, a2);
   163    if (s2.i != 257 || s2.d != 176.0)
   164      abort ();
   165    return 0;
   166  }