199 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 11void f() {12 auto IsNotGenericLambda = [](){};13 // CHECK: CXXRecordDecl 0x{{[^ ]*}} <col:29> col:29 implicit class definition14 // CHECK-NOT: DefinitionData {{.*}}generic{{.*}}15 // CHECK-NEXT: DefinitionData {{.*}}lambda{{.*}}16 auto IsGenericLambda = [](auto){};17 // CHECK: CXXRecordDecl 0x{{[^ ]*}} <col:26> col:26 implicit class definition18 // CHECK-NEXT: DefinitionData {{.*}}generic{{.*}}lambda{{.*}}19}20 21struct CanPassInRegisters {22 // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct CanPassInRegisters definition23 // CHECK-NEXT: DefinitionData {{.*}}pass_in_registers{{.*}}24 CanPassInRegisters(const CanPassInRegisters&) = default;25};26 27struct CantPassInRegisters {28 // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct CantPassInRegisters definition29 // CHECK-NOT: DefinitionData {{.*}}pass_in_registers{{.*}}30 CantPassInRegisters(const CantPassInRegisters&) = delete;31};32 33struct IsEmpty {34 // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct IsEmpty definition35 // CHECK-NEXT: DefinitionData {{.*}}empty{{.*}}36};37 38struct IsNotEmpty {39 // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct IsNotEmpty definition40 // CHECK-NOT: DefinitionData {{.*}}empty{{.*}}41 int a;42};43 44struct IsAggregate {45 // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct IsAggregate definition46 // CHECK-NEXT: DefinitionData {{.*}}aggregate{{.*}}47 int a;48};49 50struct IsNotAggregate {51 // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+4]]:1> line:[[@LINE-1]]:8 struct IsNotAggregate definition52 // CHECK-NOT: DefinitionData {{.*}}aggregate{{.*}}53private:54 int a;55};56 57struct IsStandardLayout {58 // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct IsStandardLayout definition59 // CHECK-NEXT: DefinitionData {{.*}}standard_layout{{.*}}60 void f();61};62 63struct IsNotStandardLayout {64 // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct IsNotStandardLayout definition65 // CHECK-NOT: DefinitionData {{.*}}standard_layout{{.*}}66 virtual void f();67};68 69struct IsTriviallyCopyable {70 // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct IsTriviallyCopyable definition71 // CHECK-NEXT: DefinitionData {{.*}}trivially_copyable{{.*}}72};73 74struct IsNotTriviallyCopyable {75 // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct IsNotTriviallyCopyable definition76 // CHECK-NOT: DefinitionData {{.*}}trivially_copyable{{.*}}77 IsNotTriviallyCopyable(const IsNotTriviallyCopyable&) {}78};79 80struct IsPOD {81 // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct IsPOD definition82 // CHECK-NEXT: DefinitionData {{.*}}pod{{.*}}83 int a;84};85 86struct IsNotPOD {87 // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct IsNotPOD definition88 // CHECK-NOT: DefinitionData {{.*}}pod{{.*}}89 int &a;90};91 92struct IsTrivial {93 // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct IsTrivial definition94 // CHECK-NEXT: DefinitionData {{.*}}trivial {{.*}}95 IsTrivial() = default;96};97 98struct IsNotTrivial {99 // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct IsNotTrivial definition100 // CHECK-NOT: DefinitionData {{.*}}trivial {{.*}}101 IsNotTrivial() {}102};103 104struct IsPolymorphic {105 // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct IsPolymorphic definition106 // CHECK-NEXT: DefinitionData {{.*}}polymorphic{{.*}}107 virtual void f();108};109 110struct IsNotPolymorphic {111 // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct IsNotPolymorphic definition112 // CHECK-NOT: DefinitionData {{.*}}polymorphic{{.*}}113 void f();114};115 116struct IsAbstract {117 // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct IsAbstract definition118 // CHECK-NEXT: DefinitionData {{.*}}abstract{{.*}}119 virtual void f() = 0;120};121 122struct IsNotAbstract {123 // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct IsNotAbstract definition124 // CHECK-NOT: DefinitionData {{.*}}abstract{{.*}}125 virtual void f();126};127 128struct IsLiteral {129 // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct IsLiteral definition130 // CHECK-NEXT: DefinitionData {{.*}}literal{{.*}}131 ~IsLiteral() = default;132};133 134struct IsNotLiteral {135 // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct IsNotLiteral definition136 // CHECK-NOT: DefinitionData {{.*}}literal{{.*}}137 ~IsNotLiteral() {}138};139 140struct HasUserDeclaredConstructor {141 // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct HasUserDeclaredConstructor definition142 // CHECK-NEXT: DefinitionData {{.*}}has_user_declared_ctor{{.*}}143 HasUserDeclaredConstructor() {}144};145 146struct HasNoUserDeclaredConstructor {147 // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct HasNoUserDeclaredConstructor definition148 // CHECK-NOT: DefinitionData {{.*}}has_user_declared_ctor{{.*}}149};150 151struct HasConstexprNonCopyMoveConstructor {152 // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct HasConstexprNonCopyMoveConstructor definition153 // CHECK-NEXT: DefinitionData {{.*}}has_constexpr_non_copy_move_ctor{{.*}}154 constexpr HasConstexprNonCopyMoveConstructor() {}155};156 157struct HasNoConstexprNonCopyMoveConstructor {158 // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct HasNoConstexprNonCopyMoveConstructor definition159 // CHECK-NOT: DefinitionData {{.*}}has_constexpr_non_copy_move_ctor{{.*}}160 HasNoConstexprNonCopyMoveConstructor() {}161};162 163struct HasMutableFields {164 // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct HasMutableFields definition165 // CHECK-NEXT: DefinitionData {{.*}}has_mutable_fields{{.*}}166 mutable int i;167};168 169struct HasNoMutableFields {170 // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct HasNoMutableFields definition171 // CHECK-NOT: DefinitionData {{.*}}has_mutable_fields{{.*}}172 int i;173};174 175struct HasVariantMembers {176 // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+5]]:1> line:[[@LINE-1]]:8 struct HasVariantMembers definition177 // CHECK-NEXT: DefinitionData {{.*}}has_variant_members{{.*}}178 union {179 int i;180 };181};182 183struct HasNoVariantMembers {184 // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct HasNoVariantMembers definition185 // CHECK-NOT: DefinitionData {{.*}}has_variant_members{{.*}}186};187 188struct AllowsConstDefaultInit {189 // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct AllowsConstDefaultInit definition190 // CHECK-NEXT: DefinitionData {{.*}}can_const_default_init{{.*}}191 int i = 12;192};193 194struct DoesNotAllowConstDefaultInit {195 // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct DoesNotAllowConstDefaultInit definition196 // CHECK-NOT: DefinitionData {{.*}}can_const_default_init{{.*}}197 int i;198};199