diff options
author | Anders Carlsson <andersca@mac.com> | 2009-09-27 00:38:53 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-09-27 00:38:53 +0000 |
commit | 0ccdf8d62cba2ad730001f133b6cc4836c42da83 (patch) | |
tree | 10f3cb0d0b37c8ea1639644ae6697a662f9fe7cf /lib/CodeGen/Mangle.cpp | |
parent | f514b544b24926834adbfe8265a72ed8b9b09d81 (diff) |
Better template parameter type mangling.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@82883 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/Mangle.cpp')
-rw-r--r-- | lib/CodeGen/Mangle.cpp | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/lib/CodeGen/Mangle.cpp b/lib/CodeGen/Mangle.cpp index 9ee9a3da88..447255c668 100644 --- a/lib/CodeGen/Mangle.cpp +++ b/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) { } // <type> ::= <template-param> -// <template-param> ::= T_ # first template parameter -// ::= T <parameter-2 non-negative number> _ void CXXNameMangler::mangleType(const TemplateTypeParmType *T) { - if (T->getIndex() == 0) - Out << "T_"; - else - Out << 'T' << (T->getIndex() - 1) << '_'; + mangleTemplateParameter(T->getIndex()); } // FIXME: <type> ::= <template-template-param> <template-args> @@ -927,6 +924,11 @@ void CXXNameMangler::mangleType(const TypenameType *T) { mangleTemplatePrefix(TD); mangleTemplateArgs(TST->getArgs(), TST->getNumArgs()); + } else if (const TemplateTypeParmType *TTPT = + dyn_cast<TemplateTypeParmType>(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<NonTypeTemplateParmDecl>(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) { + // <template-param> ::= T_ # first template parameter + // ::= T <parameter-2 non-negative number> _ + if (Index == 0) + Out << "T_"; + else + Out << 'T' << (Index - 1) << '_'; +} + // <substitution> ::= S <seq-id> _ // ::= S_ bool CXXNameMangler::mangleSubstitution(const NamedDecl *ND) { |