diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2014-07-11 18:22:58 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2014-07-11 18:22:58 +0000 |
commit | 547864d26aa3ab7076395786f9deaf404888cb07 (patch) | |
tree | 8b0419777c88ed1643d2e475573c79e9ac3cfdd3 /clang/lib/Serialization/ASTReaderDecl.cpp | |
parent | 82504f03ce98c30da60a12d84c71384e44734f15 (diff) | |
download | bcm5719-llvm-547864d26aa3ab7076395786f9deaf404888cb07.tar.gz bcm5719-llvm-547864d26aa3ab7076395786f9deaf404888cb07.zip |
[modules] When merging a class template, also merge the definition of its pattern.
llvm-svn: 212836
Diffstat (limited to 'clang/lib/Serialization/ASTReaderDecl.cpp')
-rw-r--r-- | clang/lib/Serialization/ASTReaderDecl.cpp | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/clang/lib/Serialization/ASTReaderDecl.cpp b/clang/lib/Serialization/ASTReaderDecl.cpp index f9fed46ad9c..5ef4a5cdabd 100644 --- a/clang/lib/Serialization/ASTReaderDecl.cpp +++ b/clang/lib/Serialization/ASTReaderDecl.cpp @@ -1758,11 +1758,11 @@ ASTDeclReader::VisitClassTemplateSpecializationDeclImpl( Reader.MergedDeclContexts.insert( std::make_pair(D, CanonDD->Definition)); D->IsCompleteDefinition = false; - D->DefinitionData = CanonSpec->DefinitionData; } else { CanonSpec->DefinitionData = D->DefinitionData; } } + D->DefinitionData = CanonSpec->DefinitionData; } } } @@ -2037,10 +2037,27 @@ void ASTDeclReader::mergeTemplatePattern(RedeclarableTemplateDecl *D, auto *DPattern = D->getTemplatedDecl(); auto *ExistingPattern = Existing->getTemplatedDecl(); RedeclarableResult Result(Reader, DsID, DPattern->getKind()); - if (auto *DClass = dyn_cast<CXXRecordDecl>(DPattern)) - // FIXME: Merge definitions here, if both declarations had definitions. + if (auto *DClass = dyn_cast<CXXRecordDecl>(DPattern)) { + // Merge with any existing definition. + // FIXME: This is duplicated in several places. Refactor. + auto *ExistingClass = + cast<CXXRecordDecl>(ExistingPattern)->getCanonicalDecl(); + if (auto *DDD = DClass->DefinitionData.getNotUpdated()) { + if (auto *ExistingDD = ExistingClass->DefinitionData.getNotUpdated()) { + MergeDefinitionData(ExistingClass, *DDD); + Reader.PendingDefinitions.erase(DClass); + Reader.MergedDeclContexts.insert( + std::make_pair(DClass, ExistingDD->Definition)); + DClass->IsCompleteDefinition = false; + } else { + ExistingClass->DefinitionData = DClass->DefinitionData; + } + } + DClass->DefinitionData = ExistingClass->DefinitionData; + return mergeRedeclarable(DClass, cast<TagDecl>(ExistingPattern), Result); + } if (auto *DFunction = dyn_cast<FunctionDecl>(DPattern)) return mergeRedeclarable(DFunction, cast<FunctionDecl>(ExistingPattern), Result); |