1  /* PR preprocessor/83063 */
       2  /* PR preprocessor/83708 */
       3  /* { dg-do preprocess } */
       4  /* { dg-options "-std=gnu99" { target c } } */
       5  /* { dg-options "-std=c++2a" { target c++ } } */
       6  
       7  #define f1(...) b##__VA_OPT__(c)
       8  #define f2(...) __VA_OPT__(c)##d
       9  #define f3(...) e##__VA_OPT__()
      10  #define f4(...) __VA_OPT__()##f
      11  #define f5(...) g##__VA_OPT__(h)##i
      12  #define f6(...) j##__VA_OPT__()##k
      13  #define f7(...) l##__VA_OPT__()
      14  #define f8(...) __VA_OPT__()##m
      15  #define f9(...) n##__VA_OPT__()##o
      16  #define f10(x, ...) x##__VA_OPT__(x)
      17  #define f11(x, ...) __VA_OPT__(x)##x
      18  #define f12(x, ...) x##__VA_OPT__(x)##x
      19  #define f13(...) __VA_OPT__(a)__VA_OPT__(b)c
      20  #define f14(a, b, c, ...) __VA_OPT__(a)__VA_OPT__(b)c
      21  #define f15(a, b, c, ...) __VA_OPT__(a b)__VA_OPT__(b c)a/**/__VA_OPT__(c a)a
      22  #define m1 (
      23  #define f16() f17 m1 )
      24  #define f17() f18 m1 )
      25  #define f18() m2 m1 )
      26  #define m3f17() g
      27  #define f19(x, ...) m3 ## __VA_OPT__(x x f16() #x)
      28  #define f20(x, ...) __VA_OPT__(x x)##m4()
      29  #define f21() f17
      30  #define f17m4() h
      31  #define f22(x,...)  1 ## __VA_OPT__(x ## x 2) ## 3
      32  #define f23(x,...)  1 ## __VA_OPT__(x 2) ## 3
      33  #define f24(x,...)  1 ## __VA_OPT__(2 x) ## 3
      34  #define f25(x,...)  1 ## __VA_OPT__(2 x ## x) ## 3
      35  t1 f1 (1, 2, 3);
      36  /* { dg-final { scan-file va-opt-3.i "t1 bc;" } } */
      37  t2 f1 ();
      38  /* { dg-final { scan-file va-opt-3.i "t2 b;" } } */
      39  t3 f2 (1, 2);
      40  /* { dg-final { scan-file va-opt-3.i "t3 cd;" } } */
      41  t4 f2 ();
      42  /* { dg-final { scan-file va-opt-3.i "t4 d;" } } */
      43  t5 f3 (1);
      44  /* { dg-final { scan-file va-opt-3.i "t5 e;" } } */
      45  t6 f4 (2);
      46  /* { dg-final { scan-file va-opt-3.i "t6 f;" } } */
      47  t7 f5 (6, 7);
      48  /* { dg-final { scan-file va-opt-3.i "t7 ghi;" } } */
      49  t8 f5 ();
      50  /* { dg-final { scan-file va-opt-3.i "t8 gi;" } } */
      51  t9 f6 (8);
      52  /* { dg-final { scan-file va-opt-3.i "t9 jk;" } } */
      53  t10 f7 ();
      54  /* { dg-final { scan-file va-opt-3.i "t10 l;" } } */
      55  t11 f8 ();
      56  /* { dg-final { scan-file va-opt-3.i "t11 m;" } } */
      57  t12 f9 ();
      58  /* { dg-final { scan-file va-opt-3.i "t12 no;" } } */
      59  t13 f10 (p, 5, 6);
      60  /* { dg-final { scan-file va-opt-3.i "t13 pp;" } } */
      61  t14 f10 (p);
      62  /* { dg-final { scan-file va-opt-3.i "t14 p;" } } */
      63  t15 f11 (q, 7);
      64  /* { dg-final { scan-file va-opt-3.i "t15 qq;" } } */
      65  t16 f11 (q);
      66  /* { dg-final { scan-file va-opt-3.i "t16 q;" } } */
      67  t17 f12 (r, 1, 2, 3, 4, 5);
      68  /* { dg-final { scan-file va-opt-3.i "t17 rrr;" } } */
      69  t18 f12 (r);
      70  /* { dg-final { scan-file va-opt-3.i "t18 rr;" } } */
      71  t19 f13 (1, 2);
      72  /* { dg-final { scan-file va-opt-3.i "t19 a b c;" } } */
      73  t20 f13 ();
      74  /* { dg-final { scan-file va-opt-3.i "t20 c;" } } */
      75  t21 f14 (3, 4, 5, 2);
      76  /* { dg-final { scan-file va-opt-3.i "t21 3 4 5;" } } */
      77  t22 f14 (3, 4, 5);
      78  /* { dg-final { scan-file va-opt-3.i "t22 5;" } } */
      79  t23 f15 (6, 7, 8, 9);
      80  /* { dg-final { scan-file va-opt-3.i "t23 6 7 7 8 6 8 6 6;" } } */
      81  t24 f15 (6, 7, 8);
      82  /* { dg-final { scan-file va-opt-3.i "t24 6 6;" } } */
      83  t25 f19 (f16 (), 1);
      84  /* { dg-final { scan-file va-opt-3.i {t25 g f18 \( \) f17 \( \) "f16 \(\)";} } } */
      85  t26 f20 (f21 (), 2);
      86  /* { dg-final { scan-file va-opt-3.i "t26 f17 h;" } } */
      87  t27 f22 (, x);
      88  /* { dg-final { scan-file va-opt-3.i "t27 1 23;" } } */
      89  t28 f23 (, x);
      90  /* { dg-final { scan-file va-opt-3.i "t28 1 23;" } } */
      91  t29 f24 (, x);
      92  /* { dg-final { scan-file va-opt-3.i "t29 12 3;" } } */
      93  t30 f25 (, x);
      94  /* { dg-final { scan-file va-opt-3.i "t30 12 3;" } } */