1 // RUN: %clang_cc1 -triple x86_64-unknown-unknown -std=c++17 -ast-dump %s | FileCheck -strict-whitespace %s
2 
3 struct A;
4 // CHECK: CXXRecordDecl 0x{{[^ ]*}} <{{.*}}:1, col:8> col:8 struct A
5 
6 struct B;
7 // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, col:8> col:8 referenced struct B
8 
9 struct A {
10   // CHECK: CXXRecordDecl 0x{{[^ ]*}} prev 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+29]]:1> line:[[@LINE-1]]:8 struct A definition
11   // CHECK-NEXT: DefinitionData pass_in_registers aggregate standard_layout trivially_copyable pod trivial literal
12   // CHECK-NEXT: DefaultConstructor exists trivial needs_implicit
13   // CHECK-NEXT: CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
14   // CHECK-NEXT: MoveConstructor exists simple trivial needs_implicit
15   // CHECK-NEXT: CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
16   // CHECK-NEXT: MoveAssignment exists simple trivial needs_implicit
17   // CHECK-NEXT: Destructor simple irrelevant trivial needs_implicit
18 
19   // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:1, col:8> col:8 implicit struct A
20   int a;
21   // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:7> col:7 a 'int'
22   int b, c;
23   // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:7> col:7 b 'int'
24   // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <col:3, col:10> col:10 c 'int'
25   int d : 12;
26   // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:11> col:7 d 'int'
27   // CHECK-NEXT: ConstantExpr 0x{{[^ ]*}} <col:11> 'int'
28   // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:11> 'int' 12
29   int : 0;
30   // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:9> col:7 'int'
31   // CHECK-NEXT: ConstantExpr 0x{{[^ ]*}} <col:9> 'int'
32   // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:9> 'int' 0
33   int e : 10;
34   // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:11> col:7 e 'int'
35   // CHECK-NEXT: ConstantExpr 0x{{[^ ]*}} <col:11> 'int'
36   // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:11> 'int' 10
37   B *f;
38   // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:6> col:6 f 'B *'
39 };
40 
41 struct C {
42   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+66]]:1> line:[[@LINE-1]]:8 struct C definition
43   // CHECK-NEXT: DefinitionData pass_in_registers aggregate standard_layout trivially_copyable pod trivial literal has_variant_members
44   // CHECK-NEXT: DefaultConstructor exists trivial needs_implicit
45   // CHECK-NEXT: CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
46   // CHECK-NEXT: MoveConstructor exists simple trivial needs_implicit
47   // CHECK-NEXT: CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
48   // CHECK-NEXT: MoveAssignment exists simple trivial needs_implicit
49   // CHECK-NEXT: Destructor simple irrelevant trivial needs_implicit
50 
51   // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:1, col:8> col:8 implicit struct C
52   struct {
53     // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:3, line:[[@LINE+10]]:3> line:[[@LINE-1]]:3 struct definition
54     // CHECK-NEXT: DefinitionData pass_in_registers aggregate standard_layout trivially_copyable pod trivial literal
55     // CHECK-NEXT: DefaultConstructor exists trivial needs_implicit
56     // CHECK-NEXT: CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
57     // CHECK-NEXT: MoveConstructor exists simple trivial needs_implicit
58     // CHECK-NEXT: CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
59     // CHECK-NEXT: MoveAssignment exists simple trivial needs_implicit
60     // CHECK-NEXT: Destructor simple irrelevant trivial needs_implicit
61     int a;
62     // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:5, col:9> col:9 a 'int'
63   } b;
64   // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-12]]:3, line:[[@LINE-1]]:5> col:5 b 'struct (anonymous struct at {{.*}}:[[@LINE-12]]:3)':'C::(anonymous struct at {{.*}}:[[@LINE-12]]:3)'
65 
66   union {
67     // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:3, line:[[@LINE+12]]:3> line:[[@LINE-1]]:3 union definition
68     // CHECK-NEXT: DefinitionData pass_in_registers aggregate standard_layout trivially_copyable pod trivial literal
69     // CHECK-NEXT: DefaultConstructor exists trivial needs_implicit
70     // CHECK-NEXT: CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
71     // CHECK-NEXT: MoveConstructor exists simple trivial needs_implicit
72     // CHECK-NEXT: CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
73     // CHECK-NEXT: MoveAssignment exists simple trivial needs_implicit
74     // CHECK-NEXT: Destructor simple irrelevant trivial needs_implicit
75     int c;
76     // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:5, col:9> col:9 c 'int'
77     float d;
78     // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:5, col:11> col:11 d 'float'
79   };
80   // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-14]]:3> col:3 implicit 'C::(anonymous union at {{.*}}:[[@LINE-14]]:3)'
81   // CHECK-NEXT: IndirectFieldDecl 0x{{[^ ]*}} <line:[[@LINE-6]]:9> col:9 implicit c 'int'
82   // CHECK-NEXT: Field 0x{{[^ ]*}} '' 'C::(anonymous union at {{.*}}:[[@LINE-16]]:3)'
83   // CHECK-NEXT: Field 0x{{[^ ]*}} 'c' 'int'
84   // CHECK-NEXT: IndirectFieldDecl 0x{{[^ ]*}} <line:[[@LINE-7]]:11> col:11 implicit d 'float'
85   // CHECK-NEXT: Field 0x{{[^ ]*}} '' 'C::(anonymous union at {{.*}}:[[@LINE-19]]:3)'
86   // CHECK-NEXT: Field 0x{{[^ ]*}} 'd' 'float'
87 
88   struct {
89     // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:3, line:[[@LINE+11]]:3> line:[[@LINE-1]]:3 struct definition
90     // CHECK-NEXT: DefinitionData pass_in_registers aggregate standard_layout trivially_copyable pod trivial literal
91     // CHECK-NEXT: DefaultConstructor exists trivial needs_implicit
92     // CHECK-NEXT: CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
93     // CHECK-NEXT: MoveConstructor exists simple trivial needs_implicit
94     // CHECK-NEXT: CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
95     // CHECK-NEXT: MoveAssignment exists simple trivial needs_implicit
96     // CHECK-NEXT: Destructor simple irrelevant trivial needs_implicit
97     int e, f;
98     // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:5, col:9> col:9 e 'int'
99     // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <col:5, col:12> col:12 f 'int'
100   };
101   // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-13]]:3> col:3 implicit 'C::(anonymous struct at {{.*}}:[[@LINE-13]]:3)'
102   // CHECK-NEXT: IndirectFieldDecl 0x{{[^ ]*}} <line:[[@LINE-5]]:9> col:9 implicit e 'int'
103   // CHECK-NEXT: Field 0x{{[^ ]*}} '' 'C::(anonymous struct at {{.*}}:[[@LINE-15]]:3)'
104   // CHECK-NEXT: Field 0x{{[^ ]*}} 'e' 'int'
105   // CHECK-NEXT: IndirectFieldDecl 0x{{[^ ]*}} <col:12> col:12 implicit f 'int'
106   // CHECK-NEXT: Field 0x{{[^ ]*}} '' 'C::(anonymous struct at {{.*}}:[[@LINE-18]]:3)'
107   // CHECK-NEXT: Field 0x{{[^ ]*}} 'f' 'int'
108 };
109 
110 struct D {
111   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+16]]:1> line:[[@LINE-1]]:8 struct D definition
112   // CHECK-NEXT: DefinitionData pass_in_registers aggregate standard_layout trivially_copyable pod trivial literal
113   // CHECK-NEXT: DefaultConstructor exists trivial needs_implicit
114   // CHECK-NEXT: CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
115   // CHECK-NEXT: MoveConstructor exists simple trivial needs_implicit
116   // CHECK-NEXT: CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
117   // CHECK-NEXT: MoveAssignment exists simple trivial needs_implicit
118   // CHECK-NEXT: Destructor simple irrelevant trivial needs_implicit
119 
120   // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:1, col:8> col:8 implicit struct D
121   int a;
122   // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:7> col:7 a 'int'
123   int b[10];
124   // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:11> col:7 b 'int [10]'
125   int c[];
126   // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:9> col:7 c 'int []'
127 };
128 
129 union E;
130 // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, col:7> col:7 union E
131 
132 union F;
133 // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, col:7> col:7 union F
134 
135 union E {
136   // CHECK: CXXRecordDecl 0x{{[^ ]*}} prev 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+29]]:1> line:[[@LINE-1]]:7 union E definition
137   // CHECK-NEXT: DefinitionData pass_in_registers aggregate standard_layout trivially_copyable pod trivial literal
138   // CHECK-NEXT: DefaultConstructor exists trivial needs_implicit
139   // CHECK-NEXT: CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
140   // CHECK-NEXT: MoveConstructor exists simple trivial needs_implicit
141   // CHECK-NEXT: CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
142   // CHECK-NEXT: MoveAssignment exists simple trivial needs_implicit
143   // CHECK-NEXT: Destructor simple irrelevant trivial needs_implicit
144 
145   // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:1, col:7> col:7 implicit union E
146   int a;
147   // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:7> col:7 a 'int'
148   int b, c;
149   // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:7> col:7 b 'int'
150   // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <col:3, col:10> col:10 c 'int'
151   int d : 12;
152   // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:11> col:7 d 'int'
153   // CHECK-NEXT: ConstantExpr 0x{{[^ ]*}} <col:11> 'int'
154   // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:11> 'int' 12
155   int : 0;
156   // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:9> col:7 'int'
157   // CHECK-NEXT: ConstantExpr 0x{{[^ ]*}} <col:9> 'int'
158   // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:9> 'int' 0
159   int e : 10;
160   // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:11> col:7 e 'int'
161   // CHECK-NEXT: ConstantExpr 0x{{[^ ]*}} <col:11> 'int'
162   // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:11> 'int' 10
163   B *f;
164   // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:6> col:6 f 'B *'
165 };
166 
167 union G {
168   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+71]]:1> line:[[@LINE-1]]:7 union G definition
169   // CHECK-NEXT: DefinitionData pass_in_registers aggregate standard_layout trivially_copyable pod trivial literal
170   // CHECK-NEXT: DefaultConstructor exists trivial needs_implicit
171   // CHECK-NEXT: CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
172   // CHECK-NEXT: MoveConstructor exists simple trivial needs_implicit
173   // CHECK-NEXT: CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
174   // CHECK-NEXT: MoveAssignment exists simple trivial needs_implicit
175   // CHECK-NEXT: Destructor simple irrelevant trivial needs_implicit
176 
177   // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:1, col:7> col:7 implicit union G
178   struct {
179     // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:3, line:[[@LINE+11]]:3> line:[[@LINE-1]]:3 struct definition
180     // CHECK-NEXT: DefinitionData pass_in_registers aggregate standard_layout trivially_copyable pod trivial literal
181     // CHECK-NEXT: DefaultConstructor exists trivial needs_implicit
182     // CHECK-NEXT: CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
183     // CHECK-NEXT: MoveConstructor exists simple trivial needs_implicit
184     // CHECK-NEXT: CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
185     // CHECK-NEXT: MoveAssignment exists simple trivial needs_implicit
186     // CHECK-NEXT: Destructor simple irrelevant trivial needs_implicit
187 
188     int a;
189     // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:5, col:9> col:9 a 'int'
190   } b;
191   // FIXME: note that it talks about 'struct G' below; the same happens in
192   // other cases with union G as well.
193   // CHECK: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-15]]:3, line:[[@LINE-3]]:5> col:5 b 'struct (anonymous struct at {{.*}}:[[@LINE-15]]:3)':'G::(anonymous struct at {{.*}}:[[@LINE-15]]:3)'
194 
195   union {
196     // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:3, line:[[@LINE+13]]:3> line:[[@LINE-1]]:3 union definition
197     // CHECK-NEXT: DefinitionData pass_in_registers aggregate standard_layout trivially_copyable pod trivial literal
198     // CHECK-NEXT: DefaultConstructor exists trivial needs_implicit
199     // CHECK-NEXT: CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
200     // CHECK-NEXT: MoveConstructor exists simple trivial needs_implicit
201     // CHECK-NEXT: CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
202     // CHECK-NEXT: MoveAssignment exists simple trivial needs_implicit
203     // CHECK-NEXT: Destructor simple irrelevant trivial needs_implicit
204 
205     int c;
206     // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:5, col:9> col:9 c 'int'
207     float d;
208     // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:5, col:11> col:11 d 'float'
209   };
210   // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-15]]:3> col:3 implicit 'G::(anonymous union at {{.*}}:[[@LINE-15]]:3)'
211   // CHECK-NEXT: IndirectFieldDecl 0x{{[^ ]*}} <line:[[@LINE-6]]:9> col:9 implicit c 'int'
212   // CHECK-NEXT: Field 0x{{[^ ]*}} '' 'G::(anonymous union at {{.*}}:[[@LINE-17]]:3)'
213   // CHECK-NEXT: Field 0x{{[^ ]*}} 'c' 'int'
214   // CHECK-NEXT: IndirectFieldDecl 0x{{[^ ]*}} <line:[[@LINE-7]]:11> col:11 implicit d 'float'
215   // CHECK-NEXT: Field 0x{{[^ ]*}} '' 'G::(anonymous union at {{.*}}:[[@LINE-20]]:3)'
216   // CHECK-NEXT: Field 0x{{[^ ]*}} 'd' 'float'
217 
218   struct {
219     // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:3, line:[[@LINE+12]]:3> line:[[@LINE-1]]:3 struct definition
220     // CHECK-NEXT: DefinitionData pass_in_registers aggregate standard_layout trivially_copyable pod trivial literal
221     // CHECK-NEXT: DefaultConstructor exists trivial needs_implicit
222     // CHECK-NEXT: CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
223     // CHECK-NEXT: MoveConstructor exists simple trivial needs_implicit
224     // CHECK-NEXT: CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
225     // CHECK-NEXT: MoveAssignment exists simple trivial needs_implicit
226     // CHECK-NEXT: Destructor simple irrelevant trivial needs_implicit
227 
228     int e, f;
229     // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:5, col:9> col:9 e 'int'
230     // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <col:5, col:12> col:12 f 'int'
231   };
232   // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-14]]:3> col:3 implicit 'G::(anonymous struct at {{.*}}:[[@LINE-14]]:3)'
233   // CHECK-NEXT: IndirectFieldDecl 0x{{[^ ]*}} <line:[[@LINE-5]]:9> col:9 implicit e 'int'
234   // CHECK-NEXT: Field 0x{{[^ ]*}} '' 'G::(anonymous struct at {{.*}}:[[@LINE-16]]:3)'
235   // CHECK-NEXT: Field 0x{{[^ ]*}} 'e' 'int'
236   // CHECK-NEXT: IndirectFieldDecl 0x{{[^ ]*}} <col:12> col:12 implicit f 'int'
237   // CHECK-NEXT: Field 0x{{[^ ]*}} '' 'G::(anonymous struct at {{.*}}:[[@LINE-19]]:3)'
238   // CHECK-NEXT: Field 0x{{[^ ]*}} 'f' 'int'
239 };
240 
241 struct Base1 {};
242 struct Base2 {};
243 struct Base3 {};
244 
245 struct Derived1 : Base1 {
246   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct Derived1 definition
247   // CHECK: public 'Base1'
248 };
249 
250 struct Derived2 : private Base1 {
251   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct Derived2 definition
252   // CHECK: private 'Base1'
253 };
254 
255 struct Derived3 : virtual Base1 {
256   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct Derived3 definition
257   // CHECK: virtual public 'Base1'
258 };
259 
260 struct Derived4 : Base1, virtual Base2, protected Base3 {
261   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+4]]:1> line:[[@LINE-1]]:8 struct Derived4 definition
262   // CHECK: public 'Base1'
263   // CHECK-NEXT: virtual public 'Base2'
264   // CHECK-NEXT: protected 'Base3'
265 };
266 
267 struct Derived5 : protected virtual Base1 {
268   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct Derived5 definition
269   // CHECK: virtual protected 'Base1'
270 };
271 
272 template <typename... Bases>
273 struct Derived6 : virtual public Bases... {
274   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct Derived6 definition
275   // CHECK: virtual public 'Bases'...
276 };
277