(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
c2x-stdarg-4.c
       1  /* Test C2x variadic functions with no named parameters, or last named
       2     parameter with a declaration not allowed in C17.  Execution tests.  */
       3  /* { dg-do run } */
       4  /* { dg-options "-std=c2x -pedantic-errors" } */
       5  
       6  #include <stdarg.h>
       7  
       8  extern void abort (void);
       9  extern void exit (int);
      10  
      11  double
      12  f (...)
      13  {
      14    va_list ap;
      15    va_start (ap);
      16    double ret = va_arg (ap, int);
      17    ret += va_arg (ap, double);
      18    ret += va_arg (ap, int);
      19    ret += va_arg (ap, double);
      20    va_end (ap);
      21    return ret;
      22  }
      23  
      24  void
      25  g (...)
      26  {
      27    va_list ap;
      28    va_start (ap, random ! ignored, ignored ** text);
      29    for (int i = 0; i < 10; i++)
      30      if (va_arg (ap, double) != i)
      31        abort ();
      32    va_end (ap);
      33  }
      34  
      35  void
      36  h1 (register int x, ...)
      37  {
      38    va_list ap;
      39    va_start (ap);
      40    for (int i = 0; i < 10; i++)
      41      {
      42        if (va_arg (ap, double) != i)
      43  	abort ();
      44        i++;
      45        if (va_arg (ap, int) != i)
      46  	abort ();
      47      }
      48    va_end (ap);
      49  }
      50  
      51  void
      52  h2 (int x(), ...)
      53  {
      54    va_list ap;
      55    va_start (ap);
      56    for (int i = 0; i < 10; i++)
      57      {
      58        if (va_arg (ap, double) != i)
      59  	abort ();
      60        i++;
      61        if (va_arg (ap, int) != i)
      62  	abort ();
      63      }
      64    va_end (ap);
      65  }
      66  
      67  void
      68  h3 (int x[10], ...)
      69  {
      70    va_list ap;
      71    va_start (ap);
      72    for (int i = 0; i < 10; i++)
      73      {
      74        if (va_arg (ap, double) != i)
      75  	abort ();
      76        i++;
      77        if (va_arg (ap, int) != i)
      78  	abort ();
      79      }
      80    va_end (ap);
      81  }
      82  
      83  void
      84  h4 (char x, ...)
      85  {
      86    va_list ap;
      87    va_start (ap);
      88    for (int i = 0; i < 10; i++)
      89      {
      90        if (va_arg (ap, double) != i)
      91  	abort ();
      92        i++;
      93        if (va_arg (ap, int) != i)
      94  	abort ();
      95      }
      96    va_end (ap);
      97  }
      98  
      99  void
     100  h5 (float x, ...)
     101  {
     102    va_list ap;
     103    va_start (ap);
     104    for (int i = 0; i < 10; i++)
     105      {
     106        if (va_arg (ap, double) != i)
     107  	abort ();
     108        i++;
     109        if (va_arg (ap, int) != i)
     110  	abort ();
     111      }
     112    va_end (ap);
     113  }
     114  
     115  void
     116  h6 (volatile long x, ...)
     117  {
     118    va_list ap;
     119    va_start (ap);
     120    for (int i = 0; i < 10; i++)
     121      {
     122        if (va_arg (ap, double) != i)
     123  	abort ();
     124        i++;
     125        if (va_arg (ap, int) != i)
     126  	abort ();
     127      }
     128    va_end (ap);
     129  }
     130  
     131  struct s { char c[1000]; };
     132  
     133  void
     134  h7 (volatile struct s x, ...)
     135  {
     136    va_list ap;
     137    va_start (ap);
     138    for (int i = 0; i < 10; i++)
     139      {
     140        if (va_arg (ap, double) != i)
     141  	abort ();
     142        i++;
     143        if (va_arg (ap, int) != i)
     144  	abort ();
     145      }
     146    va_end (ap);
     147  }
     148  
     149  int
     150  main ()
     151  {
     152    if (f (1, 2.0, 3, 4.0) != 10.0)
     153      abort ();
     154    g (0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0);
     155    g (0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f);
     156    h1 (0, 0.0, 1, 2.0, 3, 4.0, 5, 6.0, 7, 8.0, 9);
     157    h2 (0, 0.0, 1, 2.0, 3, 4.0, 5, 6.0, 7, 8.0, 9);
     158    h3 (0, 0.0, 1, 2.0, 3, 4.0, 5, 6.0, 7, 8.0, 9);
     159    h4 (0, 0.0, 1, 2.0, 3, 4.0, 5, 6.0, 7, 8.0, 9);
     160    h5 (0, 0.0, 1, 2.0, 3, 4.0, 5, 6.0, 7, 8.0, 9);
     161    h6 (0, 0.0, 1, 2.0, 3, 4.0, 5, 6.0, 7, 8.0, 9);
     162    h7 ((struct s) {}, 0.0, 1, 2.0, 3, 4.0, 5, 6.0, 7, 8.0, 9);
     163    exit (0);
     164  }