From: Argyrios Kyrtzidis Date: Mon, 13 Sep 2010 11:45:32 +0000 (+0000) Subject: Avoid setters in ASTDeclReader::VisitClassTemplateSpecializationDecl. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=586c7156d51039290f100c80d2d8bd263c99addc;p=clang Avoid setters in ASTDeclReader::VisitClassTemplateSpecializationDecl. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@113742 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/DeclTemplate.h b/include/clang/AST/DeclTemplate.h index cc7ac6b300..a868b9c6a4 100644 --- a/include/clang/AST/DeclTemplate.h +++ b/include/clang/AST/DeclTemplate.h @@ -1280,14 +1280,6 @@ public: return TemplateArgs; } - /// \brief Initialize the template arguments of the class template - /// specialization. - void initTemplateArgs(TemplateArgument *Args, unsigned NumArgs) { - assert(TemplateArgs.flat_size() == 0 && - "Template arguments already initialized!"); - TemplateArgs.init(getASTContext(), Args, NumArgs); - } - /// \brief Determine the kind of specialization that this /// declaration represents. TemplateSpecializationKind getSpecializationKind() const { @@ -1375,18 +1367,6 @@ public: SpecializedTemplate = PS; } - /// \brief Note that this class template specialization is actually an - /// instantiation of the given class template partial specialization whose - /// template arguments have been deduced. - void setInstantiationOf(ClassTemplatePartialSpecializationDecl *PartialSpec, - TemplateArgument *TemplateArgs, - unsigned NumTemplateArgs) { - ASTContext &Ctx = getASTContext(); - setInstantiationOf(PartialSpec, - new (Ctx) TemplateArgumentList(Ctx, TemplateArgs, - NumTemplateArgs)); - } - /// \brief Note that this class template specialization is an instantiation /// of the given class template. void setInstantiationOf(ClassTemplateDecl *TemplDecl) { @@ -1458,6 +1438,9 @@ public: static bool classof(const ClassTemplatePartialSpecializationDecl *) { return true; } + + friend class ASTDeclReader; + friend class ASTDeclWriter; }; class ClassTemplatePartialSpecializationDecl diff --git a/lib/Serialization/ASTReaderDecl.cpp b/lib/Serialization/ASTReaderDecl.cpp index 6edf8bce9a..fe07217574 100644 --- a/lib/Serialization/ASTReaderDecl.cpp +++ b/lib/Serialization/ASTReaderDecl.cpp @@ -959,32 +959,41 @@ void ASTDeclReader::VisitClassTemplateDecl(ClassTemplateDecl *D) { void ASTDeclReader::VisitClassTemplateSpecializationDecl( ClassTemplateSpecializationDecl *D) { VisitCXXRecordDecl(D); - + + ASTContext &C = *Reader.getContext(); if (Decl *InstD = Reader.GetDecl(Record[Idx++])) { if (ClassTemplateDecl *CTD = dyn_cast(InstD)) { - D->setInstantiationOf(CTD); + D->SpecializedTemplate = CTD; } else { llvm::SmallVector TemplArgs; Reader.ReadTemplateArgumentList(TemplArgs, Cursor, Record, Idx); - D->setInstantiationOf(cast(InstD), - TemplArgs.data(), TemplArgs.size()); + TemplateArgumentList *ArgList + = new (C) TemplateArgumentList(C, TemplArgs.data(), TemplArgs.size()); + ClassTemplateSpecializationDecl::SpecializedPartialSpecialization *PS + = new (C) ClassTemplateSpecializationDecl:: + SpecializedPartialSpecialization(); + PS->PartialSpecialization + = cast(InstD); + PS->TemplateArgs = ArgList; + D->SpecializedTemplate = PS; } } // Explicit info. if (TypeSourceInfo *TyInfo = Reader.GetTypeSourceInfo(Cursor, Record, Idx)) { - D->setTypeAsWritten(TyInfo); - D->setExternLoc(Reader.ReadSourceLocation(Record, Idx)); - D->setTemplateKeywordLoc(Reader.ReadSourceLocation(Record, Idx)); + ClassTemplateSpecializationDecl::ExplicitSpecializationInfo *ExplicitInfo + = new (C) ClassTemplateSpecializationDecl::ExplicitSpecializationInfo; + ExplicitInfo->TypeAsWritten = TyInfo; + ExplicitInfo->ExternLoc = Reader.ReadSourceLocation(Record, Idx); + ExplicitInfo->TemplateKeywordLoc = Reader.ReadSourceLocation(Record, Idx); + D->ExplicitInfo = ExplicitInfo; } llvm::SmallVector TemplArgs; Reader.ReadTemplateArgumentList(TemplArgs, Cursor, Record, Idx); - D->initTemplateArgs(TemplArgs.data(), TemplArgs.size()); - SourceLocation POI = Reader.ReadSourceLocation(Record, Idx); - if (POI.isValid()) - D->setPointOfInstantiation(POI); - D->setSpecializationKind((TemplateSpecializationKind)Record[Idx++]); + D->TemplateArgs.init(C, TemplArgs.data(), TemplArgs.size()); + D->PointOfInstantiation = Reader.ReadSourceLocation(Record, Idx); + D->SpecializationKind = (TemplateSpecializationKind)Record[Idx++]; if (D->isCanonicalDecl()) { // It's kept in the folding set. ClassTemplateDecl *CanonPattern