From e23371e71d03434adf83f97128dbd421bd7b428d Mon Sep 17 00:00:00 2001 From: Argyrios Kyrtzidis Date: Fri, 2 Jul 2010 11:55:37 +0000 Subject: [PATCH] Fix reading ClassTemplateDecl's ClassTemplateSpecializationDecls and ClassTemplatePartialSpecializationDecls. Store/read also their template arguments because they may be initializing and not be able to provide them. llvm-svn: 107476 --- clang/lib/Frontend/PCHReaderDecl.cpp | 16 +++++++++------- clang/lib/Frontend/PCHWriterDecl.cpp | 18 ++++++++++++++---- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/clang/lib/Frontend/PCHReaderDecl.cpp b/clang/lib/Frontend/PCHReaderDecl.cpp index ea99ff249d4d..c05f864bc1b4 100644 --- a/clang/lib/Frontend/PCHReaderDecl.cpp +++ b/clang/lib/Frontend/PCHReaderDecl.cpp @@ -768,11 +768,12 @@ void PCHDeclReader::VisitClassTemplateDecl(ClassTemplateDecl *D) { while (size--) { ClassTemplateSpecializationDecl *CTSD = cast(Reader.GetDecl(Record[Idx++])); + llvm::SmallVector TemplArgs; + Reader.ReadTemplateArgumentList(TemplArgs, Record, Idx); llvm::FoldingSetNodeID ID; void *InsertPos = 0; - ClassTemplateSpecializationDecl::Profile(ID, - CTSD->getTemplateArgs().getFlatArgumentList(), - CTSD->getTemplateArgs().flat_size(), + ClassTemplateSpecializationDecl::Profile(ID, TemplArgs.data(), + TemplArgs.size(), *Reader.getContext()); D->getSpecializations().FindNodeOrInsertPos(ID, InsertPos); D->getSpecializations().InsertNode(CTSD, InsertPos); @@ -783,12 +784,13 @@ void PCHDeclReader::VisitClassTemplateDecl(ClassTemplateDecl *D) { ClassTemplatePartialSpecializationDecl *CTSD = cast( Reader.GetDecl(Record[Idx++])); + llvm::SmallVector TemplArgs; + Reader.ReadTemplateArgumentList(TemplArgs, Record, Idx); llvm::FoldingSetNodeID ID; void *InsertPos = 0; - ClassTemplatePartialSpecializationDecl::Profile(ID, - CTSD->getTemplateArgs().getFlatArgumentList(), - CTSD->getTemplateArgs().flat_size(), - *Reader.getContext()); + ClassTemplatePartialSpecializationDecl::Profile(ID, TemplArgs.data(), + TemplArgs.size(), + *Reader.getContext()); D->getPartialSpecializations().FindNodeOrInsertPos(ID, InsertPos); D->getPartialSpecializations().InsertNode(CTSD, InsertPos); } diff --git a/clang/lib/Frontend/PCHWriterDecl.cpp b/clang/lib/Frontend/PCHWriterDecl.cpp index 86af50b0bc54..d43ba7a27ffe 100644 --- a/clang/lib/Frontend/PCHWriterDecl.cpp +++ b/clang/lib/Frontend/PCHWriterDecl.cpp @@ -751,14 +751,24 @@ void PCHDeclWriter::VisitClassTemplateDecl(ClassTemplateDecl *D) { typedef llvm::FoldingSet CTSDSetTy; CTSDSetTy &CTSDSet = D->getSpecializations(); Record.push_back(CTSDSet.size()); - for (CTSDSetTy::iterator I=CTSDSet.begin(), E = CTSDSet.end(); I!=E; ++I) - Writer.AddDeclRef(&*I, Record); + for (CTSDSetTy::iterator I=CTSDSet.begin(), E = CTSDSet.end(); I!=E; ++I) { + ClassTemplateSpecializationDecl *CTSD = &*I; + Writer.AddDeclRef(CTSD, Record); + // Write the argument list here because we may get it uninitialized when + // reading it back. + Writer.AddTemplateArgumentList(&CTSD->getTemplateArgs(), Record); + } typedef llvm::FoldingSet CTPSDSetTy; CTPSDSetTy &CTPSDSet = D->getPartialSpecializations(); Record.push_back(CTPSDSet.size()); - for (CTPSDSetTy::iterator I=CTPSDSet.begin(), E = CTPSDSet.end(); I!=E; ++I) - Writer.AddDeclRef(&*I, Record); + for (CTPSDSetTy::iterator I=CTPSDSet.begin(), E=CTPSDSet.end(); I!=E; ++I) { + ClassTemplatePartialSpecializationDecl *CTPSD = &*I; + Writer.AddDeclRef(CTPSD, Record); + // Write the argument list here because we may get it uninitialized when + // reading it back. + Writer.AddTemplateArgumentList(&CTPSD->getTemplateArgs(), Record); + } // InjectedClassNameType is computed, no need to write it.