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 | f834bcd659ec8c74587712fe74e4251312733b69 (patch) | |
tree | 6533655dee09f4890223d723ad11e937adf85250 /clang/lib/CodeGen/Mangle.cpp | |
parent | 7b02b583b23fac6f31e0645dc1c11340291ea4a3 (diff) | |
download | bcm5719-llvm-f834bcd659ec8c74587712fe74e4251312733b69.tar.gz bcm5719-llvm-f834bcd659ec8c74587712fe74e4251312733b69.zip |
Mangle explicit template arguments in dependent or overloaded names.
llvm-svn: 111591
Diffstat (limited to 'clang/lib/CodeGen/Mangle.cpp')
-rw-r--r-- | clang/lib/CodeGen/Mangle.cpp | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/clang/lib/CodeGen/Mangle.cpp b/clang/lib/CodeGen/Mangle.cpp index 30fd668b0c2..312bc9920d9 100644 --- a/clang/lib/CodeGen/Mangle.cpp +++ b/clang/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) { |