diff options
author | Ed Schouten <ed@nuxi.nl> | 2015-06-24 08:44:38 +0000 |
---|---|---|
committer | Ed Schouten <ed@nuxi.nl> | 2015-06-24 08:44:38 +0000 |
commit | e0cf3b9a3ca8d80d313d1e2e5b8c70d73d10e933 (patch) | |
tree | 9141a10ef3fbd7899b821275956fda61b01da73d /libcxx/test/std/language.support/support.runtime | |
parent | aa315fbb4c18b0bfcd54658f3f5b67600f097f8c (diff) | |
download | bcm5719-llvm-e0cf3b9a3ca8d80d313d1e2e5b8c70d73d10e933.tar.gz bcm5719-llvm-e0cf3b9a3ca8d80d313d1e2e5b8c70d73d10e933.zip |
Make support for thread-unsafe C functions optional.
One of the aspects of CloudABI is that it aims to help you write code
that is thread-safe out of the box. This is very important if you want
to write libraries that are easy to reuse. For CloudABI we decided to
not provide the thread-unsafe functions. So far this is working out
pretty well, as thread-unsafety issues are detected really early on.
The following patch adds a knob to libc++,
_LIBCPP_HAS_NO_THREAD_UNSAFE_C_FUNCTIONS, that can be set to disable
thread-unsafe functions that can easily be avoided in practice. The
following functions are not thread-safe:
- <clocale>: locale handles should be preferred over setlocale().
- <cstdlib>: mbrlen(), mbrtowc() and wcrtomb() should be preferred over
their non-restartable counterparts.
- <ctime>: asctime(), ctime(), gmtime() and localtime() are not
thread-safe. The first two are also deprecated by POSIX.
Differential Revision: http://reviews.llvm.org/D8703
Reviewed by: marshall
llvm-svn: 240527
Diffstat (limited to 'libcxx/test/std/language.support/support.runtime')
-rw-r--r-- | libcxx/test/std/language.support/support.runtime/cstdlib.pass.cpp | 4 | ||||
-rw-r--r-- | libcxx/test/std/language.support/support.runtime/ctime.pass.cpp | 2 |
2 files changed, 5 insertions, 1 deletions
diff --git a/libcxx/test/std/language.support/support.runtime/cstdlib.pass.cpp b/libcxx/test/std/language.support/support.runtime/cstdlib.pass.cpp index e14e70e34e4..073949122b0 100644 --- a/libcxx/test/std/language.support/support.runtime/cstdlib.pass.cpp +++ b/libcxx/test/std/language.support/support.runtime/cstdlib.pass.cpp @@ -75,12 +75,14 @@ int main() static_assert((std::is_same<decltype(std::div(0LL,0LL)), std::lldiv_t>::value), ""); static_assert((std::is_same<decltype(std::ldiv(0L,0L)), std::ldiv_t>::value), ""); static_assert((std::is_same<decltype(std::lldiv(0LL,0LL)), std::lldiv_t>::value), ""); - static_assert((std::is_same<decltype(std::mblen("",0)), int>::value), ""); wchar_t* pw = 0; const wchar_t* pwc = 0; char* pc = 0; +#ifndef _LIBCPP_HAS_NO_THREAD_UNSAFE_C_FUNCTIONS + static_assert((std::is_same<decltype(std::mblen("",0)), int>::value), ""); static_assert((std::is_same<decltype(std::mbtowc(pw,"",0)), int>::value), ""); static_assert((std::is_same<decltype(std::wctomb(pc,L' ')), int>::value), ""); +#endif static_assert((std::is_same<decltype(std::mbstowcs(pw,"",0)), std::size_t>::value), ""); static_assert((std::is_same<decltype(std::wcstombs(pc,pwc,0)), std::size_t>::value), ""); } diff --git a/libcxx/test/std/language.support/support.runtime/ctime.pass.cpp b/libcxx/test/std/language.support/support.runtime/ctime.pass.cpp index 495d6eb2c66..8c5d2811d8a 100644 --- a/libcxx/test/std/language.support/support.runtime/ctime.pass.cpp +++ b/libcxx/test/std/language.support/support.runtime/ctime.pass.cpp @@ -30,10 +30,12 @@ int main() static_assert((std::is_same<decltype(std::difftime(t,t)), double>::value), ""); static_assert((std::is_same<decltype(std::mktime(&tm)), std::time_t>::value), ""); static_assert((std::is_same<decltype(std::time(&t)), std::time_t>::value), ""); +#ifndef _LIBCPP_HAS_NO_THREAD_UNSAFE_C_FUNCTIONS static_assert((std::is_same<decltype(std::asctime(&tm)), char*>::value), ""); static_assert((std::is_same<decltype(std::ctime(&t)), char*>::value), ""); static_assert((std::is_same<decltype(std::gmtime(&t)), std::tm*>::value), ""); static_assert((std::is_same<decltype(std::localtime(&t)), std::tm*>::value), ""); +#endif char* c1 = 0; const char* c2 = 0; static_assert((std::is_same<decltype(std::strftime(c1,s,c2,&tm)), std::size_t>::value), ""); |