From 8bcade547a7be1aa81e9ed2c81b3e120d6a620bb Mon Sep 17 00:00:00 2001 From: Saleem Abdulrasool Date: Mon, 2 Jan 2017 18:41:48 +0000 Subject: [PATCH] locale: update ctype access for MSVC CRT 14+ Visual C++ 14 and newer split msvcrt into msvcrt and ucrt with flavours of the ucrt for different environments. This changed the access to the ctype table by introducing the `__pctype_func` and `__pwctype_func` accessors. Use this rather than directly accessing `_ctype` which allows us to be safer in threaded situations by going through the libc locking. llvm-svn: 290823 --- libcxx/include/support/win32/locale_win32.h | 6 +++++- libcxx/src/locale.cpp | 11 +++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/libcxx/include/support/win32/locale_win32.h b/libcxx/include/support/win32/locale_win32.h index 0f5527e570ab..ebf5bda740a5 100644 --- a/libcxx/include/support/win32/locale_win32.h +++ b/libcxx/include/support/win32/locale_win32.h @@ -11,8 +11,12 @@ #ifndef _LIBCPP_SUPPORT_WIN32_LOCALE_WIN32_H #define _LIBCPP_SUPPORT_WIN32_LOCALE_WIN32_H +#include + +#if _VC_CRT_MAJOR_VERSION < 14 // ctype mask table defined in msvcrt.dll -extern "C" unsigned short __declspec(dllimport) _ctype[]; +extern "C" unsigned short __declspec(dllimport) _ctype[]; +#endif #include "support/win32/support.h" #include "support/win32/locale_mgmt_win32.h" diff --git a/libcxx/src/locale.cpp b/libcxx/src/locale.cpp index 5d6ccd5fb02e..5c7fa08aa5b6 100644 --- a/libcxx/src/locale.cpp +++ b/libcxx/src/locale.cpp @@ -24,6 +24,9 @@ #endif #include "clocale" #include "cstring" +#if defined(_LIBCPP_MSVCRT) +#define _CTYPE_DISABLE_MACROS +#endif #include "cwctype" #include "__sso_allocator" #if defined(_LIBCPP_MSVCRT) || defined(__MINGW32__) @@ -1108,9 +1111,13 @@ ctype::classic_table() _NOEXCEPT #elif __sun__ return __ctype_mask; #elif defined(_LIBCPP_MSVCRT) || defined(__MINGW32__) +#if _VC_CRT_MAJOR_VERSION < 14 + // This is assumed to be safe, which is a nonsense assumption because we're + // going to end up dereferencing it later... return _ctype+1; // internal ctype mask table defined in msvcrt.dll -// This is assumed to be safe, which is a nonsense assumption because we're -// going to end up dereferencing it later... +#else + return __pctype_func(); +#endif #elif defined(__EMSCRIPTEN__) return *__ctype_b_loc(); #elif defined(_NEWLIB_VERSION)