]> granicus.if.org Git - clang/commitdiff
Add missing serialization code for one of the CXXRecordDecl definition flags.
authorRichard Smith <richard-llvm@metafoo.co.uk>
Thu, 17 Apr 2014 20:33:01 +0000 (20:33 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Thu, 17 Apr 2014 20:33:01 +0000 (20:33 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@206493 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Serialization/ASTReaderDecl.cpp
lib/Serialization/ASTWriter.cpp
test/Modules/Inputs/cxx-decls-imported.h
test/Modules/cxx-decls.cpp

index 7d9507293044ad5edff23acd06046c0a1e487cc8..4d68c0db177cbb36a7d0651cfff11dcd3f812dff 100644 (file)
@@ -1199,6 +1199,7 @@ void ASTDeclReader::ReadCXXDefinitionData(
   Data.DefaultedMoveAssignmentIsDeleted = Record[Idx++];
   Data.DefaultedDestructorIsDeleted = Record[Idx++];
   Data.HasTrivialSpecialMembers = Record[Idx++];
+  Data.DeclaredNonTrivialSpecialMembers = Record[Idx++];
   Data.HasIrrelevantDestructor = Record[Idx++];
   Data.HasConstexprNonCopyMoveConstructor = Record[Idx++];
   Data.DefaultedDefaultConstructorIsConstexpr = Record[Idx++];
index 96a254ae9a5e3416cefec5ec491e53f58992ae6d..4e2c2e665b8d6748658a6fb8da06d340d09677b3 100644 (file)
@@ -5248,6 +5248,7 @@ void ASTWriter::AddCXXDefinitionData(const CXXRecordDecl *D, RecordDataImpl &Rec
   Record.push_back(Data.DefaultedMoveAssignmentIsDeleted);
   Record.push_back(Data.DefaultedDestructorIsDeleted);
   Record.push_back(Data.HasTrivialSpecialMembers);
+  Record.push_back(Data.DeclaredNonTrivialSpecialMembers);
   Record.push_back(Data.HasIrrelevantDestructor);
   Record.push_back(Data.HasConstexprNonCopyMoveConstructor);
   Record.push_back(Data.DefaultedDefaultConstructorIsConstexpr);
index b94368614dfb1e067a93d37aa511d91791547b9b..959d3feaaf02ff61e3f24896108b30f2fd4f3dd5 100644 (file)
@@ -3,3 +3,18 @@ class HasFriends {
   friend void friend_2(HasFriends);
   void private_thing();
 };
+
+struct HasNontrivialDefaultConstructor {
+  HasNontrivialDefaultConstructor() = default;
+  HasNontrivialDefaultConstructor(int n = 0);
+
+  // Ensure this class is not POD but is still trivially-copyable.
+  // This is necessary to exercise the second static_assert below,
+  // because GCC's spec for __has_trivial_constructor is absurd.
+  int m;
+private:
+  int n;
+};
+
+static_assert(!__is_trivial(HasNontrivialDefaultConstructor), "");
+static_assert(!__has_trivial_constructor(HasNontrivialDefaultConstructor), "");
index ba3281aaec7a587383736b96a3da41b812d90996..d37594afb5671227522e6459403e935ebb504be8 100644 (file)
@@ -19,3 +19,6 @@ void test_friends(HasFriends s) {
   friend_1(s);
   friend_2(s);
 }
+
+static_assert(!__is_trivial(HasNontrivialDefaultConstructor), "");
+static_assert(!__has_trivial_constructor(HasNontrivialDefaultConstructor), "");