]> granicus.if.org Git - clang/commitdiff
More mangler mangling.
authorAnders Carlsson <andersca@mac.com>
Fri, 18 Sep 2009 19:00:18 +0000 (19:00 +0000)
committerAnders Carlsson <andersca@mac.com>
Fri, 18 Sep 2009 19:00:18 +0000 (19:00 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@82250 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/Mangle.cpp

index 685bb6d594bd9c9b7f659c8aa76d7fe3610dc107..61b42b905680c1161733537b4a3a4aa2d871823b 100644 (file)
@@ -252,6 +252,21 @@ static bool isStdNamespace(const DeclContext *DC) {
   return NS->getOriginalNamespace()->getIdentifier()->isStr("std");
 }
 
+static const NamedDecl *isTemplate(const NamedDecl *ND, 
+                                   const TemplateArgumentList *&TemplateArgs) {
+  // Check if we have a function template.
+  if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(ND)){
+    if (FD->getPrimaryTemplate()) {
+      TemplateArgs = FD->getTemplateSpecializationArgs();
+      return FD;
+    }
+  }
+
+  // FIXME: Check if we have a class template.
+
+  return 0;
+}
+
 void CXXNameMangler::mangleName(const NamedDecl *ND) {
   //  <name> ::= <nested-name>
   //         ::= <unscoped-name>
@@ -266,16 +281,14 @@ void CXXNameMangler::mangleName(const NamedDecl *ND) {
   }
   
   if (DC->isTranslationUnit() || isStdNamespace(DC)) {
-    // Check if we have a function template.
-    if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(ND)){
-      if (FD->getPrimaryTemplate()) {
-        mangleUnscopedTemplateName(FD);
-        mangleTemplateArgumentList(*FD->getTemplateSpecializationArgs());
-        return;
-      }
+    // Check if we have a template.
+    const TemplateArgumentList *TemplateArgs = 0;
+    if (const NamedDecl *TD = isTemplate(ND, TemplateArgs)) {
+      mangleUnscopedTemplateName(TD);
+      mangleTemplateArgumentList(*TemplateArgs);
+      return;
     }
 
-    // FIXME: Check if we have a class template.
     mangleUnscopedName(ND);
     return;
   }
@@ -446,10 +459,11 @@ void CXXNameMangler::mangleNestedName(const NamedDecl *ND) {
   if (const CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(ND))
     mangleCVQualifiers(Method->getTypeQualifiers());
   
-  const FunctionDecl *FD = dyn_cast<FunctionDecl>(ND);
-  if (FD && FD->getPrimaryTemplate()) {
-    mangleTemplatePrefix(FD);
-    mangleTemplateArgumentList(*FD->getTemplateSpecializationArgs());
+  // Check if we have a template.
+  const TemplateArgumentList *TemplateArgs = 0;
+  if (const NamedDecl *TD = isTemplate(ND, TemplateArgs)) { 
+    mangleTemplatePrefix(TD);
+    mangleTemplateArgumentList(*TemplateArgs);
   } else {
     manglePrefix(ND->getDeclContext());
     mangleUnqualifiedName(ND);