diff options
author | Reid Kleckner <reid@kleckner.net> | 2013-03-20 22:29:42 +0000 |
---|---|---|
committer | Reid Kleckner <reid@kleckner.net> | 2013-03-20 22:29:42 +0000 |
commit | ff430f6af32468d3b09b66266aef03818230c35f (patch) | |
tree | f3dafde7ded4def8b6a3334e6be6b6765615b82f | |
parent | aa5573364b79bf4d85380aaec59cae2eeefcb322 (diff) |
[ms-cxxabi] Mangle function pointer template arguments correctly
Reviewers: rjmccall
CC: timurrrr, llvm-commits
Differential Revision: http://llvm-reviews.chandlerc.com/D554
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@177589 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/AST/MicrosoftMangle.cpp | 4 | ||||
-rw-r--r-- | test/CodeGenCXX/mangle-ms-templates.cpp | 13 |
2 files changed, 16 insertions, 1 deletions
diff --git a/lib/AST/MicrosoftMangle.cpp b/lib/AST/MicrosoftMangle.cpp index 81a138949b..918e5d45ce 100644 --- a/lib/AST/MicrosoftMangle.cpp +++ b/lib/AST/MicrosoftMangle.cpp @@ -827,6 +827,9 @@ MicrosoftCXXNameMangler::mangleTemplateArgs(const TemplateDecl *TD, case TemplateArgument::Type: mangleType(TA.getAsType(), SourceRange()); break; + case TemplateArgument::Declaration: + mangle(cast<NamedDecl>(TA.getAsDecl()), "$1?"); + break; case TemplateArgument::Integral: mangleIntegerLiteral(TA.getAsIntegral(), TA.getIntegralType()->isBooleanType()); @@ -836,7 +839,6 @@ MicrosoftCXXNameMangler::mangleTemplateArgs(const TemplateDecl *TD, break; case TemplateArgument::Template: case TemplateArgument::TemplateExpansion: - case TemplateArgument::Declaration: case TemplateArgument::NullPtr: case TemplateArgument::Pack: { // Issue a diagnostic. diff --git a/test/CodeGenCXX/mangle-ms-templates.cpp b/test/CodeGenCXX/mangle-ms-templates.cpp index e16fe936bc..d0e8af4888 100644 --- a/test/CodeGenCXX/mangle-ms-templates.cpp +++ b/test/CodeGenCXX/mangle-ms-templates.cpp @@ -78,3 +78,16 @@ namespace space { void use() { space::foo(42); } + +// PR13455 +typedef void (*FunctionPointer)(void); + +template <FunctionPointer function> +void FunctionPointerTemplate() { + function(); +} + +void spam() { + FunctionPointerTemplate<spam>(); +// CHECK: "\01??$FunctionPointerTemplate@$1?spam@@YAXXZ@@YAXXZ" +} |