From: Anders Carlsson Date: Sat, 26 Sep 2009 02:26:02 +0000 (+0000) Subject: Improve mangling of typename types. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ae3524866124021f3bc695886668254093c0793f;p=clang Improve mangling of typename types. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@82833 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/Mangle.cpp b/lib/CodeGen/Mangle.cpp index 83dc0e64dc..9766e585ff 100644 --- a/lib/CodeGen/Mangle.cpp +++ b/lib/CodeGen/Mangle.cpp @@ -911,7 +911,22 @@ void CXXNameMangler::mangleType(const TemplateSpecializationType *T) { } void CXXNameMangler::mangleType(const TypenameType *T) { - assert(false && "can't mangle dependent typenames yet"); + // Typename types are always nested + Out << 'N'; + + const Type *QTy = T->getQualifier()->getAsType(); + if (const TemplateSpecializationType *TST = + dyn_cast(QTy)) { + TemplateDecl *TD = TST->getTemplateName().getAsTemplateDecl(); + + mangleTemplatePrefix(TD); + mangleTemplateArgs(TST->getArgs(), TST->getNumArgs()); + } else + assert(false && "Unhandled type!"); + + mangleSourceName(T->getIdentifier()); + + Out << 'E'; } void CXXNameMangler::mangleExpression(const Expr *E) { diff --git a/test/CodeGenCXX/mangle.cpp b/test/CodeGenCXX/mangle.cpp index 306188c8de..b61f1d00df 100644 --- a/test/CodeGenCXX/mangle.cpp +++ b/test/CodeGenCXX/mangle.cpp @@ -147,3 +147,11 @@ Debug dbg; // CHECK: @_ZNK5DebuglsEj int main(void) { dbg << 32 ;} } + +template struct S6 { + typedef int B; +}; + +template void ft5(typename S6::B) { } +// CHECK: @_Z3ft5IiEvN2S6IT_E1BE +template void ft5(int);