[-cxx-abi microsoft] Also spill the argument-back-references context when mangling templates

llvm-svn: 168862
diff --git a/clang/lib/AST/MicrosoftMangle.cpp b/clang/lib/AST/MicrosoftMangle.cpp
index d91f512..afb8bf8 100644
--- a/clang/lib/AST/MicrosoftMangle.cpp
+++ b/clang/lib/AST/MicrosoftMangle.cpp
@@ -742,13 +742,17 @@
   // Always start with the unqualified name.
 
   // Templates have their own context for back references.
-  BackRefMap TemplateContext;
-  NameBackReferences.swap(TemplateContext);
+  ArgBackRefMap OuterArgsContext;
+  BackRefMap OuterTemplateContext;
+  NameBackReferences.swap(OuterTemplateContext);
+  TypeBackReferences.swap(OuterArgsContext);
 
   mangleUnscopedTemplateName(TD);
   mangleTemplateArgs(TemplateArgs);
 
-  NameBackReferences.swap(TemplateContext);
+  // Restore the previous back reference contexts.
+  NameBackReferences.swap(OuterTemplateContext);
+  TypeBackReferences.swap(OuterArgsContext);
 }
 
 void
diff --git a/clang/test/CodeGenCXX/mangle-ms-back-references-pr13207.cpp b/clang/test/CodeGenCXX/mangle-ms-back-references-pr13207.cpp
index 1fa59ab5..fbc6492 100644
--- a/clang/test/CodeGenCXX/mangle-ms-back-references-pr13207.cpp
+++ b/clang/test/CodeGenCXX/mangle-ms-back-references-pr13207.cpp
@@ -13,6 +13,8 @@
 // CHECK: "\01?foo_abb@@YAXV?$A@DV?$B@D@@V1@@@@Z"
 void foo_abc(A<char, B<char>, C<char> >) {}
 // CHECK: "\01?foo_abc@@YAXV?$A@DV?$B@D@@V?$C@D@@@@@Z"
+void foo_bt(bool a, B<bool(bool)> b) {}
+// CHECK: "\01?foo_bt@@YAX_NV?$B@$$A6A_N_N@Z@@@Z"
 
 namespace N {
 template<class X, class Y, class Z>