Fix Libc++ build with MinGW64

Summary: This patch corrects the build errors I encountered when building on MinGW64.

Reviewers: mati865, rnk, compnerd, smeenai, bcraig

Reviewed By: mati865, smeenai

Subscribers: martell, chapuni, cfe-commits

Differential Revision: https://reviews.llvm.org/D33082

llvm-svn: 304360
Cr-Mirrored-From: sso://chromium.googlesource.com/_direct/external/github.com/llvm/llvm-project
Cr-Mirrored-Commit: 1ec026252b3027f06c8a561d93fc0a3801107bba
diff --git a/src/chrono.cpp b/src/chrono.cpp
index 9b277a6..d0e184a 100644
--- a/src/chrono.cpp
+++ b/src/chrono.cpp
@@ -37,7 +37,7 @@
 #if defined(_LIBCPP_WIN32API)
 #define WIN32_LEAN_AND_MEAN
 #define VC_EXTRA_LEAN
-#include <Windows.h>
+#include <windows.h>
 #if _WIN32_WINNT >= _WIN32_WINNT_WIN8
 #include <winapifamily.h>
 #endif
diff --git a/src/new.cpp b/src/new.cpp
index 21b3074..2b2682f 100644
--- a/src/new.cpp
+++ b/src/new.cpp
@@ -183,7 +183,7 @@
     if (static_cast<size_t>(alignment) < sizeof(void*))
       alignment = std::align_val_t(sizeof(void*));
     void* p;
-#if defined(_LIBCPP_MSVCRT)
+#if defined(_LIBCPP_MSVCRT_LIKE)
     while ((p = _aligned_malloc(size, static_cast<size_t>(alignment))) == nullptr)
 #else
     while (::posix_memalign(&p, static_cast<size_t>(alignment), size) != 0)
@@ -256,7 +256,7 @@
 operator delete(void* ptr, std::align_val_t) _NOEXCEPT
 {
     if (ptr)
-#if defined(_LIBCPP_MSVCRT)
+#if defined(_LIBCPP_MSVCRT_LIKE)
         ::_aligned_free(ptr);
 #else
         ::free(ptr);
diff --git a/src/support/win32/locale_win32.cpp b/src/support/win32/locale_win32.cpp
index 28cb449..13a6eae 100644
--- a/src/support/win32/locale_win32.cpp
+++ b/src/support/win32/locale_win32.cpp
@@ -34,6 +34,18 @@
     // uselocale returns the old locale_t
     return old_locale;
 }
+
+decltype(MB_CUR_MAX) MB_CUR_MAX_L( locale_t __l )
+{
+#if defined(_LIBCPP_MSVCRT)
+  return ___mb_cur_max_l_func(__l);
+#else
+  __libcpp_locale_guard __current(__l);
+  return MB_CUR_MAX;
+#endif
+}
+
+
 lconv *localeconv_l( locale_t loc )
 {
     __libcpp_locale_guard __current(loc);
@@ -109,3 +121,15 @@
     __libcpp_locale_guard __current(loc);
     return vasprintf( ret, format, ap );
 }
+
+#if !defined(_LIBCPP_MSVCRT)
+float strtof_l(const char* nptr, char** endptr, locale_t loc) {
+  __libcpp_locale_guard __current(loc);
+  return strtof(nptr, endptr);
+}
+
+long double strtold_l(const char* nptr, char** endptr, locale_t loc) {
+  __libcpp_locale_guard __current(loc);
+  return strtold(nptr, endptr);
+}
+#endif
diff --git a/src/support/win32/support.cpp b/src/support/win32/support.cpp
index e989681..dbd1c4c 100644
--- a/src/support/win32/support.cpp
+++ b/src/support/win32/support.cpp
@@ -15,17 +15,6 @@
 #include <cstring> // strcpy, wcsncpy
 #include <cwchar>  // mbstate_t
 
-// Some of these functions aren't standard or if they conform, the name does not.
-
-int asprintf(char **sptr, const char *__restrict format, ...)
-{
-    va_list ap;
-    va_start(ap, format);
-    int result;
-    result = vasprintf(sptr, format, ap);
-    va_end(ap);
-    return result;
-}
 
 // Like sprintf, but when return value >= 0 it returns
 // a pointer to a malloc'd string in *sptr.
diff --git a/src/system_error.cpp b/src/system_error.cpp
index cbbbb5d..17f2c9a 100644
--- a/src/system_error.cpp
+++ b/src/system_error.cpp
@@ -65,7 +65,7 @@
 
 string do_strerror_r(int ev);
 
-#if defined(_LIBCPP_MSVCRT)
+#if defined(_LIBCPP_MSVCRT_LIKE)
 string do_strerror_r(int ev) {
   char buffer[strerror_buff_size];
   if (::strerror_s(buffer, strerror_buff_size, ev) == 0)
diff --git a/src/thread.cpp b/src/thread.cpp
index 412a8fa..550da8e 100644
--- a/src/thread.cpp
+++ b/src/thread.cpp
@@ -34,7 +34,7 @@
 
 #if defined(_LIBCPP_WIN32API)
 #include <windows.h>
-#endif // defined(_LIBCPP_WIN32API)
+#endif
 
 _LIBCPP_BEGIN_NAMESPACE_STD