diff options
Diffstat (limited to 'clang/lib/AST')
| -rw-r--r-- | clang/lib/AST/DeclCXX.cpp | 6 | ||||
| -rw-r--r-- | clang/lib/AST/DeclTemplate.cpp | 36 |
2 files changed, 39 insertions, 3 deletions
diff --git a/clang/lib/AST/DeclCXX.cpp b/clang/lib/AST/DeclCXX.cpp index 6de575411b3..294e94f5f4e 100644 --- a/clang/lib/AST/DeclCXX.cpp +++ b/clang/lib/AST/DeclCXX.cpp @@ -21,9 +21,9 @@ using namespace clang; // Decl Allocation/Deallocation Method Implementations //===----------------------------------------------------------------------===// -CXXRecordDecl::CXXRecordDecl(TagKind TK, DeclContext *DC, +CXXRecordDecl::CXXRecordDecl(Kind K, TagKind TK, DeclContext *DC, SourceLocation L, IdentifierInfo *Id) - : RecordDecl(CXXRecord, TK, DC, L, Id), + : RecordDecl(K, TK, DC, L, Id), UserDeclaredConstructor(false), UserDeclaredCopyConstructor(false), UserDeclaredCopyAssignment(false), UserDeclaredDestructor(false), Aggregate(true), PlainOldData(true), Polymorphic(false), Bases(0), @@ -32,7 +32,7 @@ CXXRecordDecl::CXXRecordDecl(TagKind TK, DeclContext *DC, CXXRecordDecl *CXXRecordDecl::Create(ASTContext &C, TagKind TK, DeclContext *DC, SourceLocation L, IdentifierInfo *Id, CXXRecordDecl* PrevDecl) { - CXXRecordDecl* R = new (C) CXXRecordDecl(TK, DC, L, Id); + CXXRecordDecl* R = new (C) CXXRecordDecl(CXXRecord, TK, DC, L, Id); C.getTypeDeclType(R, PrevDecl); return R; } diff --git a/clang/lib/AST/DeclTemplate.cpp b/clang/lib/AST/DeclTemplate.cpp index dccb8df0757..81ef3ab70e4 100644 --- a/clang/lib/AST/DeclTemplate.cpp +++ b/clang/lib/AST/DeclTemplate.cpp @@ -143,3 +143,39 @@ SourceLocation TemplateTemplateParmDecl::getDefaultArgumentLoc() const { return DefaultArgument? DefaultArgument->getSourceRange().getBegin() : SourceLocation(); } + +//===----------------------------------------------------------------------===// +// ClassTemplateSpecializationDecl Implementation +//===----------------------------------------------------------------------===// +ClassTemplateSpecializationDecl:: +ClassTemplateSpecializationDecl(DeclContext *DC, SourceLocation L, + ClassTemplateDecl *SpecializedTemplate, + TemplateArgument *TemplateArgs, + unsigned NumTemplateArgs) + : CXXRecordDecl(ClassTemplateSpecialization, + SpecializedTemplate->getTemplatedDecl()->getTagKind(), + DC, L, + // FIXME: Should we use DeclarationName for the name of + // class template specializations? + SpecializedTemplate->getIdentifier()), + SpecializedTemplate(SpecializedTemplate), + NumTemplateArgs(NumTemplateArgs) { + TemplateArgument *Arg = reinterpret_cast<TemplateArgument *>(this + 1); + for (unsigned ArgIdx = 0; ArgIdx < NumTemplateArgs; ++ArgIdx, ++Arg) + *Arg = TemplateArgs[ArgIdx]; +} + +ClassTemplateSpecializationDecl * +ClassTemplateSpecializationDecl::Create(ASTContext &Context, + DeclContext *DC, SourceLocation L, + ClassTemplateDecl *SpecializedTemplate, + TemplateArgument *TemplateArgs, + unsigned NumTemplateArgs) { + unsigned Size = sizeof(ClassTemplateSpecializationDecl) + + sizeof(TemplateArgument) * NumTemplateArgs; + unsigned Align = llvm::AlignOf<ClassTemplateSpecializationDecl>::Alignment; + void *Mem = Context.Allocate(Size, Align); + return new (Mem) ClassTemplateSpecializationDecl(DC, L, SpecializedTemplate, + TemplateArgs, + NumTemplateArgs); +} |

