From e00745b285690934a4063df105d865fba66bec7d Mon Sep 17 00:00:00 2001 From: Anders Carlsson Date: Sun, 27 Sep 2009 00:38:53 +0000 Subject: Better template parameter type mangling. llvm-svn: 82883 --- clang/lib/CodeGen/Mangle.cpp | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) (limited to 'clang/lib/CodeGen/Mangle.cpp') diff --git a/clang/lib/CodeGen/Mangle.cpp b/clang/lib/CodeGen/Mangle.cpp index 9ee9a3da881..447255c668f 100644 --- a/clang/lib/CodeGen/Mangle.cpp +++ b/clang/lib/CodeGen/Mangle.cpp @@ -106,6 +106,8 @@ namespace { unsigned NumTemplateArgs); void mangleTemplateArgumentList(const TemplateArgumentList &L); void mangleTemplateArgument(const TemplateArgument &A); + + void mangleTemplateParameter(unsigned Index); }; } @@ -845,13 +847,8 @@ void CXXNameMangler::mangleType(const MemberPointerType *T) { } // ::= -// ::= T_ # first template parameter -// ::= T _ void CXXNameMangler::mangleType(const TemplateTypeParmType *T) { - if (T->getIndex() == 0) - Out << "T_"; - else - Out << 'T' << (T->getIndex() - 1) << '_'; + mangleTemplateParameter(T->getIndex()); } // FIXME: ::= @@ -927,6 +924,11 @@ void CXXNameMangler::mangleType(const TypenameType *T) { mangleTemplatePrefix(TD); mangleTemplateArgs(TST->getArgs(), TST->getNumArgs()); + } else if (const TemplateTypeParmType *TTPT = + dyn_cast(QTy)) { + // We use the QualType mangle type variant here because it handles + // substitutions. + mangleType(QualType(TTPT, 0)); } else assert(false && "Unhandled type!"); @@ -959,11 +961,7 @@ void CXXNameMangler::mangleExpression(const Expr *E) { default: assert(false && "Unhandled decl kind!"); case Decl::NonTypeTemplateParm: { const NonTypeTemplateParmDecl *PD = cast(D); - - if (PD->getIndex() == 0) - Out << "T_"; - else - Out << 'T' << (PD->getIndex() - 1) << '_'; + mangleTemplateParameter(PD->getIndex()); break; } @@ -1075,6 +1073,15 @@ void CXXNameMangler::mangleTemplateArgument(const TemplateArgument &A) { } } +void CXXNameMangler::mangleTemplateParameter(unsigned Index) { + // ::= T_ # first template parameter + // ::= T _ + if (Index == 0) + Out << "T_"; + else + Out << 'T' << (Index - 1) << '_'; +} + // ::= S _ // ::= S_ bool CXXNameMangler::mangleSubstitution(const NamedDecl *ND) { -- cgit v1.2.3