diff --git include/clang/AST/TemplateBase.h include/clang/AST/TemplateBase.h
index 54c9f2c..9a663ae 100644
--- include/clang/AST/TemplateBase.h
+++ include/clang/AST/TemplateBase.h
@@ -385,7 +385,8 @@ public:
 
   TemplateArgumentLoc(const TemplateArgument &Argument, TypeSourceInfo *TInfo)
     : Argument(Argument), LocInfo(TInfo) {
-    assert(Argument.getKind() == TemplateArgument::Type);
+    assert(Argument.getKind() == TemplateArgument::Type ||
+           Argument.getKind() == TemplateArgument::Declaration);
   }
 
   TemplateArgumentLoc(const TemplateArgument &Argument, Expr *E)
diff --git lib/AST/MicrosoftMangle.cpp lib/AST/MicrosoftMangle.cpp
index f9245b8..efdee7e 100644
--- lib/AST/MicrosoftMangle.cpp
+++ lib/AST/MicrosoftMangle.cpp
@@ -795,6 +795,9 @@ MicrosoftCXXNameMangler::mangleTemplateArgs(
     case TemplateArgument::Type:
       mangleType(TA.getAsType(), TAL.getSourceRange());
       break;
+    case TemplateArgument::Declaration:
+      mangle(cast<NamedDecl>(TA.getAsDecl()), "$1?");
+      break;
     case TemplateArgument::Integral:
       mangleIntegerLiteral(TA.getIntegralType(), TA.getAsIntegral());
       break;
diff --git test/CodeGenCXX/mangle-ms-templates.cpp test/CodeGenCXX/mangle-ms-templates.cpp
index 977ef35..3fbbe2c 100644
--- test/CodeGenCXX/mangle-ms-templates.cpp
+++ test/CodeGenCXX/mangle-ms-templates.cpp
@@ -66,3 +66,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"
+}
