diff --git a/include/clang/Basic/TokenKinds.def b/include/clang/Basic/TokenKinds.def
index bcf0f31..0dbff81 100644
--- a/include/clang/Basic/TokenKinds.def
+++ b/include/clang/Basic/TokenKinds.def
@@ -524,6 +524,7 @@ KEYWORD(__interface                   , KEYMS)
 ALIAS("__int8"           , char       , KEYMS)
 ALIAS("__int16"          , short      , KEYMS)
 ALIAS("__int32"          , int        , KEYMS)
+ALIAS("__wchar_t"        , wchar_t    , KEYMS)
 ALIAS("_asm"             , asm        , KEYMS)
 ALIAS("_alignof"         , __alignof  , KEYMS)
 ALIAS("__builtin_alignof", __alignof  , KEYMS)
diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp
index f962245..9d53894 100644
--- a/lib/AST/ASTContext.cpp
+++ b/lib/AST/ASTContext.cpp
@@ -850,7 +850,8 @@ void ASTContext::InitBuiltinTypes(const TargetInfo &Target) {
   InitBuiltinType(Int128Ty,            BuiltinType::Int128);
   InitBuiltinType(UnsignedInt128Ty,    BuiltinType::UInt128);
 
-  if (LangOpts.CPlusPlus && LangOpts.WChar) { // C++ 3.9.1p5
+  if ((LangOpts.CPlusPlus && LangOpts.WChar) || LangOpts.MicrosoftExt) {
+    // C++ 3.9.1p5
     if (TargetInfo::isTypeSigned(Target.getWCharType()))
       InitBuiltinType(WCharTy,           BuiltinType::WChar_S);
     else  // -fshort-wchar makes wchar_t be unsigned.
diff --git a/test/Lexer/ms-extensions.c b/test/Lexer/ms-extensions.c
index 377d2d5..3535aee 100644
--- a/test/Lexer/ms-extensions.c
+++ b/test/Lexer/ms-extensions.c
@@ -1,5 +1,5 @@
-// RUN: %clang_cc1 -fsyntax-only -verify -fms-extensions %s
-// RUN: %clang_cc1 -fsyntax-only -verify -fms-compatibility %s
+// RUN: %clang_cc1 -fsyntax-only -verify -fms-extensions -triple x86_64-pc-linux-gnu %s
+// RUN: %clang_cc1 -fsyntax-only -verify -fms-compatibility -triple x86_64-pc-linux-gnu %s
 
 __int8 x1  = 3i8;
 __int16 x2 = 4i16;
@@ -41,3 +41,13 @@ x1234e+1;
 x1234e+1;                      
 }
 
+// pr15815
+// The wchar_t type is not available in C.
+wchar_t c1 = L'a'; // expected-error{{unknown type name 'wchar_t'}}
+
+// __wchar_t is available as an MS extension.
+__wchar_t c2 = L'a'; // No error.
+
+// __wchar_t is a builtin type, distinct from e.g. int.
+void f(__wchar_t x); // expected-note {{previous declaration is here}}
+void f(int x); // expected-error {{conflicting types for 'f'}}
diff --git a/test/Lexer/ms-extensions.cpp b/test/Lexer/ms-extensions.cpp
index 7e18a6c..e9a3c51 100644
--- a/test/Lexer/ms-extensions.cpp
+++ b/test/Lexer/ms-extensions.cpp
@@ -4,3 +4,10 @@
 const char * f() {
   return "foo"bar("bar")"baz";    /*expected-warning {{identifier after literal will be treated as a reserved user-defined literal suffix in C++11}} */
 }
+
+// pr15815
+// __wchar_t is available as an MS extension.
+void foo(__wchar_t x) { } // expected-note {{previous definition is here}}
+
+// __wchar_t and wchar_t are the same type in C++.
+void foo(wchar_t y) { } // expected-error {{redefinition of 'foo'}} (Because __wchar_t and wchar_t are the same type.)
