Fix the mangling of class template arguments in a particular

dependent case.  Thanks to Jason Merrill for pointing this out.

llvm-svn: 147653
This commit is contained in:
John McCall
2012-01-06 05:06:35 +00:00
parent 7c23b0891b
commit 8ba2f20bc0
2 changed files with 26 additions and 2 deletions

View File

@@ -2899,11 +2899,26 @@ void CXXNameMangler::mangleTemplateArg(const NamedDecl *P,
Out << "Dp";
mangleType(A.getAsTemplateOrTemplatePattern());
break;
case TemplateArgument::Expression:
case TemplateArgument::Expression: {
// It's possible to end up with a DeclRefExpr here in certain
// dependent cases, in which case we should mangle as a
// declaration.
const Expr *E = A.getAsExpr()->IgnoreParens();
if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E)) {
const ValueDecl *D = DRE->getDecl();
if (isa<VarDecl>(D) || isa<FunctionDecl>(D)) {
Out << "L";
mangle(D, "_Z");
Out << 'E';
break;
}
}
Out << 'X';
mangleExpression(A.getAsExpr());
mangleExpression(E);
Out << 'E';
break;
}
case TemplateArgument::Integral:
mangleIntegerLiteral(A.getIntegralType(), *A.getAsIntegral());
break;

View File

@@ -144,3 +144,12 @@ namespace test10 {
f(i, d);
}
}
// Report from Jason Merrill on cxx-abi-dev, 2012.01.04.
namespace test11 {
int cmp(char a, char b);
template <typename T, int (*cmp)(T, T)> struct A {};
template <typename T> void f(A<T,cmp> &) {}
template void f<char>(A<char,cmp> &);
// CHECK: @_ZN6test111fIcEEvRNS_1AIT_L_ZNS_3cmpEccEEE(
}