Skip to content

Commit e8fdc06

Browse files
committed
[-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
1 parent 3d96acb commit e8fdc06

File tree

2 files changed

+15
-2
lines changed

2 files changed

+15
-2
lines changed

clang/lib/AST/MicrosoftMangle.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -886,9 +886,11 @@ void MicrosoftCXXNameMangler::mangleTemplateArg(const TemplateDecl *TD,
886886
mangleType(T, SourceRange(), QMM_Escape);
887887
break;
888888
}
889-
case TemplateArgument::Declaration:
890-
mangle(cast<NamedDecl>(TA.getAsDecl()), "$1?");
889+
case TemplateArgument::Declaration: {
890+
const NamedDecl *ND = cast<NamedDecl>(TA.getAsDecl());
891+
mangle(ND, TA.isDeclForReferenceParam() ? "$E?" : "$1?");
891892
break;
893+
}
892894
case TemplateArgument::Integral:
893895
mangleIntegerLiteral(TA.getAsIntegral(),
894896
TA.getIntegralType()->isBooleanType());

clang/test/CodeGenCXX/mangle-ms-templates.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,3 +190,14 @@ void template_template_specialization<void (Type<Thing<Second, true>, Second>)>(
190190
template <decltype(nullptr)> struct S1 {};
191191
void f(S1<nullptr>) {}
192192
// CHECK: "\01?f@@YAXU?$S1@$0A@@@@Z"
193+
194+
struct record {
195+
int first;
196+
int second;
197+
};
198+
template <const record &>
199+
struct type1 {
200+
};
201+
extern const record inst;
202+
void recref(type1<inst>) {}
203+
// CHECK: "\01?recref@@YAXU?$type1@$E?inst@@3Urecord@@B@@@Z"

0 commit comments

Comments
 (0)