]> granicus.if.org Git - clang/commitdiff
[-cxx-abi microsoft] Also spill the argument-back-references context when mangling...
authorTimur Iskhodzhanov <timurrrr@google.com>
Thu, 29 Nov 2012 08:58:47 +0000 (08:58 +0000)
committerTimur Iskhodzhanov <timurrrr@google.com>
Thu, 29 Nov 2012 08:58:47 +0000 (08:58 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@168862 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/MicrosoftMangle.cpp
test/CodeGenCXX/mangle-ms-back-references-pr13207.cpp

index d91f5125387e2db83f1e9630b1afca4928edf2e3..afb8bf884447ab3b05b07947224ff56ad0c30dca 100644 (file)
@@ -742,13 +742,17 @@ void MicrosoftCXXNameMangler::mangleTemplateInstantiationName(
   // 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
index 1fa59ab54b6ce64a2c15016ed89bac41a543a01b..fbc64923486bf30710de20ec3d7d54cefdaaa4fb 100644 (file)
@@ -13,6 +13,8 @@ void foo_abb(A<char, B<char>, B<char> >) {}
 // 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>