MS-ABI: Mangle empty template parameter packs correctly
authorDavid Majnemer <david.majnemer@gmail.com>
Wed, 4 Jun 2014 16:46:32 +0000 (16:46 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Wed, 4 Jun 2014 16:46:32 +0000 (16:46 +0000)
Tested for compatibility with VS2013.

llvm-svn: 210198

clang/lib/AST/MicrosoftMangle.cpp
clang/test/CodeGenCXX/mangle-ms-cxx11.cpp

index d444bf0..2cc1e5f 100644 (file)
@@ -1174,11 +1174,16 @@ void MicrosoftCXXNameMangler::mangleTemplateArg(const TemplateDecl *TD,
   case TemplateArgument::Expression:
     mangleExpression(TA.getAsExpr());
     break;
-  case TemplateArgument::Pack:
-    // Unlike Itanium, there is no character code to indicate an argument pack.
-    for (const TemplateArgument &PA : TA.getPackAsArray())
-      mangleTemplateArg(TD, PA);
+  case TemplateArgument::Pack: {
+    llvm::ArrayRef<TemplateArgument> TemplateArgs = TA.getPackAsArray();
+    if (TemplateArgs.empty()) {
+      Out << "$S";
+    } else {
+      for (const TemplateArgument &PA : TemplateArgs)
+        mangleTemplateArg(TD, PA);
+    }
     break;
+  }
   case TemplateArgument::Template:
     mangleType(cast<TagDecl>(
         TA.getAsTemplate().getAsTemplateDecl()->getTemplatedDecl()));
index 0cd23f5..373d2b7 100644 (file)
@@ -133,3 +133,9 @@ void A::foo() __restrict && {}
 
 int operator"" _deg(long double) { return 0; }
 // CHECK-DAG: @"\01??__K_deg@@YAHO@Z"
+
+template <char...>
+void templ_fun_with_pack() {}
+
+template void templ_fun_with_pack<>();
+// CHECK-DAG: @"\01??$templ_fun_with_pack@$S@@YAXXZ"