diff options
| -rw-r--r-- | clang/lib/Serialization/ASTReaderDecl.cpp | 1 | ||||
| -rw-r--r-- | clang/lib/Serialization/ASTWriter.cpp | 1 | ||||
| -rw-r--r-- | clang/test/Modules/Inputs/cxx-decls-imported.h | 15 | ||||
| -rw-r--r-- | clang/test/Modules/cxx-decls.cpp | 3 |
4 files changed, 20 insertions, 0 deletions
diff --git a/clang/lib/Serialization/ASTReaderDecl.cpp b/clang/lib/Serialization/ASTReaderDecl.cpp index 7d950729304..4d68c0db177 100644 --- a/clang/lib/Serialization/ASTReaderDecl.cpp +++ b/clang/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/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp index 96a254ae9a5..4e2c2e665b8 100644 --- a/clang/lib/Serialization/ASTWriter.cpp +++ b/clang/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/clang/test/Modules/Inputs/cxx-decls-imported.h b/clang/test/Modules/Inputs/cxx-decls-imported.h index b94368614df..959d3feaaf0 100644 --- a/clang/test/Modules/Inputs/cxx-decls-imported.h +++ b/clang/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/clang/test/Modules/cxx-decls.cpp b/clang/test/Modules/cxx-decls.cpp index ba3281aaec7..d37594afb56 100644 --- a/clang/test/Modules/cxx-decls.cpp +++ b/clang/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), ""); |

