]> granicus.if.org Git - clang/commitdiff
[modules] Add an assert that we properly manage the IsCompleteDefinition flag
authorRichard Smith <richard-llvm@metafoo.co.uk>
Wed, 27 Aug 2014 23:11:59 +0000 (23:11 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Wed, 27 Aug 2014 23:11:59 +0000 (23:11 +0000)
on CXXRecordDecls when merging definitions, and make it pass by not trying to
save and restore this flag across AST serialization/deserialization. For
CXXRecordDecls, we have a separate mechanism to manage this.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@216633 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Serialization/ASTReader.cpp
lib/Serialization/ASTReaderDecl.cpp
lib/Serialization/ASTWriterDecl.cpp

index 68faeed6a2007566b46af1d5eeb6fa069e9ac8ce..5cd57d70d0960dcf361b44fac4352130e0a9c86c 100644 (file)
@@ -8216,8 +8216,11 @@ void ASTReader::finishPendingActions() {
       }
       
       if (auto RD = dyn_cast<CXXRecordDecl>(D)) {
-        for (auto R : RD->redecls())
+        for (auto R : RD->redecls()) {
+          assert((R == D) == R->isThisDeclarationADefinition() &&
+                 "declaration thinks it's the definition but it isn't");
           cast<CXXRecordDecl>(R)->DefinitionData = RD->DefinitionData;
+        }
       }
 
       continue;
index 0aa2923991552ae96ecb33a107239a387a7a22d5..60cc6bd597184e987e6e2fdf64b50b48d404da5c 100644 (file)
@@ -489,7 +489,8 @@ ASTDeclReader::RedeclarableResult ASTDeclReader::VisitTagDecl(TagDecl *TD) {
   
   TD->IdentifierNamespace = Record[Idx++];
   TD->setTagKind((TagDecl::TagKind)Record[Idx++]);
-  TD->setCompleteDefinition(Record[Idx++]);
+  if (!isa<CXXRecordDecl>(TD))
+    TD->setCompleteDefinition(Record[Idx++]);
   TD->setEmbeddedInDeclarator(Record[Idx++]);
   TD->setFreeStanding(Record[Idx++]);
   TD->setCompleteDefinitionRequired(Record[Idx++]);
@@ -3426,6 +3427,7 @@ void ASTDeclReader::UpdateDecl(Decl *D, ModuleFile &ModuleFile,
         Reader.ReadDeclContextStorage(ModuleFile, ModuleFile.DeclsCursor,
                                           std::make_pair(LexicalOffset, 0),
                                           ModuleFile.DeclContextInfos[RD]);
+        Reader.PendingDefinitions.insert(RD);
       }
 
       auto TSK = (TemplateSpecializationKind)Record[Idx++];
index cd8f7ddf599a701138ae5e8c3fdee9e824d1a991..336c86b6d57e2e3a05d6cb39ec0e309fdf6631da 100644 (file)
@@ -245,7 +245,8 @@ void ASTDeclWriter::VisitTagDecl(TagDecl *D) {
   VisitTypeDecl(D);
   Record.push_back(D->getIdentifierNamespace());
   Record.push_back((unsigned)D->getTagKind()); // FIXME: stable encoding
-  Record.push_back(D->isCompleteDefinition());
+  if (!isa<CXXRecordDecl>(D))
+    Record.push_back(D->isCompleteDefinition());
   Record.push_back(D->isEmbeddedInDeclarator());
   Record.push_back(D->isFreeStanding());
   Record.push_back(D->isCompleteDefinitionRequired());