diff options
Diffstat (limited to 'clang/lib/AST')
-rw-r--r-- | clang/lib/AST/DeclTemplate.cpp | 50 | ||||
-rw-r--r-- | clang/lib/AST/Type.cpp | 18 |
2 files changed, 48 insertions, 20 deletions
diff --git a/clang/lib/AST/DeclTemplate.cpp b/clang/lib/AST/DeclTemplate.cpp index 4f64f8bd508..f1979c4bed6 100644 --- a/clang/lib/AST/DeclTemplate.cpp +++ b/clang/lib/AST/DeclTemplate.cpp @@ -236,12 +236,42 @@ TemplateArgument::TemplateArgument(Expr *E) : Kind(Expression) { } //===----------------------------------------------------------------------===// +// TemplateArgumentList Implementation +//===----------------------------------------------------------------------===// +TemplateArgumentList::TemplateArgumentList(ASTContext &Context, + TemplateArgument *TemplateArgs, + unsigned NumTemplateArgs, + bool CopyArgs) + : NumArguments(NumTemplateArgs) { + if (!CopyArgs) { + Arguments.setPointer(TemplateArgs); + Arguments.setInt(1); + return; + } + + unsigned Size = sizeof(TemplateArgument) * NumTemplateArgs; + unsigned Align = llvm::AlignOf<TemplateArgument>::Alignment; + void *Mem = Context.Allocate(Size, Align); + Arguments.setPointer((TemplateArgument *)Mem); + Arguments.setInt(0); + + TemplateArgument *Args = (TemplateArgument *)Mem; + for (unsigned I = 0; I != NumTemplateArgs; ++I) + new (Args + I) TemplateArgument(TemplateArgs[I]); +} + +TemplateArgumentList::~TemplateArgumentList() { + // FIXME: Deallocate template arguments +} + +//===----------------------------------------------------------------------===// // ClassTemplateSpecializationDecl Implementation //===----------------------------------------------------------------------===// ClassTemplateSpecializationDecl:: -ClassTemplateSpecializationDecl(DeclContext *DC, SourceLocation L, +ClassTemplateSpecializationDecl(ASTContext &Context, + DeclContext *DC, SourceLocation L, ClassTemplateDecl *SpecializedTemplate, - TemplateArgument *TemplateArgs, + TemplateArgument *TemplateArgs, unsigned NumTemplateArgs) : CXXRecordDecl(ClassTemplateSpecialization, SpecializedTemplate->getTemplatedDecl()->getTagKind(), @@ -250,10 +280,8 @@ ClassTemplateSpecializationDecl(DeclContext *DC, SourceLocation L, // class template specializations? SpecializedTemplate->getIdentifier()), SpecializedTemplate(SpecializedTemplate), - NumTemplateArgs(NumTemplateArgs), SpecializationKind(TSK_Undeclared) { - TemplateArgument *Arg = reinterpret_cast<TemplateArgument *>(this + 1); - for (unsigned ArgIdx = 0; ArgIdx < NumTemplateArgs; ++ArgIdx, ++Arg) - new (Arg) TemplateArgument(TemplateArgs[ArgIdx]); + TemplateArgs(Context, TemplateArgs, NumTemplateArgs, /*CopyArgs=*/true), + SpecializationKind(TSK_Undeclared) { } ClassTemplateSpecializationDecl * @@ -263,13 +291,11 @@ ClassTemplateSpecializationDecl::Create(ASTContext &Context, TemplateArgument *TemplateArgs, unsigned NumTemplateArgs, ClassTemplateSpecializationDecl *PrevDecl) { - unsigned Size = sizeof(ClassTemplateSpecializationDecl) + - sizeof(TemplateArgument) * NumTemplateArgs; - unsigned Align = llvm::AlignOf<ClassTemplateSpecializationDecl>::Alignment; - void *Mem = Context.Allocate(Size, Align); ClassTemplateSpecializationDecl *Result - = new (Mem) ClassTemplateSpecializationDecl(DC, L, SpecializedTemplate, - TemplateArgs, NumTemplateArgs); + = new (Context)ClassTemplateSpecializationDecl(Context, DC, L, + SpecializedTemplate, + TemplateArgs, + NumTemplateArgs); Context.getTypeDeclType(Result, PrevDecl); return Result; } diff --git a/clang/lib/AST/Type.cpp b/clang/lib/AST/Type.cpp index bc439c8c89c..b0fdccbdc97 100644 --- a/clang/lib/AST/Type.cpp +++ b/clang/lib/AST/Type.cpp @@ -1565,11 +1565,12 @@ void TagType::getAsStringInternal(std::string &InnerString, // arguments. if (ClassTemplateSpecializationDecl *Spec = dyn_cast<ClassTemplateSpecializationDecl>(getDecl())) { - std::string TemplateArgs + const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs(); + std::string TemplateArgsStr = TemplateSpecializationType::PrintTemplateArgumentList( - Spec->getTemplateArgs(), - Spec->getNumTemplateArgs()); - InnerString = TemplateArgs + InnerString; + TemplateArgs.getFlatArgumentList(), + TemplateArgs.flat_size()); + InnerString = TemplateArgsStr + InnerString; } if (Kind) { @@ -1584,11 +1585,12 @@ void TagType::getAsStringInternal(std::string &InnerString, MyPart = NS->getNameAsString(); } else if (ClassTemplateSpecializationDecl *Spec = dyn_cast<ClassTemplateSpecializationDecl>(DC)) { - std::string TemplateArgs + const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs(); + std::string TemplateArgsStr = TemplateSpecializationType::PrintTemplateArgumentList( - Spec->getTemplateArgs(), - Spec->getNumTemplateArgs()); - MyPart = Spec->getIdentifier()->getName() + TemplateArgs; + TemplateArgs.getFlatArgumentList(), + TemplateArgs.flat_size()); + MyPart = Spec->getIdentifier()->getName() + TemplateArgsStr; } else if (TagDecl *Tag = dyn_cast<TagDecl>(DC)) { if (TypedefDecl *Typedef = Tag->getTypedefForAnonDecl()) MyPart = Typedef->getIdentifier()->getName(); |