diff options
author | David Majnemer <david.majnemer@gmail.com> | 2013-08-13 01:25:35 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2013-08-13 01:25:35 +0000 |
commit | e8fdc06e0dab2e7b98339425dbe369e27e2092a3 (patch) | |
tree | 09205b7e1181abe3ed146c29ed284db215362a53 | |
parent | 3d96acb7351c3bb56d25889601a0f160fdfe9482 (diff) | |
download | bcm5719-llvm-e8fdc06e0dab2e7b98339425dbe369e27e2092a3.tar.gz bcm5719-llvm-e8fdc06e0dab2e7b98339425dbe369e27e2092a3.zip |
[-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
llvm-svn: 188245
-rw-r--r-- | clang/lib/AST/MicrosoftMangle.cpp | 6 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/mangle-ms-templates.cpp | 11 |
2 files changed, 15 insertions, 2 deletions
diff --git a/clang/lib/AST/MicrosoftMangle.cpp b/clang/lib/AST/MicrosoftMangle.cpp index 8d7b76db5e9..765b14d49e5 100644 --- a/clang/lib/AST/MicrosoftMangle.cpp +++ b/clang/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<NamedDecl>(TA.getAsDecl()), "$1?"); + case TemplateArgument::Declaration: { + const NamedDecl *ND = cast<NamedDecl>(TA.getAsDecl()); + mangle(ND, TA.isDeclForReferenceParam() ? "$E?" : "$1?"); break; + } case TemplateArgument::Integral: mangleIntegerLiteral(TA.getAsIntegral(), TA.getIntegralType()->isBooleanType()); diff --git a/clang/test/CodeGenCXX/mangle-ms-templates.cpp b/clang/test/CodeGenCXX/mangle-ms-templates.cpp index 25c8b43506d..e65279aa0da 100644 --- a/clang/test/CodeGenCXX/mangle-ms-templates.cpp +++ b/clang/test/CodeGenCXX/mangle-ms-templates.cpp @@ -190,3 +190,14 @@ void template_template_specialization<void (Type<Thing<Second, true>, Second>)>( template <decltype(nullptr)> struct S1 {}; void f(S1<nullptr>) {} // CHECK: "\01?f@@YAXU?$S1@$0A@@@@Z" + +struct record { + int first; + int second; +}; +template <const record &> +struct type1 { +}; +extern const record inst; +void recref(type1<inst>) {} +// CHECK: "\01?recref@@YAXU?$type1@$E?inst@@3Urecord@@B@@@Z" |