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