summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2013-08-13 01:25:35 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2013-08-13 01:25:35 +0000
commite8fdc06e0dab2e7b98339425dbe369e27e2092a3 (patch)
tree09205b7e1181abe3ed146c29ed284db215362a53
parent3d96acb7351c3bb56d25889601a0f160fdfe9482 (diff)
downloadbcm5719-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.cpp6
-rw-r--r--clang/test/CodeGenCXX/mangle-ms-templates.cpp11
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"
OpenPOWER on IntegriCloud