From: David Majnemer Date: Wed, 4 Jun 2014 16:46:32 +0000 (+0000) Subject: MS-ABI: Mangle empty template parameter packs correctly X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=389879352df9c1598ff2c60068ec29e7b36f7921;p=clang MS-ABI: Mangle empty template parameter packs correctly Tested for compatibility with VS2013. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@210198 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/MicrosoftMangle.cpp b/lib/AST/MicrosoftMangle.cpp index d444bf0996..2cc1e5f46c 100644 --- a/lib/AST/MicrosoftMangle.cpp +++ b/lib/AST/MicrosoftMangle.cpp @@ -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 TemplateArgs = TA.getPackAsArray(); + if (TemplateArgs.empty()) { + Out << "$S"; + } else { + for (const TemplateArgument &PA : TemplateArgs) + mangleTemplateArg(TD, PA); + } break; + } case TemplateArgument::Template: mangleType(cast( TA.getAsTemplate().getAsTemplateDecl()->getTemplatedDecl())); diff --git a/test/CodeGenCXX/mangle-ms-cxx11.cpp b/test/CodeGenCXX/mangle-ms-cxx11.cpp index 0cd23f5122..373d2b7b95 100644 --- a/test/CodeGenCXX/mangle-ms-cxx11.cpp +++ b/test/CodeGenCXX/mangle-ms-cxx11.cpp @@ -133,3 +133,9 @@ void A::foo() __restrict && {} int operator"" _deg(long double) { return 0; } // CHECK-DAG: @"\01??__K_deg@@YAHO@Z" + +template +void templ_fun_with_pack() {} + +template void templ_fun_with_pack<>(); +// CHECK-DAG: @"\01??$templ_fun_with_pack@$S@@YAXXZ"