diff options
author | John McCall <rjmccall@apple.com> | 2012-01-06 05:06:35 +0000 |
---|---|---|
committer | John McCall <rjmccall@apple.com> | 2012-01-06 05:06:35 +0000 |
commit | 8ba2f20bc08342250bdb620213fc4d092571ccbe (patch) | |
tree | 008bc9893da1e28a4c7a87441ca3a5b8fbb5c820 /clang/lib/AST/ItaniumMangle.cpp | |
parent | 7c23b0891bc7ed73ad478fd34f9c3468ad25b59f (diff) | |
download | bcm5719-llvm-8ba2f20bc08342250bdb620213fc4d092571ccbe.tar.gz bcm5719-llvm-8ba2f20bc08342250bdb620213fc4d092571ccbe.zip |
Fix the mangling of class template arguments in a particular
dependent case. Thanks to Jason Merrill for pointing this out.
llvm-svn: 147653
Diffstat (limited to 'clang/lib/AST/ItaniumMangle.cpp')
-rw-r--r-- | clang/lib/AST/ItaniumMangle.cpp | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp index 1e71a627ce9..7f2d5628a88 100644 --- a/clang/lib/AST/ItaniumMangle.cpp +++ b/clang/lib/AST/ItaniumMangle.cpp @@ -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; |