diff options
-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" +} |