From: Richard Smith Date: Thu, 17 Apr 2014 20:33:01 +0000 (+0000) Subject: Add missing serialization code for one of the CXXRecordDecl definition flags. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c897d3bf731c49913afb92b667197dc6e329a0b5;p=clang Add missing serialization code for one of the CXXRecordDecl definition flags. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@206493 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Serialization/ASTReaderDecl.cpp b/lib/Serialization/ASTReaderDecl.cpp index 7d95072930..4d68c0db17 100644 --- a/lib/Serialization/ASTReaderDecl.cpp +++ b/lib/Serialization/ASTReaderDecl.cpp @@ -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++]; diff --git a/lib/Serialization/ASTWriter.cpp b/lib/Serialization/ASTWriter.cpp index 96a254ae9a..4e2c2e665b 100644 --- a/lib/Serialization/ASTWriter.cpp +++ b/lib/Serialization/ASTWriter.cpp @@ -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); diff --git a/test/Modules/Inputs/cxx-decls-imported.h b/test/Modules/Inputs/cxx-decls-imported.h index b94368614d..959d3feaaf 100644 --- a/test/Modules/Inputs/cxx-decls-imported.h +++ b/test/Modules/Inputs/cxx-decls-imported.h @@ -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), ""); diff --git a/test/Modules/cxx-decls.cpp b/test/Modules/cxx-decls.cpp index ba3281aaec..d37594afb5 100644 --- a/test/Modules/cxx-decls.cpp +++ b/test/Modules/cxx-decls.cpp @@ -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), "");