From: Anders Carlsson Date: Thu, 17 Sep 2009 04:38:23 +0000 (+0000) Subject: Treat an unqualified RecordType as a RecordDecl when substituting. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=657094b1ad9c0806d64e96e3faf15e7fcb0e8d65;p=clang Treat an unqualified RecordType as a RecordDecl when substituting. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@82123 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/Mangle.cpp b/lib/CodeGen/Mangle.cpp index 8241ad61d0..f42e395e55 100644 --- a/lib/CodeGen/Mangle.cpp +++ b/lib/CodeGen/Mangle.cpp @@ -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(ND); - if (FD && FD->getPrimaryTemplate()) + if (FD && FD->getPrimaryTemplate()) { mangleUnscopedTemplateName(FD); - else + mangleTemplateArgs(*FD->getTemplateSpecializationArgs()); + } else mangleUnscopedName(ND); } else if (isa(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(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(T->getDecl())) - mangleTemplateArgumentList(Spec->getTemplateArgs()); + mangleTemplateArgs(Spec->getTemplateArgs()); } // ::= @@ -877,20 +872,20 @@ void CXXNameMangler::mangleCXXDtorType(CXXDtorType T) { } } -void CXXNameMangler::mangleTemplateArgumentList(const TemplateArgumentList &L) { +void CXXNameMangler::mangleTemplateArgs(const TemplateArgumentList &L) { // ::= I + 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) { // ::= # type or template // ::= X E # expression // ::= # 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(T)) + return mangleSubstitution(RT->getDecl()); + } + uintptr_t TypePtr = reinterpret_cast(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(T)) { + addSubstitution(RT->getDecl()); + return; + } + } + uintptr_t TypePtr = reinterpret_cast(T.getAsOpaquePtr()); addSubstitution(TypePtr); } diff --git a/test/CodeGenCXX/mangle-subst.cpp b/test/CodeGenCXX/mangle-subst.cpp index fb0e990902..ffeaafd7fc 100644 --- a/test/CodeGenCXX/mangle-subst.cpp +++ b/test/CodeGenCXX/mangle-subst.cpp @@ -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*) { }