MS-ABI: Mangle empty template parameter packs correctly

Tested for compatibility with VS2013.

llvm-svn: 210198
This commit is contained in:
David Majnemer 2014-06-04 16:46:32 +00:00
parent e31a3ed3d4
commit 06fa05ae90
2 changed files with 15 additions and 4 deletions

View 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()));

View 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"