[PATCH] D24374: [libc++] Avoid <memory> include in locale_win32.h
Shoaib Meenai via cfe-commits
cfe-commits at lists.llvm.org
Thu Sep 8 21:38:17 PDT 2016
smeenai created this revision.
smeenai added reviewers: compnerd, EricWF, mclow.lists.
smeenai added a subscriber: cfe-commits.
When `_LIBCPP_NO_EXCEPTIONS` is defined, we end up with compile errors
when targeting MSVCRT:
* Code includes `<new>`
* `<new>` includes `<cstdlib>` in order to get `abort`
* `<cstdlib>` includes `<stdlib.h>`, _before_ the `using ::abort`
* `<stdlib.h>` includes `locale_win32.h`
* `locale_win32.h` includes `<memory>`
* `<memory>` includes `<stdexcept>`
* `<stdexcept>` includes `<cstdlib` for `abort`, but that inclusion gets
(correctly) ignored because of header guards
* `<stdexcept>` references `_VSTD::abort`, which isn't declared
The easiest solution is to make `locale_win32.h` not include `<memory>`,
by removing the use of `unique_ptr` and manually restoring the locale
instead.
https://reviews.llvm.org/D24374
Files:
include/support/win32/locale_win32.h
Index: include/support/win32/locale_win32.h
===================================================================
--- include/support/win32/locale_win32.h
+++ include/support/win32/locale_win32.h
@@ -17,7 +17,6 @@
#include "support/win32/support.h"
#include "support/win32/locale_mgmt_win32.h"
#include <stdio.h>
-#include <memory>
lconv *localeconv_l( locale_t loc );
size_t mbrlen_l( const char *__restrict s, size_t n,
@@ -34,13 +33,13 @@
size_t nwc, size_t len, mbstate_t *__restrict ps, locale_t loc);
wint_t btowc_l( int c, locale_t loc );
int wctob_l( wint_t c, locale_t loc );
-typedef _VSTD::remove_pointer<locale_t>::type __locale_struct;
-typedef _VSTD::unique_ptr<__locale_struct, decltype(&uselocale)> __locale_raii;
inline _LIBCPP_ALWAYS_INLINE
decltype(MB_CUR_MAX) MB_CUR_MAX_L( locale_t __l )
{
- __locale_raii __current( uselocale(__l), uselocale );
- return MB_CUR_MAX;
+ locale_t prev_locale = uselocale(__l);
+ auto cur_max = MB_CUR_MAX;
+ uselocale(prev_locale);
+ return cur_max;
}
// the *_l functions are prefixed on Windows, only available for msvcr80+, VS2005+
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D24374.70781.patch
Type: text/x-patch
Size: 1129 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160909/23cac3a2/attachment.bin>
More information about the cfe-commits
mailing list