From 02c44f0962c8739c447bc35688d47294f72494aa Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Mon, 5 Aug 2013 22:26:46 +0000 Subject: [PATCH] [ms-cxxabi] Handle template-template arguments Template-template arguments appear to be a rather simple encoding of the template's templated tag type. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@187751 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/AST/MicrosoftMangle.cpp | 17 +++++++++------ test/CodeGenCXX/mangle-ms-templates.cpp | 29 +++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/lib/AST/MicrosoftMangle.cpp b/lib/AST/MicrosoftMangle.cpp index 68f57a9212..fb3f87ad13 100644 --- a/lib/AST/MicrosoftMangle.cpp +++ b/lib/AST/MicrosoftMangle.cpp @@ -123,7 +123,7 @@ private: #undef NON_CANONICAL_TYPE #undef TYPE - void mangleType(const TagType*); + void mangleType(const TagDecl *TD); void mangleDecayedArrayType(const ArrayType *T, bool IsGlobal); void mangleArrayType(const ArrayType *T); void mangleFunctionClass(const FunctionDecl *FD); @@ -904,6 +904,9 @@ void MicrosoftCXXNameMangler::mangleTemplateArg(const TemplateDecl *TD, mangleTemplateArg(TD, *I, ArgIndex); break; case TemplateArgument::Template: + mangleType(cast( + TA.getAsTemplate().getAsTemplateDecl()->getTemplatedDecl())); + break; case TemplateArgument::TemplateExpansion: { // Issue a diagnostic. DiagnosticsEngine &Diags = Context.getDiags(); @@ -1407,13 +1410,13 @@ void MicrosoftCXXNameMangler::mangleType(const UnresolvedUsingType *T, // ::= V // ::= W void MicrosoftCXXNameMangler::mangleType(const EnumType *T, SourceRange) { - mangleType(cast(T)); + mangleType(cast(T)->getDecl()); } void MicrosoftCXXNameMangler::mangleType(const RecordType *T, SourceRange) { - mangleType(cast(T)); + mangleType(cast(T)->getDecl()); } -void MicrosoftCXXNameMangler::mangleType(const TagType *T) { - switch (T->getDecl()->getTagKind()) { +void MicrosoftCXXNameMangler::mangleType(const TagDecl *TD) { + switch (TD->getTagKind()) { case TTK_Union: Out << 'T'; break; @@ -1427,10 +1430,10 @@ void MicrosoftCXXNameMangler::mangleType(const TagType *T) { case TTK_Enum: Out << 'W'; Out << getASTContext().getTypeSizeInChars( - cast(T->getDecl())->getIntegerType()).getQuantity(); + cast(TD)->getIntegerType()).getQuantity(); break; } - mangleName(T->getDecl()); + mangleName(TD); } // ::= diff --git a/test/CodeGenCXX/mangle-ms-templates.cpp b/test/CodeGenCXX/mangle-ms-templates.cpp index 6e5be65824..25c8b43506 100644 --- a/test/CodeGenCXX/mangle-ms-templates.cpp +++ b/test/CodeGenCXX/mangle-ms-templates.cpp @@ -157,6 +157,35 @@ void variadic_class_instantiate() { // CHECK: call {{.*}} @"\01??0?$VariadicClass@HD_N@@QAE@XZ" // CHECK: call {{.*}} @"\01??0?$VariadicClass@_NDH@@QAE@XZ" +template +struct Second {}; + +template class> +struct Type {}; + +template