Added ClassTemplateSpecializationDecl, which is a subclass of
CXXRecordDecl that is used to represent class template
specializations. These are canonical declarations that can refer to
either an actual class template specialization in the code, e.g.,

  template<> class vector<bool> { };

or to a template instantiation. However, neither of these features is
actually implemented yet, so really we're just using (and uniqing) the
declarations to make sure that, e.g., A<int> is a different type from
A<float>. Note that we carefully distinguish between what the user
wrote in the source code (e.g., "A<FLOAT>") and the semantic entity it
represents (e.g., "A<float, int>"); the former is in the sugared Type,
the latter is an actual Decl.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@64716 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/DeclTemplate.cpp b/lib/AST/DeclTemplate.cpp
index dccb8df..81ef3ab 100644
--- a/lib/AST/DeclTemplate.cpp
+++ b/lib/AST/DeclTemplate.cpp
@@ -143,3 +143,39 @@
   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);
+}