From f2081f685a021d1a50ded55cb23c7f039a037e7c Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Tue, 13 Aug 2013 01:25:35 +0000 Subject: [PATCH] [-cxx-abi microsoft] Mangle TemplateArgument::Declaration for references Summary: Properly mangle declarations showing up in template arguments that are reference parameters. Fun-fact: undname cannot handle these! Reviewers: rnk, cdavis5x Reviewed By: rnk CC: cfe-commits Differential Revision: http://llvm-reviews.chandlerc.com/D1356 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@188245 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/AST/MicrosoftMangle.cpp | 6 ++++-- test/CodeGenCXX/mangle-ms-templates.cpp | 11 +++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/lib/AST/MicrosoftMangle.cpp b/lib/AST/MicrosoftMangle.cpp index 8d7b76db5e..765b14d49e 100644 --- a/lib/AST/MicrosoftMangle.cpp +++ b/lib/AST/MicrosoftMangle.cpp @@ -886,9 +886,11 @@ void MicrosoftCXXNameMangler::mangleTemplateArg(const TemplateDecl *TD, mangleType(T, SourceRange(), QMM_Escape); break; } - case TemplateArgument::Declaration: - mangle(cast(TA.getAsDecl()), "$1?"); + case TemplateArgument::Declaration: { + const NamedDecl *ND = cast(TA.getAsDecl()); + mangle(ND, TA.isDeclForReferenceParam() ? "$E?" : "$1?"); break; + } case TemplateArgument::Integral: mangleIntegerLiteral(TA.getAsIntegral(), TA.getIntegralType()->isBooleanType()); diff --git a/test/CodeGenCXX/mangle-ms-templates.cpp b/test/CodeGenCXX/mangle-ms-templates.cpp index 25c8b43506..e65279aa0d 100644 --- a/test/CodeGenCXX/mangle-ms-templates.cpp +++ b/test/CodeGenCXX/mangle-ms-templates.cpp @@ -190,3 +190,14 @@ void template_template_specialization, Second>)>( template struct S1 {}; void f(S1) {} // CHECK: "\01?f@@YAXU?$S1@$0A@@@@Z" + +struct record { + int first; + int second; +}; +template +struct type1 { +}; +extern const record inst; +void recref(type1) {} +// CHECK: "\01?recref@@YAXU?$type1@$E?inst@@3Urecord@@B@@@Z" -- 2.50.1