Clang Project

clang_source_code/test/Preprocessor/macro_vaopt_expand.cpp
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
191: ELLIP_FUNC(F, LPAREN, 'a', 'b', RPAREN); 
202: 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__)
283: F(a, b, c) // replaced by f(0, a, b, c) 
294: 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
375: G(a, b, c) // replaced by f(0, a , b, c) 
386: G(a) // replaced by f(0, a) 
397: G(a,) // replaced by f(0, a) 
407.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
538: F(1)
549: 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
6310: F(A())
6411: 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
7112.0: F()
7212: F(,)
7313: 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
8114: F()
8215: 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
9116: SDEF(foo); // replaced by S foo; 
9217: 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
10018: F()
10119: F(,)
10220: F(,A3)
10321: 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
11522: F()
11623: F(,)
11724: F(,A0)
11825: 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
13026: F(,1)
13126_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
14027: F(,1)
14127_1: F(A0,1)
14228: G(,1)
143// CHECK: 27: B11
144// CHECK: 27_1: BexpandedA0 11
145// CHECK: 28: B11
146
147#undef F
148#undef G
149