Track source information for template arguments and template specialization
types.  Preserve it through template instantiation.  Preserve it through PCH,
although TSTs themselves aren't serializable, so that's pretty much meaningless.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@85500 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/StmtProfile.cpp b/lib/AST/StmtProfile.cpp
index a6327c9..02e0c74 100644
--- a/lib/AST/StmtProfile.cpp
+++ b/lib/AST/StmtProfile.cpp
@@ -60,7 +60,10 @@
 
     /// \brief Visit template arguments that occur within an expression or
     /// statement.
-    void VisitTemplateArguments(const TemplateArgument *Args, unsigned NumArgs);
+    void VisitTemplateArguments(const TemplateArgumentLoc *Args, unsigned NumArgs);
+
+    /// \brief Visit a single template argument.
+    void VisitTemplateArgument(const TemplateArgument &Arg);
   };
 }
 
@@ -674,39 +677,42 @@
   Name.Profile(ID);
 }
 
-void StmtProfiler::VisitTemplateArguments(const TemplateArgument *Args,
+void StmtProfiler::VisitTemplateArguments(const TemplateArgumentLoc *Args,
                                           unsigned NumArgs) {
   ID.AddInteger(NumArgs);
-  for (unsigned I = 0; I != NumArgs; ++I) {
-    const TemplateArgument &Arg = Args[I];
+  for (unsigned I = 0; I != NumArgs; ++I)
+    VisitTemplateArgument(Args[I].getArgument());
+}
 
-    // Mostly repetitive with TemplateArgument::Profile!
-    ID.AddInteger(Arg.getKind());
-    switch (Arg.getKind()) {
-      case TemplateArgument::Null:
-        break;
+void StmtProfiler::VisitTemplateArgument(const TemplateArgument &Arg) {
+  // Mostly repetitive with TemplateArgument::Profile!
+  ID.AddInteger(Arg.getKind());
+  switch (Arg.getKind()) {
+  case TemplateArgument::Null:
+    break;
 
-      case TemplateArgument::Type:
-        VisitType(Arg.getAsType());
-        break;
+  case TemplateArgument::Type:
+    VisitType(Arg.getAsType());
+    break;
 
-      case TemplateArgument::Declaration:
-        VisitDecl(Arg.getAsDecl());
-        break;
+  case TemplateArgument::Declaration:
+    VisitDecl(Arg.getAsDecl());
+    break;
 
-      case TemplateArgument::Integral:
-        Arg.getAsIntegral()->Profile(ID);
-        VisitType(Arg.getIntegralType());
-        break;
+  case TemplateArgument::Integral:
+    Arg.getAsIntegral()->Profile(ID);
+    VisitType(Arg.getIntegralType());
+    break;
 
-      case TemplateArgument::Expression:
-        Visit(Arg.getAsExpr());
-        break;
+  case TemplateArgument::Expression:
+    Visit(Arg.getAsExpr());
+    break;
 
-      case TemplateArgument::Pack:
-        VisitTemplateArguments(Arg.pack_begin(), Arg.pack_size());
-        break;
-    }
+  case TemplateArgument::Pack:
+    const TemplateArgument *Pack = Arg.pack_begin();
+    for (unsigned i = 0, e = Arg.pack_size(); i != e; ++i)
+      VisitTemplateArgument(Pack[i]);
+    break;
   }
 }