]> granicus.if.org Git - clang/commitdiff
Treat an unqualified RecordType as a RecordDecl when substituting.
authorAnders Carlsson <andersca@mac.com>
Thu, 17 Sep 2009 04:38:23 +0000 (04:38 +0000)
committerAnders Carlsson <andersca@mac.com>
Thu, 17 Sep 2009 04:38:23 +0000 (04:38 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@82123 91177308-0d34-0410-b5e6-96231b3b80d8

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

index 8241ad61d077c7fd6a6023fff6148e2103fad6ee..f42e395e55ac5516feb70de538b2f20766f52ac9 100644 (file)
@@ -93,8 +93,8 @@ namespace {
     void mangleCXXCtorType(CXXCtorType T);
     void mangleCXXDtorType(CXXDtorType T);
 
-    void mangleTemplateArgumentList(const TemplateArgumentList &L);
-    void mangleTemplateArgument(const TemplateArgument &A);
+    void mangleTemplateArgs(const TemplateArgumentList &L);
+    void mangleTemplateArg(const TemplateArgument &A);
   };
 }
 
@@ -252,9 +252,10 @@ void CXXNameMangler::mangleName(const NamedDecl *ND) {
   if (ND->getDeclContext()->isTranslationUnit() ||
       isStdNamespace(ND->getDeclContext())) {
     const FunctionDecl *FD = dyn_cast<FunctionDecl>(ND);
-    if (FD && FD->getPrimaryTemplate()) 
+    if (FD && FD->getPrimaryTemplate()) {
       mangleUnscopedTemplateName(FD);
-    else
+      mangleTemplateArgs(*FD->getTemplateSpecializationArgs());
+    } else
       mangleUnscopedName(ND);
   } else if (isa<FunctionDecl>(ND->getDeclContext()))
     mangleLocalName(ND);
@@ -386,12 +387,6 @@ void CXXNameMangler::mangleUnqualifiedName(const NamedDecl *ND) {
     assert(false && "Can't mangle a using directive name!");
     break;
   }
-
-  if (const FunctionDecl *Function = dyn_cast<FunctionDecl>(ND)) {
-    if (const TemplateArgumentList *TemplateArgs
-          = Function->getTemplateSpecializationArgs())
-      mangleTemplateArgumentList(*TemplateArgs);
-  }
 }
 
 void CXXNameMangler::mangleSourceName(const IdentifierInfo *II) {
@@ -715,7 +710,7 @@ void CXXNameMangler::mangleType(const TagType *T) {
   // If this is a class template specialization, mangle the template arguments.
   if (ClassTemplateSpecializationDecl *Spec
       = dyn_cast<ClassTemplateSpecializationDecl>(T->getDecl()))
-    mangleTemplateArgumentList(Spec->getTemplateArgs());
+    mangleTemplateArgs(Spec->getTemplateArgs());
 }
 
 // <type>       ::= <array-type>
@@ -877,20 +872,20 @@ void CXXNameMangler::mangleCXXDtorType(CXXDtorType T) {
   }
 }
 
-void CXXNameMangler::mangleTemplateArgumentList(const TemplateArgumentList &L) {
+void CXXNameMangler::mangleTemplateArgs(const TemplateArgumentList &L) {
   // <template-args> ::= I <template-arg>+ E
   Out << "I";
 
   for (unsigned i = 0, e = L.size(); i != e; ++i) {
     const TemplateArgument &A = L[i];
 
-    mangleTemplateArgument(A);
+    mangleTemplateArg(A);
   }
 
   Out << "E";
 }
 
-void CXXNameMangler::mangleTemplateArgument(const TemplateArgument &A) {
+void CXXNameMangler::mangleTemplateArg(const TemplateArgument &A) {
   // <template-arg> ::= <type>              # type or template
   //                ::= X <expression> E    # expression
   //                ::= <expr-primary>      # simple expressions
@@ -932,6 +927,11 @@ bool CXXNameMangler::mangleSubstitution(const NamedDecl *ND) {
 }
 
 bool CXXNameMangler::mangleSubstitution(QualType T) {
+  if (!T.getCVRQualifiers()) {
+    if (const RecordType *RT = dyn_cast<RecordType>(T))
+      return mangleSubstitution(RT->getDecl());
+  }
+  
   uintptr_t TypePtr = reinterpret_cast<uintptr_t>(T.getAsOpaquePtr());
 
   return mangleSubstitution(TypePtr);
@@ -972,6 +972,13 @@ bool CXXNameMangler::mangleSubstitution(uintptr_t Ptr) {
 }
 
 void CXXNameMangler::addSubstitution(QualType T) {
+  if (!T.getCVRQualifiers()) {
+    if (const RecordType *RT = dyn_cast<RecordType>(T)) {
+      addSubstitution(RT->getDecl());
+      return;
+    }
+  }
+  
   uintptr_t TypePtr = reinterpret_cast<uintptr_t>(T.getAsOpaquePtr());
   addSubstitution(TypePtr);
 }
index fb0e990902508b8c9e628ada4929e4c73bbf019b..ffeaafd7fc3ae070451fe6bf408d43353df79018 100644 (file)
@@ -24,3 +24,11 @@ namespace A {
 
 // CHECK: define void @_Z1fN1A1AENS_1BE(
 void f(A::A a, A::B b) { }
+
+struct C { struct D { }; };
+
+// CHECK: define void @_Z1fP1CNS_1DE
+void f(C*, C::D) { }
+
+// CHECK: define void @_Z1fN1C1DEPKS_
+void f(C::D, const C*) { }