diff --git a/lib/AST/MicrosoftMangle.cpp b/lib/AST/MicrosoftMangle.cpp
index 98da920..f05f09a 100644
--- a/lib/AST/MicrosoftMangle.cpp
+++ b/lib/AST/MicrosoftMangle.cpp
@@ -19,6 +19,7 @@
 #include "clang/AST/DeclObjC.h"
 #include "clang/AST/DeclTemplate.h"
 #include "clang/AST/ExprCXX.h"
+#include "clang/AST/RecordLayout.h"
 #include "clang/Basic/ABI.h"
 #include "clang/Basic/DiagnosticOptions.h"
 
@@ -808,10 +809,41 @@ MicrosoftCXXNameMangler::mangleTemplateArgs(
     case TemplateArgument::Expression:
       mangleExpression(TA.getAsExpr());
       break;
+    case TemplateArgument::Declaration: {
+      ValueDecl *D = TA.getAsDecl();
+      if (TA.isDeclForReferenceParam()) {
+        // Reference.
+        mangle(D, "$E?");
+      } else if (const FieldDecl *FD = dyn_cast<FieldDecl>(D)) {
+        // Pointer to data member.
+        // Mangle as an offset to that data member.
+        const RecordDecl *RD = FD->getParent();
+        const ASTRecordLayout &RL = getASTContext().getASTRecordLayout(RD);
+        uint64_t FieldOffsetInBits = RL.getFieldOffset(FD->getFieldIndex());
+        llvm::APSInt Value(/*BitWidth=*/64, /*isUnsigned=*/false);
+        Value = FieldOffsetInBits / getASTContext().getCharWidth();
+        mangleIntegerLiteral(Value, /*isBoolean=*/false);
+      } else {
+        // Pointer or pointer to member function.
+        mangle(D, "$1?");
+      }
+      break;
+    }
+    case TemplateArgument::NullPtr: {
+      llvm::APSInt Value(/*BitWidth=*/64, /*isUnsigned=*/false);
+      QualType T = TA.getNullPtrType();
+      if (T->isMemberDataPointerType()) {
+        // Null pointer to data member.
+        // Mangle as -1 (as 0 is a valid data member offset).
+        Value = -1;
+      } else {
+        Value = 0;
+      }
+      mangleIntegerLiteral(Value, /*isBoolean=*/false);
+      break;
+    }
     case TemplateArgument::Template:
     case TemplateArgument::TemplateExpansion:
-    case TemplateArgument::Declaration:
-    case TemplateArgument::NullPtr:
     case TemplateArgument::Pack: {
       // Issue a diagnostic.
       DiagnosticsEngine &Diags = Context.getDiags();
diff --git a/test/CodeGenCXX/mangle-ms-templates-cxx11.cpp b/test/CodeGenCXX/mangle-ms-templates-cxx11.cpp
new file mode 100644
index 0000000..79b6984
--- /dev/null
+++ b/test/CodeGenCXX/mangle-ms-templates-cxx11.cpp
@@ -0,0 +1,46 @@
+// RUN: %clang_cc1 -std=c++11 -fms-extensions -emit-llvm %s -o - -cxx-abi microsoft -triple=i386-pc-win32 | FileCheck %s
+// TODO: Clang does not accept expression template argument value NULL/nullptr
+// in non-c++11 mode. If fixed, merge this test with mangle-ms-templates.cpp.
+
+struct S {
+  int x;
+  int foo(int);
+};
+
+template<S* ptr>
+class PtrExprTemplate {
+  public:
+    PtrExprTemplate();
+};
+
+template<int (*func)(int)>
+class FuncPtrExprTemplate {
+  public:
+    FuncPtrExprTemplate();
+};
+
+template<int S::* ptr>
+class DataMemberPtrExprTemplate {
+  public:
+    DataMemberPtrExprTemplate();
+};
+
+template<int (S::*func)(int)>
+class MemberFuncPtrExprTemplate {
+  public:
+    MemberFuncPtrExprTemplate();
+};
+
+void expr_template_argument_mangling() {
+  PtrExprTemplate<nullptr> p0;
+// CHECK: call {{.*}} @"\01??0?$PtrExprTemplate@$0A@@@QAE@XZ"
+
+  FuncPtrExprTemplate<nullptr> fp0;
+// CHECK: call {{.*}} @"\01??0?$FuncPtrExprTemplate@$0A@@@QAE@XZ"
+
+  DataMemberPtrExprTemplate<nullptr> mp0;
+// CHECK: call {{.*}} @"\01??0?$DataMemberPtrExprTemplate@$0?0@@QAE@XZ"
+
+  MemberFuncPtrExprTemplate<nullptr> mfp0;
+// CHECK: call {{.*}} @"\01??0?$MemberFuncPtrExprTemplate@$0A@@@QAE@XZ"
+}
diff --git a/test/CodeGenCXX/mangle-ms-templates.cpp b/test/CodeGenCXX/mangle-ms-templates.cpp
index e16fe93..f104d5e 100644
--- a/test/CodeGenCXX/mangle-ms-templates.cpp
+++ b/test/CodeGenCXX/mangle-ms-templates.cpp
@@ -70,6 +70,70 @@ void template_mangling() {
 // CHECK: call {{.*}} @"\01??0?$IntTemplate@$0PPPP@@@QAE@XZ"
 }
 
+struct S {
+  int x;  // offset 0
+  int y;  // 1-byte offset
+  int padding[256];
+  int z;  // 2-bytes offset
+  int foo(int);
+};
+
+S s;
+int bar(int);
+
+template<S* ptr>
+class PtrExprTemplate {
+  public:
+    PtrExprTemplate();
+};
+
+template<S& ref>
+class RefExprTemplate {
+  public:
+    RefExprTemplate();
+};
+
+template<int (*func)(int)>
+class FuncPtrExprTemplate {
+  public:
+    FuncPtrExprTemplate();
+};
+
+template<int S::* ptr>
+class DataMemberPtrExprTemplate {
+  public:
+    DataMemberPtrExprTemplate();
+};
+
+template<int (S::*func)(int)>
+class MemberFuncPtrExprTemplate {
+  public:
+    MemberFuncPtrExprTemplate();
+};
+
+void expr_template_argument_mangling() {
+  PtrExprTemplate<&s> p1;
+// CHECK: call {{.*}} @"\01??0?$PtrExprTemplate@$1?s@@3US@@A@@QAE@XZ"
+
+  RefExprTemplate<s> r1;
+// CHECK: call {{.*}} @"\01??0?$RefExprTemplate@$E?s@@3US@@A@@QAE@XZ"
+
+  FuncPtrExprTemplate<bar> fp1;
+// CHECK: call {{.*}} @"\01??0?$FuncPtrExprTemplate@$1?bar@@YAHH@Z@@QAE@XZ"
+
+  DataMemberPtrExprTemplate<&S::x> mp1;
+// CHECK: call {{.*}} @"\01??0?$DataMemberPtrExprTemplate@$0A@@@QAE@XZ"
+
+  DataMemberPtrExprTemplate<&S::y> mp2;
+// CHECK: call {{.*}} @"\01??0?$DataMemberPtrExprTemplate@$03@@QAE@XZ"
+
+  DataMemberPtrExprTemplate<&S::z> mp3;
+// CHECK: call {{.*}} @"\01??0?$DataMemberPtrExprTemplate@$0EAI@@@QAE@XZ"
+
+  MemberFuncPtrExprTemplate<&S::foo> mfp1;
+// CHECK: call {{.*}} @"\01??0?$MemberFuncPtrExprTemplate@$1?foo@S@@QAEHH@Z@@QAE@XZ"
+}
+
 namespace space {
   template<class T> const T& foo(const T& l) { return l; }
 }
