Use the new statement/expression profiling code to unique dependent
template arguments, as in template specialization types. This permits
matching out-of-line definitions of members for class templates that
involve non-type template parameters.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@77462 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp
index 931010d..f3a4171 100644
--- a/lib/AST/ASTContext.cpp
+++ b/lib/AST/ASTContext.cpp
@@ -1682,7 +1682,7 @@
     // exists.
     llvm::FoldingSetNodeID ID;
     TemplateSpecializationType::Profile(ID, CanonTemplate, 
-                                        CanonArgs.data(), NumArgs);
+                                        CanonArgs.data(), NumArgs, *this);
 
     void *InsertPos = 0;
     TemplateSpecializationType *Spec
@@ -1693,7 +1693,7 @@
       void *Mem = Allocate((sizeof(TemplateSpecializationType) + 
                             sizeof(TemplateArgument) * NumArgs),
                            8);
-      Spec = new (Mem) TemplateSpecializationType(CanonTemplate, 
+      Spec = new (Mem) TemplateSpecializationType(*this, CanonTemplate, 
                                                   CanonArgs.data(), NumArgs,
                                                   QualType());
       Types.push_back(Spec);
@@ -1713,7 +1713,8 @@
                         sizeof(TemplateArgument) * NumArgs),
                        8);
   TemplateSpecializationType *Spec 
-    = new (Mem) TemplateSpecializationType(Template, Args, NumArgs, Canon);
+    = new (Mem) TemplateSpecializationType(*this, Template, Args, NumArgs, 
+                                           Canon);
   
   Types.push_back(Spec);
   return QualType(Spec, 0);  
diff --git a/lib/AST/StmtProfile.cpp b/lib/AST/StmtProfile.cpp
index 0f241c2..688777d 100644
--- a/lib/AST/StmtProfile.cpp
+++ b/lib/AST/StmtProfile.cpp
@@ -107,6 +107,10 @@
   VisitStmt(S);
 }
 
+void StmtProfiler::VisitSwitchStmt(SwitchStmt *S) {
+  VisitStmt(S);
+}
+
 void StmtProfiler::VisitWhileStmt(WhileStmt *S) {
   VisitStmt(S);
 }
@@ -330,6 +334,10 @@
   VisitExpr(S);
 }
 
+void StmtProfiler::VisitVAArgExpr(VAArgExpr *S) {
+  VisitExpr(S);
+}
+
 void StmtProfiler::VisitInitListExpr(InitListExpr *S) {
   if (S->getSyntacticForm()) {
     VisitInitListExpr(S->getSyntacticForm());
@@ -416,6 +424,10 @@
   ID.AddBoolean(S->getValue());
 }
 
+void StmtProfiler::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *S) {
+  VisitExpr(S);
+}
+
 void StmtProfiler::VisitCXXTypeidExpr(CXXTypeidExpr *S) {
   VisitExpr(S);
   if (S->isTypeOperand())
@@ -595,6 +607,7 @@
         = dyn_cast_or_null<NonTypeTemplateParmDecl>(D)) {
       ID.AddInteger(NTTP->getDepth());
       ID.AddInteger(NTTP->getIndex());
+      VisitType(NTTP->getType());
       return;
     }
     
diff --git a/lib/AST/Type.cpp b/lib/AST/Type.cpp
index 04961ed..f937d15 100644
--- a/lib/AST/Type.cpp
+++ b/lib/AST/Type.cpp
@@ -1033,11 +1033,13 @@
 }
 
 TemplateSpecializationType::
-TemplateSpecializationType(TemplateName T, const TemplateArgument *Args,
+TemplateSpecializationType(ASTContext &Context, TemplateName T, 
+                           const TemplateArgument *Args,
                            unsigned NumArgs, QualType Canon)
   : Type(TemplateSpecialization, 
          Canon.isNull()? QualType(this, 0) : Canon,
          T.isDependent() || anyDependentTemplateArguments(Args, NumArgs)),
+    Context(Context),
     Template(T), NumArgs(NumArgs)
 {
   assert((!Canon.isNull() || 
@@ -1074,10 +1076,11 @@
 TemplateSpecializationType::Profile(llvm::FoldingSetNodeID &ID, 
                                     TemplateName T, 
                                     const TemplateArgument *Args, 
-                                    unsigned NumArgs) {
+                                    unsigned NumArgs,
+                                    ASTContext &Context) {
   T.Profile(ID);
   for (unsigned Idx = 0; Idx < NumArgs; ++Idx)
-    Args[Idx].Profile(ID);
+    Args[Idx].Profile(ID, Context);
 }
 
 const Type *QualifierSet::strip(const Type* T) {