]> granicus.if.org Git - clang/commitdiff
Better template parameter type mangling.
authorAnders Carlsson <andersca@mac.com>
Sun, 27 Sep 2009 00:38:53 +0000 (00:38 +0000)
committerAnders Carlsson <andersca@mac.com>
Sun, 27 Sep 2009 00:38:53 +0000 (00:38 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@82883 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/Mangle.cpp
test/CodeGenCXX/mangle.cpp

index 9ee9a3da881d3bdd3ba87e8e09922657b427076f..447255c668f081ff6dcfee6a5e47f14bf3eb351a 100644 (file)
@@ -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) {
index fffd4569b4e146b0710ed5e22596dcf1cef833c6..a55f5b97fee8b6050a1be7d642134b058f09d91c 100644 (file)
@@ -172,3 +172,11 @@ template<typename T> bool operator==(const A<T>&, const A<T>&) { return true; }
 // CHECK: @_ZSteqIcEbRK1AIT_ES4_
 template bool std::operator==(const ::A<char>&, const ::A<char>&);
 
+struct S {
+  typedef int U;
+};
+
+template <typename T> typename T::U ft6(const T&) { return 0; }
+
+// CHECK: @_Z3ft6I1SENT_1UERKS1_
+template int ft6<S>(const S&);