Implement template instantiation for ClassTemplateSpecializationTypes,
such as replacing 'T' in vector<T>. There are a few aspects to this:

  - Extend TemplateArgument to allow arbitrary expressions (an
    Expr*), and switch ClassTemplateSpecializationType to store
    TemplateArguments rather than it's own type-or-expression
    representation.

  - ClassTemplateSpecializationType can now store dependent types. In
    that case, the canonical type is another
    ClassTemplateSpecializationType (with default template arguments
    expanded) rather than a declaration (we don't build Decls for
    dependent types).

  - Split ActOnClassTemplateId into ActOnClassTemplateId (called from
    the parser) and CheckClassTemplateId (called from
    ActOnClassTemplateId and InstantiateType). They're smart enough to
    handle dependent types, now.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@66509 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/Sema.h b/lib/Sema/Sema.h
index 4ac8ffc..83be895 100644
--- a/lib/Sema/Sema.h
+++ b/lib/Sema/Sema.h
@@ -1601,6 +1601,13 @@
                      AttributeList *Attr,
                      MultiTemplateParamsArg TemplateParameterLists);
 
+  QualType CheckClassTemplateId(ClassTemplateDecl *ClassTemplate,
+                                SourceLocation TemplateLoc,
+                                SourceLocation LAngleLoc,
+                                const TemplateArgument *TemplateArgs,
+                                unsigned NumTemplateArgs,
+                                SourceLocation RAngleLoc);
+
   virtual TypeResult
   ActOnClassTemplateId(DeclTy *Template, SourceLocation TemplateLoc,
                        SourceLocation LAngleLoc,
@@ -1630,8 +1637,8 @@
   bool CheckTemplateArgumentList(TemplateDecl *Template,
                                  SourceLocation TemplateLoc,
                                  SourceLocation LAngleLoc,
-                                 ASTTemplateArgsPtr& TemplateArgs,
-                                 SourceLocation *TemplateArgLocs,
+                                 const TemplateArgument *TemplateArgs,
+                                 unsigned NumTemplateArgs,
                                  SourceLocation RAngleLoc,
                        llvm::SmallVectorImpl<TemplateArgument> &Converted);