Faisal Vali | 1826842 | 2017-10-15 01:26:26 +0000 | [diff] [blame] | 1 | // RUN: %clang_cc1 -E %s -pedantic -std=c++2a | FileCheck -strict-whitespace %s
|
| 2 |
|
| 3 | #define LPAREN (
|
| 4 | #define RPAREN )
|
| 5 |
|
| 6 | #define A0 expandedA0
|
| 7 | #define A1 expandedA1 A0
|
| 8 | #define A2 expandedA2 A1
|
| 9 | #define A3 expandedA3 A2
|
| 10 |
|
| 11 | #define A() B LPAREN )
|
| 12 | #define B() C LPAREN )
|
| 13 | #define C() D LPAREN )
|
| 14 |
|
| 15 |
|
| 16 | #define F(x, y) x + y
|
| 17 | #define ELLIP_FUNC(...) __VA_OPT__(__VA_ARGS__)
|
| 18 |
|
| 19 | 1: ELLIP_FUNC(F, LPAREN, 'a', 'b', RPAREN);
|
| 20 | 2: ELLIP_FUNC(F LPAREN 'a', 'b' RPAREN);
|
| 21 | #undef F
|
| 22 | #undef ELLIP_FUNC
|
| 23 |
|
| 24 | // CHECK: 1: F, (, 'a', 'b', );
|
| 25 | // CHECK: 2: 'a' + 'b';
|
| 26 |
|
| 27 | #define F(...) f(0 __VA_OPT__(,) __VA_ARGS__)
|
| 28 | 3: F(a, b, c) // replaced by f(0, a, b, c)
|
| 29 | 4: F() // replaced by f(0)
|
| 30 |
|
| 31 | // CHECK: 3: f(0 , a, b, c)
|
| 32 | // CHECK: 4: f(0 )
|
| 33 | #undef F
|
| 34 |
|
| 35 | #define G(X, ...) f(0, X __VA_OPT__(,) __VA_ARGS__)
|
| 36 |
|
| 37 | 5: G(a, b, c) // replaced by f(0, a , b, c)
|
| 38 | 6: G(a) // replaced by f(0, a)
|
| 39 | 7: G(a,) // replaced by f(0, a)
|
| 40 | 7.1: G(a,,)
|
| 41 |
|
| 42 |
|
| 43 | // CHECK: 5: f(0, a , b, c)
|
| 44 | // CHECK: 6: f(0, a )
|
| 45 | // CHECK: 7: f(0, a )
|
| 46 | // CHECK: 7.1: f(0, a , ,)
|
| 47 | #undef G
|
| 48 |
|
| 49 | #define HT_B() TONG
|
| 50 |
|
| 51 | #define F(x, ...) HT_ ## __VA_OPT__(x x A() #x)
|
| 52 |
|
| 53 | 8: F(1)
|
| 54 | 9: F(A(),1)
|
| 55 |
|
| 56 | // CHECK: 8: HT_
|
| 57 | // CHECK: 9: TONG C ( ) B ( ) "A()"
|
| 58 | #undef HT_B
|
| 59 | #undef F
|
| 60 |
|
| 61 | #define F(a,...) #__VA_OPT__(A1 a)
|
| 62 |
|
| 63 | 10: F(A())
|
| 64 | 11: F(A1 A(), 1)
|
| 65 | // CHECK: 10: ""
|
| 66 | // CHECK: 11: "A1 expandedA1 expandedA0 B ( )"
|
| 67 | #undef F
|
| 68 |
|
| 69 |
|
| 70 | #define F(a,...) a ## __VA_OPT__(A1 a) ## __VA_ARGS__ ## a
|
| 71 | 12.0: F()
|
| 72 | 12: F(,)
|
| 73 | 13: F(B,)
|
| 74 | // CHECK: 12.0:
|
| 75 | // CHECK: 12:
|
| 76 | // CHECK: 13: BB
|
| 77 | #undef F
|
| 78 |
|
| 79 | #define F(...) #__VA_OPT__() X ## __VA_OPT__() #__VA_OPT__( )
|
| 80 |
|
| 81 | 14: F()
|
| 82 | 15: F(1)
|
| 83 |
|
| 84 | // CHECK: 14: "" X ""
|
| 85 | // CHECK: 15: "" X ""
|
| 86 |
|
| 87 | #undef F
|
| 88 |
|
| 89 | #define SDEF(sname, ...) S sname __VA_OPT__(= { __VA_ARGS__ })
|
| 90 |
|
| 91 | 16: SDEF(foo); // replaced by S foo;
|
| 92 | 17: SDEF(bar, 1, 2); // replaced by S bar = { 1, 2 };
|
| 93 |
|
| 94 | // CHECK: 16: S foo ;
|
| 95 | // CHECK: 17: S bar = { 1, 2 };
|
| 96 | #undef SDEF
|
| 97 |
|
| 98 | #define F(a,...) A() #__VA_OPT__(A3 __VA_ARGS__ a ## __VA_ARGS__ ## a ## C A3) A()
|
| 99 |
|
| 100 | 18: F()
|
| 101 | 19: F(,)
|
| 102 | 20: F(,A3)
|
| 103 | 21: F(A3, A(),A0)
|
| 104 |
|
| 105 |
|
| 106 | // CHECK: 18: B ( ) "" B ( )
|
| 107 | // CHECK: 19: B ( ) "" B ( )
|
| 108 | // CHECK: 20: B ( ) "A3 expandedA3 expandedA2 expandedA1 expandedA0 A3C A3" B ( )
|
| 109 | // CHECK: 21: B ( ) "A3 B ( ),expandedA0 A3A(),A0A3C A3" B ( )
|
| 110 |
|
| 111 | #undef F
|
| 112 |
|
| 113 | #define F(a,...) A() #__VA_OPT__(A3 __VA_ARGS__ a ## __VA_ARGS__ ## a ## C A3) a __VA_OPT__(A0 __VA_ARGS__ a ## __VA_ARGS__ ## a ## C A0) A()
|
| 114 |
|
| 115 | 22: F()
|
| 116 | 23: F(,)
|
| 117 | 24: F(,A0)
|
| 118 | 25: F(A0, A(),A0)
|
| 119 |
|
| 120 |
|
| 121 | // CHECK: 22: B ( ) "" B ( )
|
| 122 | // CHECK: 23: B ( ) "" B ( )
|
| 123 | // CHECK: 24: B ( ) "A3 expandedA0 A0C A3" expandedA0 expandedA0 A0C expandedA0 B ( )
|
| 124 | // CHECK: 25: B ( ) "A3 B ( ),expandedA0 A0A(),A0A0C A3" expandedA0 expandedA0 C ( ),expandedA0 A0A(),A0A0C expandedA0 B ( )
|
| 125 |
|
| 126 | #undef F
|
| 127 |
|
| 128 | #define F(a,...) __VA_OPT__(B a ## a) ## 1
|
| 129 | #define G(a,...) __VA_OPT__(B a) ## 1
|
| 130 | 26: F(,1)
|
| 131 | 26_1: G(,1)
|
| 132 | // CHECK: 26: B1
|
| 133 | // CHECK: 26_1: B1
|
| 134 | #undef F
|
| 135 | #undef G
|
| 136 |
|
| 137 | #define F(a,...) B ## __VA_OPT__(a 1) ## 1
|
| 138 | #define G(a,...) B ## __VA_OPT__(a ## a 1) ## 1
|
| 139 |
|
| 140 | 27: F(,1)
|
| 141 | 27_1: F(A0,1)
|
| 142 | 28: G(,1)
|
| 143 | // CHECK: 27: B11
|
| 144 | // CHECK: 27_1: BexpandedA0 11
|
| 145 | // CHECK: 28: B11
|
| 146 |
|
| 147 | #undef F
|
| 148 | #undef G
|