diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2010-09-09 11:28:23 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2010-09-09 11:28:23 +0000 |
commit | a626a3d0fb74455651f742c0938902a42e6e71c8 (patch) | |
tree | 54992f8e4bb6788b27ccba4ad99ff512972c0589 /lib/Serialization/ASTReaderDecl.cpp | |
parent | 89b06584402a38933e108b66ded3a168cd492dff (diff) |
Fix C++ PCH issue.
Another beating by boost in this test case: http://llvm.org/PR8117
A function specialization wasn't properly initialized if it wasn't canonical.
I wish there was a nice little test case but this was boost.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@113481 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Serialization/ASTReaderDecl.cpp')
-rw-r--r-- | lib/Serialization/ASTReaderDecl.cpp | 35 |
1 files changed, 21 insertions, 14 deletions
diff --git a/lib/Serialization/ASTReaderDecl.cpp b/lib/Serialization/ASTReaderDecl.cpp index 995139830d..c63e840d75 100644 --- a/lib/Serialization/ASTReaderDecl.cpp +++ b/lib/Serialization/ASTReaderDecl.cpp @@ -280,25 +280,32 @@ void ASTDeclReader::VisitFunctionDecl(FunctionDecl *FD) { SourceLocation POI = Reader.ReadSourceLocation(Record, Idx); - if (FD->isCanonicalDecl()) { // if canonical add to template's set. - ASTContext &C = *Reader.getContext(); - TemplateArgumentList *TemplArgList - = new (C) TemplateArgumentList(C, TemplArgs.data(), TemplArgs.size()); - TemplateArgumentListInfo *TemplArgsInfo - = new (C) TemplateArgumentListInfo(LAngleLoc, RAngleLoc); - for (unsigned i=0, e = TemplArgLocs.size(); i != e; ++i) - TemplArgsInfo->addArgument(TemplArgLocs[i]); + ASTContext &C = *Reader.getContext(); + TemplateArgumentList *TemplArgList + = new (C) TemplateArgumentList(C, TemplArgs.data(), TemplArgs.size()); + TemplateArgumentListInfo *TemplArgsInfo + = new (C) TemplateArgumentListInfo(LAngleLoc, RAngleLoc); + for (unsigned i=0, e = TemplArgLocs.size(); i != e; ++i) + TemplArgsInfo->addArgument(TemplArgLocs[i]); + FunctionTemplateSpecializationInfo *FTInfo + = FunctionTemplateSpecializationInfo::Create(C, FD, Template, TSK, + TemplArgList, + TemplArgsInfo, POI); + FD->TemplateOrSpecialization = FTInfo; + if (FD->isCanonicalDecl()) { // if canonical add to template's set. + // Get the InsertPos by FindNodeOrInsertPos() instead of calling + // InsertNode(FTInfo) directly to avoid the getASTContext() call in + // FunctionTemplateSpecializationInfo's Profile(). + // We avoid getASTContext because a decl in the parent hierarchy may + // be initializing. llvm::FoldingSetNodeID ID; FunctionTemplateSpecializationInfo::Profile(ID, TemplArgs.data(), TemplArgs.size(), C); void *InsertPos = 0; - FunctionTemplateSpecializationInfo *PrevFTInfo = - Template->getSpecializations().FindNodeOrInsertPos(ID, InsertPos); - (void)PrevFTInfo; - assert(!PrevFTInfo && "Another specialization already inserted!"); - FD->setFunctionTemplateSpecialization(C, Template, TemplArgList, InsertPos, - TSK, TemplArgsInfo, POI); + Template->getSpecializations().FindNodeOrInsertPos(ID, InsertPos); + assert(InsertPos && "Another specialization already inserted!"); + Template->getSpecializations().InsertNode(FTInfo, InsertPos); } break; } |