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 | e00745b285690934a4063df105d865fba66bec7d (patch) | |
tree | ed0a30e06c940ee4bef73215f4d00c1fda7c34fa /clang/lib/CodeGen/Mangle.cpp | |
parent | 2e5935241aef4beb9c0ce962f895b9b211621309 (diff) | |
download | bcm5719-llvm-e00745b285690934a4063df105d865fba66bec7d.tar.gz bcm5719-llvm-e00745b285690934a4063df105d865fba66bec7d.zip |
Better template parameter type mangling.
llvm-svn: 82883
Diffstat (limited to 'clang/lib/CodeGen/Mangle.cpp')
-rw-r--r-- | clang/lib/CodeGen/Mangle.cpp | 29 |
1 files changed, 18 insertions, 11 deletions
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) { } // <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) { |