Fix reading ClassTemplateDecl's ClassTemplateSpecializationDecls and ClassTemplatePartialSpecializationDecls.

Store/read also their template arguments because they may be initializing and not be able to provide them.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@107476 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Frontend/PCHWriterDecl.cpp b/lib/Frontend/PCHWriterDecl.cpp
index 86af50b..d43ba7a 100644
--- a/lib/Frontend/PCHWriterDecl.cpp
+++ b/lib/Frontend/PCHWriterDecl.cpp
@@ -751,14 +751,24 @@
     typedef llvm::FoldingSet<ClassTemplateSpecializationDecl> CTSDSetTy;
     CTSDSetTy &CTSDSet = D->getSpecializations();
     Record.push_back(CTSDSet.size());
-    for (CTSDSetTy::iterator I=CTSDSet.begin(), E = CTSDSet.end(); I!=E; ++I)
-      Writer.AddDeclRef(&*I, Record);
+    for (CTSDSetTy::iterator I=CTSDSet.begin(), E = CTSDSet.end(); I!=E; ++I) {
+      ClassTemplateSpecializationDecl *CTSD = &*I; 
+      Writer.AddDeclRef(CTSD, Record);
+      // Write the argument list here because we may get it uninitialized when
+      // reading it back. 
+      Writer.AddTemplateArgumentList(&CTSD->getTemplateArgs(), Record);
+    }
 
     typedef llvm::FoldingSet<ClassTemplatePartialSpecializationDecl> CTPSDSetTy;
     CTPSDSetTy &CTPSDSet = D->getPartialSpecializations();
     Record.push_back(CTPSDSet.size());
-    for (CTPSDSetTy::iterator I=CTPSDSet.begin(), E = CTPSDSet.end(); I!=E; ++I)
-      Writer.AddDeclRef(&*I, Record);
+    for (CTPSDSetTy::iterator I=CTPSDSet.begin(), E=CTPSDSet.end(); I!=E; ++I) {
+      ClassTemplatePartialSpecializationDecl *CTPSD = &*I; 
+      Writer.AddDeclRef(CTPSD, Record);
+      // Write the argument list here because we may get it uninitialized when
+      // reading it back. 
+      Writer.AddTemplateArgumentList(&CTPSD->getTemplateArgs(), Record);
+    }
 
     // InjectedClassNameType is computed, no need to write it.