<div dir="ltr">Ping.</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Mon, Jul 1, 2013 at 11:31 PM, Reid Kleckner <span dir="ltr"><<a href="mailto:rnk@google.com" target="_blank">rnk@google.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">They don't seem to be used for back references, presumably because a<br>
function template is unlikely to reoccur, while a class template name<br>
may reoccur as a type.<br>
<br>
This fixes a mangling issue for llvm::hash_combine() in Hashing.h.<br>
<br>
<a href="http://llvm-reviews.chandlerc.com/D1078" target="_blank">http://llvm-reviews.chandlerc.com/D1078</a><br>
<br>
Files:<br>
  lib/AST/MicrosoftMangle.cpp<br>
  test/CodeGenCXX/mangle-ms-back-references-pr13207.cpp<br>
  test/CodeGenCXX/mangle-ms-back-references.cpp<br>
<br>
Index: lib/AST/MicrosoftMangle.cpp<br>
===================================================================<br>
--- lib/AST/MicrosoftMangle.cpp<br>
+++ lib/AST/MicrosoftMangle.cpp<br>
@@ -420,7 +420,16 @@<br>
   // Check if we have a template.<br>
   const TemplateArgumentList *TemplateArgs = 0;<br>
   if (const TemplateDecl *TD = isTemplate(ND, TemplateArgs)) {<br>
-    // We have a template.<br>
+    // Function templates aren't considered for name back referencing.  This<br>
+    // makes sense since function templates aren't likely to occur multiple<br>
+    // times in a symbol.<br>
+    // FIXME: Test alias template mangling with MSVC 2013.<br>
+    if (!isa<ClassTemplateDecl>(TD)) {<br>
+      mangleTemplateInstantiationName(TD, *TemplateArgs);<br>
+      return;<br>
+    }<br>
+<br>
+    // We have a class template.<br>
     // Here comes the tricky thing: if we need to mangle something like<br>
     //   void foo(A::X<Y>, B::X<Y>),<br>
     // the X<Y> part is aliased. However, if you need to mangle<br>
Index: test/CodeGenCXX/mangle-ms-back-references-pr13207.cpp<br>
===================================================================<br>
--- test/CodeGenCXX/mangle-ms-back-references-pr13207.cpp<br>
+++ test/CodeGenCXX/mangle-ms-back-references-pr13207.cpp<br>
@@ -107,7 +107,7 @@<br>
 void foo(I<A> x) {}<br>
 // CHECK: "\01?foo@PR13207@@YAXV?$I@VA@PR13207@@@1@@Z"<br>
 void foo2(I<A> x, I<A> y) { }<br>
-// CHECK "\01?foo2@PR13207@@YAXV?$I@VA@PR13207@@@1@0@Z"<br>
+// CHECK: "\01?foo2@PR13207@@YAXV?$I@VA@PR13207@@@1@0@Z"<br>
 void bar(J<A,B> x) {}<br>
 // CHECK: "\01?bar@PR13207@@YAXV?$J@VA@PR13207@@VB@2@@1@@Z"<br>
 void spam(K<A,B,C> x) {}<br>
@@ -163,3 +163,31 @@<br>
 // CHECK: "\01?foobar@NC@PR13207@@YAXV?$Y@V?$Y@V?$Y@VX@NA@PR13207@@@NA@PR13207@@@NB@PR13207@@@12@@Z"<br>
 }<br>
 }<br>
+<br>
+// Function template names are not considered for backreferencing, but normal<br>
+// function names are.<br>
+namespace fn_space {<br>
+struct RetVal { int hash; };<br>
+template <typename T><br>
+RetVal fun_tmpl(const T &t) { return RetVal(); }<br>
+RetVal fun_normal(int t) { return RetVal(); }<br>
+void fun_instantiate() {<br>
+  fun_normal(1);<br>
+  fun_tmpl(1);<br>
+}<br>
+// CHECK: "\01?fun_normal@fn_space@@YA?AURetVal@1@H@Z"<br>
+// CHECK: "\01??$fun_tmpl@H@fn_space@@YA?AURetVal@0@ABH@Z"<br>
+<br>
+template <typename T, RetVal (*F)(T)><br>
+RetVal fun_tmpl_recurse(T t) {<br>
+  if (!t)<br>
+    return RetVal();<br>
+  return F(t - 1);<br>
+}<br>
+RetVal ident(int x) { return RetVal(); }<br>
+void fun_instantiate2() {<br>
+  fun_tmpl_recurse<int, fun_tmpl_recurse<int, ident> >(10);<br>
+}<br>
+// CHECK: "\01??$fun_tmpl_recurse@H$1??$fun_tmpl_recurse@H$1?ident@fn_space@@YA?AURetVal@2@H@Z@fn_space@@YA?AURetVal@1@H@Z@fn_space@@YA?AURetVal@0@H@Z"<br>
+// CHECK: "\01??$fun_tmpl_recurse@H$1?ident@fn_space@@YA?AURetVal@2@H@Z@fn_space@@YA?AURetVal@0@H@Z"<br>
+}<br>
Index: test/CodeGenCXX/mangle-ms-back-references.cpp<br>
===================================================================<br>
--- test/CodeGenCXX/mangle-ms-back-references.cpp<br>
+++ test/CodeGenCXX/mangle-ms-back-references.cpp<br>
@@ -61,3 +61,8 @@<br>
<br>
 PInt3Func h3(PInt3Func x, PInt3Func y, int* z) { return 0; }<br>
 // CHECK: "\01?h3@@YAP6APAHPAH0@ZP6APAH00@Z10@Z"<br>
+<br>
+namespace foo {<br>
+void foo() { }<br>
+// CHECK: "\01?foo@0@YAXXZ"<br>
+}<br>
</blockquote></div><br></div>