Index: cfe/trunk/lib/AST/MicrosoftMangle.cpp =================================================================== --- cfe/trunk/lib/AST/MicrosoftMangle.cpp +++ cfe/trunk/lib/AST/MicrosoftMangle.cpp @@ -279,7 +279,8 @@ void mangleTemplateArgs(const TemplateDecl *TD, const TemplateArgumentList &TemplateArgs); - void mangleTemplateArg(const TemplateDecl *TD, const TemplateArgument &TA); + void mangleTemplateArg(const TemplateDecl *TD, const TemplateArgument &TA, + const NamedDecl *Parm); }; } @@ -1104,12 +1105,18 @@ void MicrosoftCXXNameMangler::mangleTemplateArgs( const TemplateDecl *TD, const TemplateArgumentList &TemplateArgs) { // ::= + + const TemplateParameterList *TPL = TD->getTemplateParameters(); + assert(TPL->size() == TemplateArgs.size() && + "size mismatch between args and parms!"); + + unsigned Idx = 0; for (const TemplateArgument &TA : TemplateArgs.asArray()) - mangleTemplateArg(TD, TA); + mangleTemplateArg(TD, TA, TPL->getParam(Idx++)); } void MicrosoftCXXNameMangler::mangleTemplateArg(const TemplateDecl *TD, - const TemplateArgument &TA) { + const TemplateArgument &TA, + const NamedDecl *Parm) { // ::= // ::= // ::= @@ -1172,10 +1179,16 @@ case TemplateArgument::Pack: { ArrayRef TemplateArgs = TA.getPackAsArray(); if (TemplateArgs.empty()) { - Out << "$S"; + if (isa(Parm) || + isa(Parm)) + Out << "$$V"; + else if (isa(Parm)) + Out << "$S"; + else + llvm_unreachable("unexpected template parameter decl!"); } else { for (const TemplateArgument &PA : TemplateArgs) - mangleTemplateArg(TD, PA); + mangleTemplateArg(TD, PA, Parm); } break; } Index: cfe/trunk/test/CodeGenCXX/mangle-ms-cxx11.cpp =================================================================== --- cfe/trunk/test/CodeGenCXX/mangle-ms-cxx11.cpp +++ cfe/trunk/test/CodeGenCXX/mangle-ms-cxx11.cpp @@ -140,6 +140,18 @@ template void templ_fun_with_pack<>(); // CHECK-DAG: @"\01??$templ_fun_with_pack@$S@@YAXXZ" +template +void templ_fun_with_ty_pack() {} + +template void templ_fun_with_ty_pack<>(); +// CHECK-DAG: @"\01??$templ_fun_with_ty_pack@$$V@@YAXXZ" + +template