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 | 831b71e0b57d446e56e1c7d8e50d890a03437fa8 (patch) | |
tree | bab667d48666034f7f08fa2c6f2c1311ed104750 | |
parent | 67f25272f193c4263f0cc29ee1af764c161ffb97 (diff) | |
download | bcm5719-llvm-831b71e0b57d446e56e1c7d8e50d890a03437fa8.tar.gz bcm5719-llvm-831b71e0b57d446e56e1c7d8e50d890a03437fa8.zip |
[ms-cxxabi] Mangle function pointer template arguments correctly
Reviewers: rjmccall
CC: timurrrr, llvm-commits
Differential Revision: http://llvm-reviews.chandlerc.com/D554
llvm-svn: 177589
-rw-r--r-- | clang/lib/AST/MicrosoftMangle.cpp | 4 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/mangle-ms-templates.cpp | 13 |
2 files changed, 16 insertions, 1 deletions
diff --git a/clang/lib/AST/MicrosoftMangle.cpp b/clang/lib/AST/MicrosoftMangle.cpp index 81a138949bf..918e5d45ced 100644 --- a/clang/lib/AST/MicrosoftMangle.cpp +++ b/clang/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/clang/test/CodeGenCXX/mangle-ms-templates.cpp b/clang/test/CodeGenCXX/mangle-ms-templates.cpp index e16fe936bc2..d0e8af48884 100644 --- a/clang/test/CodeGenCXX/mangle-ms-templates.cpp +++ b/clang/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" +} |