1  /* { dg-do run } */
       2  /* { dg-options "-std=gnu99" { target c } } */
       3  /* { dg-options "-std=c++20" { target c++ } } */
       4  
       5  #define lparen (
       6  #define a0 fooa0
       7  #define a1  fooa1 a0
       8  #define a2  fooa2 a1
       9  #define a3  fooa3 a2
      10  #define a() b lparen )
      11  #define b() c lparen )
      12  #define c() d lparen )
      13  #define g h
      14  #define i(j) j
      15  #define f(...) #__VA_OPT__(g i(0))
      16  #define k(x,...) # __VA_OPT__(x) #x #__VA_OPT__(__VA_ARGS__)
      17  #define l(x,...) #__VA_OPT__(a1 x)
      18  #define m(x,...) "a()" #__VA_OPT__(a3 __VA_ARGS__ x ## __VA_ARGS__ ## x ## c a3) "a()"
      19  #define n(x,...) = #__VA_OPT__(a3 __VA_ARGS__ x ## __VA_ARGS__ ## x ## c a3) #x #__VA_OPT__(a0 __VA_ARGS__ x ## __VA_ARGS__ ## x ## c a0) ;
      20  #define o(x, ...) #__VA_OPT__(x##x x##x)
      21  #define p(x, ...) #__VA_OPT__(_Pragma ("foobar"))
      22  #define q(...) #__VA_OPT__(/* foo */x/* bar */)
      23  const char *v1 = f();
      24  const char *v2 = f(123);
      25  const char *v3 = k(1);
      26  const char *v4 = k(1, 2, 3 );
      27  const char *v5 = l(a());
      28  const char *v6 = l(a1 a(), 1);
      29  const char *v7 = m();
      30  const char *v8 = m(,);
      31  const char *v9 = m(,a3);
      32  const char *v10 = m(a3,a(),a0);
      33  const char *v11 n()
      34  const char *v12 n(,)
      35  const char *v13 n(,a0)
      36  const char *v14 n(a0, a(),a0)
      37  const char *v15 = o(, 0);
      38  const char *v16 = p(0);
      39  const char *v17 = p(0, 1);
      40  const char *v18 = q();
      41  const char *v19 = q(1);
      42  
      43  int
      44  main ()
      45  {
      46    if (__builtin_strcmp (v1, "")
      47        || __builtin_strcmp (v2, "g i(0)")
      48        || __builtin_strcmp (v3, "1")
      49        || __builtin_strcmp (v4, "112, 3")
      50        || __builtin_strcmp (v5, "")
      51        || __builtin_strcmp (v6, "a1 fooa1 fooa0 b ( )")
      52        || __builtin_strcmp (v7, "a()a()")
      53        || __builtin_strcmp (v8, "a()a()")
      54        || __builtin_strcmp (v9, "a()a3 fooa3 fooa2 fooa1 fooa0 a3c a3a()")
      55        || __builtin_strcmp (v10, "a()a3 b ( ),fooa0 a3a(),a0a3c a3a()")
      56        || __builtin_strcmp (v11, "")
      57        || __builtin_strcmp (v12, "")
      58        || __builtin_strcmp (v13, "a3 fooa0 a0c a3a0 fooa0 a0c a0")
      59        || __builtin_strcmp (v14, "a3 b ( ),fooa0 a0a(),a0a0c a3a0a0 b ( ),fooa0 a0a(),a0a0c a0")
      60        || __builtin_strcmp (v15, "")
      61        || __builtin_strcmp (v16, "")
      62        || __builtin_strcmp (v17, "_Pragma (\"foobar\")")
      63        || __builtin_strcmp (v18, "")
      64        || __builtin_strcmp (v19, "x"))
      65      __builtin_abort ();
      66    return 0;
      67  }