From 06fa05ae9032c2370beb586b07fc4e1b80ceb1f8 Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Wed, 4 Jun 2014 16:46:32 +0000 Subject: [PATCH] MS-ABI: Mangle empty template parameter packs correctly Tested for compatibility with VS2013. llvm-svn: 210198 --- clang/lib/AST/MicrosoftMangle.cpp | 13 +++++++++---- clang/test/CodeGenCXX/mangle-ms-cxx11.cpp | 6 ++++++ 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/clang/lib/AST/MicrosoftMangle.cpp b/clang/lib/AST/MicrosoftMangle.cpp index d444bf0..2cc1e5f 100644 --- a/clang/lib/AST/MicrosoftMangle.cpp +++ b/clang/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/clang/test/CodeGenCXX/mangle-ms-cxx11.cpp b/clang/test/CodeGenCXX/mangle-ms-cxx11.cpp index 0cd23f51..373d2b7 100644 --- a/clang/test/CodeGenCXX/mangle-ms-cxx11.cpp +++ b/clang/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" -- 2.7.4