315 lines · cpp
1// Test without serialization:2// RUN: %clang_cc1 -triple x86_64-unknown-unknown -std=c++17 -ast-dump %s \3// RUN: | FileCheck -strict-whitespace %s4//5// Test with serialization:6// RUN: %clang_cc1 -triple x86_64-unknown-unknown -std=c++17 -emit-pch -o %t %s7// RUN: %clang_cc1 -x c++ -triple x86_64-unknown-unknown -std=c++17 -include-pch %t -ast-dump-all /dev/null \8// RUN: | sed -e "s/ <undeserialized declarations>//" -e "s/ imported//" \9// RUN: | FileCheck -strict-whitespace %s10 11struct A;12// CHECK: CXXRecordDecl 0x{{[^ ]*}} <{{.*}}:1, col:8> col:8 struct A13 14struct B;15// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, col:8> col:8 referenced struct B16 17struct A {18 // CHECK: CXXRecordDecl 0x{{[^ ]*}} prev 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+32]]:1> line:[[@LINE-1]]:8 struct A definition19 // CHECK-NEXT: DefinitionData pass_in_registers aggregate standard_layout trivially_copyable pod trivial literal20 // CHECK-NEXT: DefaultConstructor exists trivial needs_implicit21 // CHECK-NEXT: CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param22 // CHECK-NEXT: MoveConstructor exists simple trivial needs_implicit23 // CHECK-NEXT: CopyAssignment simple trivial has_const_param needs_implicit implicit_has_const_param24 // CHECK-NEXT: MoveAssignment exists simple trivial needs_implicit25 // CHECK-NEXT: Destructor simple irrelevant trivial needs_implicit26 27 // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:1, col:8> col:8 implicit struct A28 int a;29 // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:7> col:7 a 'int'30 int b, c;31 // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:7> col:7 b 'int'32 // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <col:3, col:10> col:10 c 'int'33 int d : 12;34 // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:11> col:7 d 'int'35 // CHECK-NEXT: ConstantExpr 0x{{[^ ]*}} <col:11> 'int'36 // CHECK-NEXT: value: Int 1237 // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:11> 'int' 1238 int : 0;39 // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:9> col:7 'int'40 // CHECK-NEXT: ConstantExpr 0x{{[^ ]*}} <col:9> 'int'41 // CHECK-NEXT: value: Int 042 // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:9> 'int' 043 int e : 10;44 // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:11> col:7 e 'int'45 // CHECK-NEXT: ConstantExpr 0x{{[^ ]*}} <col:11> 'int'46 // CHECK-NEXT: value: Int 1047 // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:11> 'int' 1048 B *f;49 // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:6> col:6 f 'B *'50};51 52struct C {53 // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+66]]:1> line:[[@LINE-1]]:8 struct C definition54 // CHECK-NEXT: DefinitionData pass_in_registers aggregate standard_layout trivially_copyable pod trivial literal has_variant_members55 // CHECK-NEXT: DefaultConstructor exists trivial needs_implicit56 // CHECK-NEXT: CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param57 // CHECK-NEXT: MoveConstructor exists simple trivial needs_implicit58 // CHECK-NEXT: CopyAssignment simple trivial has_const_param needs_implicit implicit_has_const_param59 // CHECK-NEXT: MoveAssignment exists simple trivial needs_implicit60 // CHECK-NEXT: Destructor simple irrelevant trivial needs_implicit61 62 // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:1, col:8> col:8 implicit struct C63 struct {64 // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:3, line:[[@LINE+10]]:3> line:[[@LINE-1]]:3 struct definition65 // CHECK-NEXT: DefinitionData pass_in_registers aggregate standard_layout trivially_copyable pod trivial literal66 // CHECK-NEXT: DefaultConstructor exists trivial needs_implicit67 // CHECK-NEXT: CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param68 // CHECK-NEXT: MoveConstructor exists simple trivial needs_implicit69 // CHECK-NEXT: CopyAssignment simple trivial has_const_param needs_implicit implicit_has_const_param70 // CHECK-NEXT: MoveAssignment exists simple trivial needs_implicit71 // CHECK-NEXT: Destructor simple irrelevant trivial needs_implicit72 int a;73 // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:5, col:9> col:9 a 'int'74 } b;75 // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-12]]:3, line:[[@LINE-1]]:5> col:5 b 'struct (unnamed struct at {{.*}}:[[@LINE-12]]:3)'76 77 union {78 // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:3, line:[[@LINE+12]]:3> line:[[@LINE-1]]:3 union definition79 // CHECK-NEXT: DefinitionData is_anonymous pass_in_registers aggregate standard_layout trivially_copyable pod trivial literal80 // CHECK-NEXT: DefaultConstructor exists trivial needs_implicit81 // CHECK-NEXT: CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param82 // CHECK-NEXT: MoveConstructor exists simple trivial needs_implicit83 // CHECK-NEXT: CopyAssignment simple trivial has_const_param needs_implicit implicit_has_const_param84 // CHECK-NEXT: MoveAssignment exists simple trivial needs_implicit85 // CHECK-NEXT: Destructor simple irrelevant trivial needs_implicit86 int c;87 // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:5, col:9> col:9 c 'int'88 float d;89 // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:5, col:11> col:11 d 'float'90 };91 // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-14]]:3> col:3 implicit 'C::(anonymous union at {{.*}}:[[@LINE-14]]:3)'92 // CHECK-NEXT: IndirectFieldDecl 0x{{[^ ]*}} <line:[[@LINE-6]]:9> col:9 implicit c 'int'93 // CHECK-NEXT: Field 0x{{[^ ]*}} field_index 1 'C::(anonymous union at {{.*}}:[[@LINE-16]]:3)'94 // CHECK-NEXT: Field 0x{{[^ ]*}} 'c' 'int'95 // CHECK-NEXT: IndirectFieldDecl 0x{{[^ ]*}} <line:[[@LINE-7]]:11> col:11 implicit d 'float'96 // CHECK-NEXT: Field 0x{{[^ ]*}} field_index 1 'C::(anonymous union at {{.*}}:[[@LINE-19]]:3)'97 // CHECK-NEXT: Field 0x{{[^ ]*}} 'd' 'float'98 99 struct {100 // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:3, line:[[@LINE+11]]:3> line:[[@LINE-1]]:3 struct definition101 // CHECK-NEXT: DefinitionData is_anonymous pass_in_registers aggregate standard_layout trivially_copyable pod trivial literal102 // CHECK-NEXT: DefaultConstructor exists trivial needs_implicit103 // CHECK-NEXT: CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param104 // CHECK-NEXT: MoveConstructor exists simple trivial needs_implicit105 // CHECK-NEXT: CopyAssignment simple trivial has_const_param needs_implicit implicit_has_const_param106 // CHECK-NEXT: MoveAssignment exists simple trivial needs_implicit107 // CHECK-NEXT: Destructor simple irrelevant trivial needs_implicit108 int e, f;109 // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:5, col:9> col:9 e 'int'110 // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <col:5, col:12> col:12 f 'int'111 };112 // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-13]]:3> col:3 implicit 'C::(anonymous struct at {{.*}}:[[@LINE-13]]:3)'113 // CHECK-NEXT: IndirectFieldDecl 0x{{[^ ]*}} <line:[[@LINE-5]]:9> col:9 implicit e 'int'114 // CHECK-NEXT: Field 0x{{[^ ]*}} field_index 2 'C::(anonymous struct at {{.*}}:[[@LINE-15]]:3)'115 // CHECK-NEXT: Field 0x{{[^ ]*}} 'e' 'int'116 // CHECK-NEXT: IndirectFieldDecl 0x{{[^ ]*}} <col:12> col:12 implicit f 'int'117 // CHECK-NEXT: Field 0x{{[^ ]*}} field_index 2 'C::(anonymous struct at {{.*}}:[[@LINE-18]]:3)'118 // CHECK-NEXT: Field 0x{{[^ ]*}} 'f' 'int'119};120 121struct D {122 // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+16]]:1> line:[[@LINE-1]]:8 struct D definition123 // CHECK-NEXT: DefinitionData pass_in_registers aggregate standard_layout trivially_copyable pod trivial literal124 // CHECK-NEXT: DefaultConstructor exists trivial needs_implicit125 // CHECK-NEXT: CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param126 // CHECK-NEXT: MoveConstructor exists simple trivial needs_implicit127 // CHECK-NEXT: CopyAssignment simple trivial has_const_param needs_implicit implicit_has_const_param128 // CHECK-NEXT: MoveAssignment exists simple trivial needs_implicit129 // CHECK-NEXT: Destructor simple irrelevant trivial needs_implicit130 131 // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:1, col:8> col:8 implicit struct D132 int a;133 // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:7> col:7 a 'int'134 int b[10];135 // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:11> col:7 b 'int[10]'136 int c[];137 // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:9> col:7 c 'int[]'138};139 140union E;141// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, col:7> col:7 union E142 143union F;144// CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, col:7> col:7 union F145 146union E {147 // CHECK: CXXRecordDecl 0x{{[^ ]*}} prev 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+32]]:1> line:[[@LINE-1]]:7 union E definition148 // CHECK-NEXT: DefinitionData pass_in_registers aggregate standard_layout trivially_copyable pod trivial literal149 // CHECK-NEXT: DefaultConstructor exists trivial needs_implicit150 // CHECK-NEXT: CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param151 // CHECK-NEXT: MoveConstructor exists simple trivial needs_implicit152 // CHECK-NEXT: CopyAssignment simple trivial has_const_param needs_implicit implicit_has_const_param153 // CHECK-NEXT: MoveAssignment exists simple trivial needs_implicit154 // CHECK-NEXT: Destructor simple irrelevant trivial needs_implicit155 156 // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:1, col:7> col:7 implicit union E157 int a;158 // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:7> col:7 a 'int'159 int b, c;160 // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:7> col:7 b 'int'161 // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <col:3, col:10> col:10 c 'int'162 int d : 12;163 // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:11> col:7 d 'int'164 // CHECK-NEXT: ConstantExpr 0x{{[^ ]*}} <col:11> 'int'165 // CHECK-NEXT: value: Int 12166 // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:11> 'int' 12167 int : 0;168 // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:9> col:7 'int'169 // CHECK-NEXT: ConstantExpr 0x{{[^ ]*}} <col:9> 'int'170 // CHECK-NEXT: value: Int 0171 // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:9> 'int' 0172 int e : 10;173 // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:11> col:7 e 'int'174 // CHECK-NEXT: ConstantExpr 0x{{[^ ]*}} <col:11> 'int'175 // CHECK-NEXT: value: Int 10176 // CHECK-NEXT: IntegerLiteral 0x{{[^ ]*}} <col:11> 'int' 10177 B *f;178 // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:3, col:6> col:6 f 'B *'179};180 181union G {182 // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+69]]:1> line:[[@LINE-1]]:7 union G definition183 // CHECK-NEXT: DefinitionData pass_in_registers aggregate standard_layout trivially_copyable pod trivial literal184 // CHECK-NEXT: DefaultConstructor exists trivial needs_implicit185 // CHECK-NEXT: CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param186 // CHECK-NEXT: MoveConstructor exists simple trivial needs_implicit187 // CHECK-NEXT: CopyAssignment simple trivial has_const_param needs_implicit implicit_has_const_param188 // CHECK-NEXT: MoveAssignment exists simple trivial needs_implicit189 // CHECK-NEXT: Destructor simple irrelevant trivial needs_implicit190 191 // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <col:1, col:7> col:7 implicit union G192 struct {193 // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:3, line:[[@LINE+11]]:3> line:[[@LINE-1]]:3 struct definition194 // CHECK-NEXT: DefinitionData pass_in_registers aggregate standard_layout trivially_copyable pod trivial literal195 // CHECK-NEXT: DefaultConstructor exists trivial needs_implicit196 // CHECK-NEXT: CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param197 // CHECK-NEXT: MoveConstructor exists simple trivial needs_implicit198 // CHECK-NEXT: CopyAssignment simple trivial has_const_param needs_implicit implicit_has_const_param199 // CHECK-NEXT: MoveAssignment exists simple trivial needs_implicit200 // CHECK-NEXT: Destructor simple irrelevant trivial needs_implicit201 202 int a;203 // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:5, col:9> col:9 a 'int'204 } b;205 // CHECK: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-13]]:3, line:[[@LINE-1]]:5> col:5 b 'struct (unnamed struct at {{.*}}:[[@LINE-13]]:3)'206 207 union {208 // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:3, line:[[@LINE+13]]:3> line:[[@LINE-1]]:3 union definition209 // CHECK-NEXT: DefinitionData is_anonymous pass_in_registers aggregate standard_layout trivially_copyable pod trivial literal210 // CHECK-NEXT: DefaultConstructor exists trivial needs_implicit211 // CHECK-NEXT: CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param212 // CHECK-NEXT: MoveConstructor exists simple trivial needs_implicit213 // CHECK-NEXT: CopyAssignment simple trivial has_const_param needs_implicit implicit_has_const_param214 // CHECK-NEXT: MoveAssignment exists simple trivial needs_implicit215 // CHECK-NEXT: Destructor simple irrelevant trivial needs_implicit216 217 int c;218 // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:5, col:9> col:9 c 'int'219 float d;220 // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:5, col:11> col:11 d 'float'221 };222 // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-15]]:3> col:3 implicit 'G::(anonymous union at {{.*}}:[[@LINE-15]]:3)'223 // CHECK-NEXT: IndirectFieldDecl 0x{{[^ ]*}} <line:[[@LINE-6]]:9> col:9 implicit c 'int'224 // CHECK-NEXT: Field 0x{{[^ ]*}} field_index 1 'G::(anonymous union at {{.*}}:[[@LINE-17]]:3)'225 // CHECK-NEXT: Field 0x{{[^ ]*}} 'c' 'int'226 // CHECK-NEXT: IndirectFieldDecl 0x{{[^ ]*}} <line:[[@LINE-7]]:11> col:11 implicit d 'float'227 // CHECK-NEXT: Field 0x{{[^ ]*}} field_index 1 'G::(anonymous union at {{.*}}:[[@LINE-20]]:3)'228 // CHECK-NEXT: Field 0x{{[^ ]*}} 'd' 'float'229 230 struct {231 // CHECK-NEXT: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:3, line:[[@LINE+12]]:3> line:[[@LINE-1]]:3 struct definition232 // CHECK-NEXT: DefinitionData is_anonymous pass_in_registers aggregate standard_layout trivially_copyable pod trivial literal233 // CHECK-NEXT: DefaultConstructor exists trivial needs_implicit234 // CHECK-NEXT: CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param235 // CHECK-NEXT: MoveConstructor exists simple trivial needs_implicit236 // CHECK-NEXT: CopyAssignment simple trivial has_const_param needs_implicit implicit_has_const_param237 // CHECK-NEXT: MoveAssignment exists simple trivial needs_implicit238 // CHECK-NEXT: Destructor simple irrelevant trivial needs_implicit239 240 int e, f;241 // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:5, col:9> col:9 e 'int'242 // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <col:5, col:12> col:12 f 'int'243 };244 // CHECK-NEXT: FieldDecl 0x{{[^ ]*}} <line:[[@LINE-14]]:3> col:3 implicit 'G::(anonymous struct at {{.*}}:[[@LINE-14]]:3)'245 // CHECK-NEXT: IndirectFieldDecl 0x{{[^ ]*}} <line:[[@LINE-5]]:9> col:9 implicit e 'int'246 // CHECK-NEXT: Field 0x{{[^ ]*}} field_index 2 'G::(anonymous struct at {{.*}}:[[@LINE-16]]:3)'247 // CHECK-NEXT: Field 0x{{[^ ]*}} 'e' 'int'248 // CHECK-NEXT: IndirectFieldDecl 0x{{[^ ]*}} <col:12> col:12 implicit f 'int'249 // CHECK-NEXT: Field 0x{{[^ ]*}} field_index 2 'G::(anonymous struct at {{.*}}:[[@LINE-19]]:3)'250 // CHECK-NEXT: Field 0x{{[^ ]*}} 'f' 'int'251};252 253struct Base1 {};254struct Base2 {};255struct Base3 {};256 257struct Derived1 : Base1 {258 // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct Derived1 definition259 // CHECK: public 'Base1'260};261 262struct Derived2 : private Base1 {263 // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct Derived2 definition264 // CHECK: private 'Base1'265};266 267struct Derived3 : virtual Base1 {268 // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct Derived3 definition269 // CHECK: virtual public 'Base1'270};271 272struct Derived4 : Base1, virtual Base2, protected Base3 {273 // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+4]]:1> line:[[@LINE-1]]:8 struct Derived4 definition274 // CHECK: public 'Base1'275 // CHECK-NEXT: virtual public 'Base2'276 // CHECK-NEXT: protected 'Base3'277};278 279struct Derived5 : protected virtual Base1 {280 // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct Derived5 definition281 // CHECK: virtual protected 'Base1'282};283 284template <typename... Bases>285struct Derived6 : virtual public Bases... {286 // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct Derived6 definition287 // CHECK: virtual public 'Bases'...288};289 290class NonTrivial {291// CHECK: |-CXXRecordDecl {{.*}} referenced class NonTrivial definition292 public:293 NonTrivial();294// CHECK: | |-CXXConstructorDecl {{.*}} referenced NonTrivial 'void ()'295 ~NonTrivial();296// CHECK: | |-CXXDestructorDecl {{.*}} referenced ~NonTrivial 'void () noexcept'297};298 299struct CheckFullExpression {300// CHECK: |-CXXRecordDecl {{.*}} struct CheckFullExpression definition301 NonTrivial value = NonTrivial();302// CHECK: | |-FieldDecl {{.*}} value 'NonTrivial'303// CHECK-NEXT: | | `-ExprWithCleanups {{.*}} 'NonTrivial'304// CHECK-NEXT: | | `-CXXBindTemporaryExpr {{.*}} 'NonTrivial' (CXXTemporary{{.*}})305// CHECK-NEXT: | | `-CXXTemporaryObjectExpr {{.*}} 'NonTrivial' 'void ()'306};307 308struct CheckNoCleanup {309// CHECK: `-CXXRecordDecl {{.*}} struct CheckNoCleanup definition310 static constexpr char kConstant = '+';311// CHECK: `-VarDecl {{.*}} kConstant 'const char' static inline constexpr cinit312// CHECK-NEXT: |-value: Int 43313// CHECK-NEXT: `-CharacterLiteral {{.*}} 'char' 43314};315