Improve the representation of template names in the AST. This
representation handles the various ways in which one can name a
template, including unqualified references ("vector"), qualified
references ("std::vector"), and dependent template names
("MetaFun::template apply").

One immediate effect of this change is that the representation of
nested-name-specifiers in type names for class template
specializations (e.g., std::vector<int>) is more accurate. Rather than
representing std::vector<int> as

  std::(vector<int>)

we represent it as

  (std::vector)<int>

which more closely follows the C++ grammar. 

Additionally, templates are no longer represented as declarations
(DeclPtrTy) in Parse-Sema interactions. Instead, I've introduced a new
OpaquePtr type (TemplateTy) that holds the representation of a
TemplateName. This will simplify the handling of dependent
template-names, once we get there.






git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68074 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/Sema.h b/lib/Sema/Sema.h
index b7903c1..c46b044 100644
--- a/lib/Sema/Sema.h
+++ b/lib/Sema/Sema.h
@@ -1691,7 +1691,7 @@
   // C++ Templates [C++ 14]
   //
   virtual TemplateNameKind isTemplateName(IdentifierInfo &II, Scope *S,
-                                          DeclPtrTy &TemplateDecl,
+                                          TemplateTy &Template,
                                           const CXXScopeSpec *SS = 0);
   bool DiagnoseTemplateParameterShadow(SourceLocation Loc, Decl *PrevDecl);
   TemplateDecl *AdjustDeclIfTemplate(DeclPtrTy &Decl);
@@ -1742,20 +1742,19 @@
                      MultiTemplateParamsArg TemplateParameterLists,
                      AccessSpecifier AS);
 
-  QualType CheckClassTemplateId(ClassTemplateDecl *ClassTemplate,
-                                SourceLocation TemplateLoc,
-                                SourceLocation LAngleLoc,
-                                const TemplateArgument *TemplateArgs,
-                                unsigned NumTemplateArgs,
-                                SourceLocation RAngleLoc);
+  QualType CheckTemplateIdType(TemplateName Template,
+                               SourceLocation TemplateLoc,
+                               SourceLocation LAngleLoc,
+                               const TemplateArgument *TemplateArgs,
+                               unsigned NumTemplateArgs,
+                               SourceLocation RAngleLoc);
 
   virtual TypeResult
-  ActOnClassTemplateId(DeclPtrTy Template, SourceLocation TemplateLoc,
-                       SourceLocation LAngleLoc,
-                       ASTTemplateArgsPtr TemplateArgs,
-                       SourceLocation *TemplateArgLocs,
-                       SourceLocation RAngleLoc,
-                       const CXXScopeSpec *SS);
+  ActOnTemplateIdType(TemplateTy Template, SourceLocation TemplateLoc,
+                      SourceLocation LAngleLoc,
+                      ASTTemplateArgsPtr TemplateArgs,
+                      SourceLocation *TemplateArgLocs,
+                      SourceLocation RAngleLoc);
   
   bool CheckClassTemplateSpecializationScope(ClassTemplateDecl *ClassTemplate,
                                     ClassTemplateSpecializationDecl *PrevDecl,
@@ -1766,7 +1765,7 @@
   ActOnClassTemplateSpecialization(Scope *S, unsigned TagSpec, TagKind TK,
                                    SourceLocation KWLoc, 
                                    const CXXScopeSpec &SS,
-                                   DeclPtrTy Template,
+                                   TemplateTy Template,
                                    SourceLocation TemplateNameLoc,
                                    SourceLocation LAngleLoc,
                                    ASTTemplateArgsPtr TemplateArgs,