Adding tests for -ast-dump; NFC.

This adds tests for the definition data of C++ record objects as well as special member functions.

llvm-svn: 348309
diff --git a/clang/test/AST/ast-dump-record-definition-data.cpp b/clang/test/AST/ast-dump-record-definition-data.cpp
new file mode 100644
index 0000000..37ed54b
--- /dev/null
+++ b/clang/test/AST/ast-dump-record-definition-data.cpp
@@ -0,0 +1,190 @@
+// RUN: %clang_cc1 -triple x86_64-unknown-unknown -std=c++17 -ast-dump %s | FileCheck -strict-whitespace %s
+
+void f() {
+  auto IsNotGenericLambda = [](){};
+  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <col:29> col:29 implicit class definition
+  // CHECK-NOT: DefinitionData {{.*}}generic{{.*}}
+  // CHECK-NEXT: DefinitionData {{.*}}lambda{{.*}}
+  auto IsGenericLambda = [](auto){};
+  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <col:26> col:26 implicit class definition
+  // CHECK-NEXT: DefinitionData {{.*}}generic{{.*}}lambda{{.*}}
+}
+
+struct CanPassInRegisters {
+  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct CanPassInRegisters definition
+  // CHECK-NEXT: DefinitionData {{.*}}pass_in_registers{{.*}}
+  CanPassInRegisters(const CanPassInRegisters&) = default;
+};
+
+struct CantPassInRegisters {
+  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct CantPassInRegisters definition
+  // CHECK-NOT: DefinitionData {{.*}}pass_in_registers{{.*}}
+  CantPassInRegisters(const CantPassInRegisters&) = delete;
+};
+
+struct IsEmpty {
+  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct IsEmpty definition
+  // CHECK-NEXT: DefinitionData {{.*}}empty{{.*}}
+};
+
+struct IsNotEmpty {
+  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct IsNotEmpty definition
+  // CHECK-NOT: DefinitionData {{.*}}empty{{.*}}
+  int a;
+};
+
+struct IsAggregate {
+  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct IsAggregate definition
+  // CHECK-NEXT: DefinitionData {{.*}}aggregate{{.*}}
+  int a;
+};
+
+struct IsNotAggregate {
+  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+4]]:1> line:[[@LINE-1]]:8 struct IsNotAggregate definition
+  // CHECK-NOT: DefinitionData {{.*}}aggregate{{.*}}
+private:
+  int a;
+};
+
+struct IsStandardLayout {
+  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct IsStandardLayout definition
+  // CHECK-NEXT: DefinitionData {{.*}}standard_layout{{.*}}
+  void f();
+};
+
+struct IsNotStandardLayout {
+  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct IsNotStandardLayout definition
+  // CHECK-NOT: DefinitionData {{.*}}standard_layout{{.*}}
+  virtual void f();
+};
+
+struct IsTriviallyCopyable {
+  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct IsTriviallyCopyable definition
+  // CHECK-NEXT: DefinitionData {{.*}}trivially_copyable{{.*}}
+};
+
+struct IsNotTriviallyCopyable {
+  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct IsNotTriviallyCopyable definition
+  // CHECK-NOT: DefinitionData {{.*}}trivially_copyable{{.*}}
+  IsNotTriviallyCopyable(const IsNotTriviallyCopyable&) {}
+};
+
+struct IsPOD {
+  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct IsPOD definition
+  // CHECK-NEXT: DefinitionData {{.*}}pod{{.*}}
+  int a;
+};
+
+struct IsNotPOD {
+  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct IsNotPOD definition
+  // CHECK-NOT: DefinitionData {{.*}}pod{{.*}}
+  int &a;
+};
+
+struct IsTrivial {
+  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct IsTrivial definition
+  // CHECK-NEXT: DefinitionData {{.*}}trivial {{.*}}
+  IsTrivial() = default;
+};
+
+struct IsNotTrivial {
+  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct IsNotTrivial definition
+  // CHECK-NOT: DefinitionData {{.*}}trivial {{.*}}
+  IsNotTrivial() {}
+};
+
+struct IsPolymorphic {
+  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct IsPolymorphic definition
+  // CHECK-NEXT: DefinitionData {{.*}}polymorphic{{.*}}
+  virtual void f();
+};
+
+struct IsNotPolymorphic {
+  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct IsNotPolymorphic definition
+  // CHECK-NOT: DefinitionData {{.*}}polymorphic{{.*}}
+  void f();
+};
+
+struct IsAbstract {
+  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct IsAbstract definition
+  // CHECK-NEXT: DefinitionData {{.*}}abstract{{.*}}
+  virtual void f() = 0;
+};
+
+struct IsNotAbstract {
+  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct IsNotAbstract definition
+  // CHECK-NOT: DefinitionData {{.*}}abstract{{.*}}
+  virtual void f();
+};
+
+struct IsLiteral {
+  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct IsLiteral definition
+  // CHECK-NEXT: DefinitionData {{.*}}literal{{.*}}
+  ~IsLiteral() = default;
+};
+
+struct IsNotLiteral {
+  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct IsNotLiteral definition
+  // CHECK-NOT: DefinitionData {{.*}}literal{{.*}}
+  ~IsNotLiteral() {}
+};
+
+struct HasUserDeclaredConstructor {
+  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct HasUserDeclaredConstructor definition
+  // CHECK-NEXT: DefinitionData {{.*}}has_user_declared_ctor{{.*}}
+  HasUserDeclaredConstructor() {}
+};
+
+struct HasNoUserDeclaredConstructor {
+  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct HasNoUserDeclaredConstructor definition
+  // CHECK-NOT: DefinitionData {{.*}}has_user_declared_ctor{{.*}}
+};
+
+struct HasConstexprNonCopyMoveConstructor {
+  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct HasConstexprNonCopyMoveConstructor definition
+  // CHECK-NEXT: DefinitionData {{.*}}has_constexpr_non_copy_move_ctor{{.*}}
+  constexpr HasConstexprNonCopyMoveConstructor() {}
+};
+
+struct HasNoConstexprNonCopyMoveConstructor {
+  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct HasNoConstexprNonCopyMoveConstructor definition
+  // CHECK-NOT: DefinitionData {{.*}}has_constexpr_non_copy_move_ctor{{.*}}
+  HasNoConstexprNonCopyMoveConstructor() {}
+};
+
+struct HasMutableFields {
+  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct HasMutableFields definition
+  // CHECK-NEXT: DefinitionData {{.*}}has_mutable_fields{{.*}}
+  mutable int i;
+};
+
+struct HasNoMutableFields {
+  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct HasNoMutableFields definition
+  // CHECK-NOT: DefinitionData {{.*}}has_mutable_fields{{.*}}
+  int i;
+};
+
+struct HasVariantMembers {
+  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+5]]:1> line:[[@LINE-1]]:8 struct HasVariantMembers definition
+  // CHECK-NEXT: DefinitionData {{.*}}has_variant_members{{.*}}
+  union {
+    int i;
+  };
+};
+
+struct HasNoVariantMembers {
+  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct HasNoVariantMembers definition
+  // CHECK-NOT: DefinitionData {{.*}}has_variant_members{{.*}}
+};
+
+struct AllowsConstDefaultInit {
+  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct AllowsConstDefaultInit definition
+  // CHECK-NEXT: DefinitionData {{.*}}can_const_default_init{{.*}}
+  int i = 12;
+};
+
+struct DoesNotAllowConstDefaultInit {
+  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct DoesNotAllowConstDefaultInit definition
+  // CHECK-NOT: DefinitionData {{.*}}can_const_default_init{{.*}}
+  int i;
+};