diff options
author | John McCall <rjmccall@apple.com> | 2010-08-20 00:17:19 +0000 |
---|---|---|
committer | John McCall <rjmccall@apple.com> | 2010-08-20 00:17:19 +0000 |
commit | 6dbce19fdae4cfae4eb5f826284978e723a04e61 (patch) | |
tree | 9f47b793d3581813fe8c5c6494b08f4a0bd42ac8 /lib/CodeGen/Mangle.cpp | |
parent | f128fed9c2ae16d3d6d8b8580b7a257e5c0a7754 (diff) |
Mangle explicit template arguments in dependent or overloaded names.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@111591 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/Mangle.cpp')
-rw-r--r-- | lib/CodeGen/Mangle.cpp | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/lib/CodeGen/Mangle.cpp b/lib/CodeGen/Mangle.cpp index 30fd668b0c..312bc9920d 100644 --- a/lib/CodeGen/Mangle.cpp +++ b/lib/CodeGen/Mangle.cpp @@ -245,6 +245,7 @@ private: void mangleCXXCtorType(CXXCtorType T); void mangleCXXDtorType(CXXDtorType T); + void mangleTemplateArgs(const ExplicitTemplateArgumentList &TemplateArgs); void mangleTemplateArgs(TemplateName Template, const TemplateArgument *TemplateArgs, unsigned NumTemplateArgs); @@ -1676,6 +1677,8 @@ void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity) { mangleMemberExpr(ME->getBase(), ME->isArrow(), ME->getQualifier(), ME->getMemberName(), Arity); + if (ME->hasExplicitTemplateArgs()) + mangleTemplateArgs(ME->getExplicitTemplateArgs()); break; } @@ -1685,6 +1688,8 @@ void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity) { mangleMemberExpr(ME->getBase(), ME->isArrow(), ME->getQualifier(), ME->getMember(), Arity); + if (ME->hasExplicitTemplateArgs()) + mangleTemplateArgs(ME->getExplicitTemplateArgs()); break; } @@ -1694,6 +1699,8 @@ void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity) { // expression. const UnresolvedLookupExpr *ULE = cast<UnresolvedLookupExpr>(E); mangleUnresolvedName(ULE->getQualifier(), ULE->getName(), Arity); + if (ULE->hasExplicitTemplateArgs()) + mangleTemplateArgs(ULE->getExplicitTemplateArgs()); break; } @@ -1888,10 +1895,13 @@ void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity) { } assert(QTy && "Qualifier was not type!"); - // ::= sr <type> <unqualified-name> # dependent name + // ::= sr <type> <unqualified-name> # dependent name + // ::= sr <type> <unqualified-name> <template-args> # dependent template-id Out << "sr"; mangleType(QualType(QTy, 0)); mangleUnqualifiedName(0, DRE->getDeclName(), Arity); + if (DRE->hasExplicitTemplateArgs()) + mangleTemplateArgs(DRE->getExplicitTemplateArgs()); break; } @@ -2020,6 +2030,15 @@ void CXXNameMangler::mangleCXXDtorType(CXXDtorType T) { } } +void CXXNameMangler::mangleTemplateArgs( + const ExplicitTemplateArgumentList &TemplateArgs) { + // <template-args> ::= I <template-arg>+ E + Out << 'I'; + for (unsigned I = 0, E = TemplateArgs.NumTemplateArgs; I != E; ++I) + mangleTemplateArg(0, TemplateArgs.getTemplateArgs()[I].getArgument()); + Out << 'E'; +} + void CXXNameMangler::mangleTemplateArgs(TemplateName Template, const TemplateArgument *TemplateArgs, unsigned NumTemplateArgs) { |