Ed Schouten 0a92402436 Remove mblen(), mbtowc() and wctomb() from the thread-unsafe functions.
Back in r240527 I added a knob to prevent thread-unsafe functions from
being exposed. mblen(), mbtowc() and wctomb() were also added to this
list, as the latest issue of POSIX doesn't require these functions to be
thread-safe.

It turns out that the only circumstance in which these functions are not
thread-safe is in case they are used in combination with state-dependent
character sets (e.g., Shift-JIS). According to Austin Group Bug 708,
these character sets "[...] are mostly a relic of the past and which
were never supported on most POSIX systems".

Though in many cases the use of these functions can be prevented by
using the reentrant counterparts, they are the only functions that allow
you to query whether the locale's character set is state-dependent. This
means that omitting these functions removes actual functionality.

Let's be a bit less pedantic and drop the guards around these functions.

Links:
http://austingroupbugs.net/view.php?id=708
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2037.htm

Reviewed by:	ericwf
Differential Revision:	https://reviews.llvm.org/D21436

llvm-svn: 290748
2016-12-30 10:44:00 +00:00

113 lines
4.2 KiB
C++

//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// test <stdlib.h>
#include <stdlib.h>
#include <type_traits>
// As of 1/10/2015 clang emits a -Wnonnull warnings even if the warning occurs
// in an unevaluated context. For this reason we manually suppress the warning.
#if defined(__clang__)
#pragma clang diagnostic ignored "-Wnonnull"
#endif
#ifdef abs
#error abs is defined
#endif
#ifdef labs
#error labs is defined
#endif
#ifdef llabs
#error llabs is defined
#endif
#ifdef div
#error div is defined
#endif
#ifdef ldiv
#error ldiv is defined
#endif
#ifdef lldiv
#error lldiv is defined
#endif
#ifndef EXIT_FAILURE
#error EXIT_FAILURE not defined
#endif
#ifndef EXIT_SUCCESS
#error EXIT_SUCCESS not defined
#endif
#ifndef MB_CUR_MAX
#error MB_CUR_MAX not defined
#endif
#ifndef NULL
#error NULL not defined
#endif
#ifndef RAND_MAX
#error RAND_MAX not defined
#endif
int main()
{
size_t s = 0; ((void)s);
div_t d; ((void)d);
ldiv_t ld; ((void)ld);
lldiv_t lld; ((void)lld);
char** endptr = 0;
static_assert((std::is_same<decltype(atof("")), double>::value), "");
static_assert((std::is_same<decltype(atoi("")), int>::value), "");
static_assert((std::is_same<decltype(atol("")), long>::value), "");
static_assert((std::is_same<decltype(atoll("")), long long>::value), "");
static_assert((std::is_same<decltype(getenv("")), char*>::value), "");
static_assert((std::is_same<decltype(strtod("", endptr)), double>::value), "");
static_assert((std::is_same<decltype(strtof("", endptr)), float>::value), "");
static_assert((std::is_same<decltype(strtold("", endptr)), long double>::value), "");
static_assert((std::is_same<decltype(strtol("", endptr,0)), long>::value), "");
static_assert((std::is_same<decltype(strtoll("", endptr,0)), long long>::value), "");
static_assert((std::is_same<decltype(strtoul("", endptr,0)), unsigned long>::value), "");
static_assert((std::is_same<decltype(strtoull("", endptr,0)), unsigned long long>::value), "");
static_assert((std::is_same<decltype(rand()), int>::value), "");
static_assert((std::is_same<decltype(srand(0)), void>::value), "");
static_assert((std::is_same<decltype(calloc(0,0)), void*>::value), "");
static_assert((std::is_same<decltype(free(0)), void>::value), "");
static_assert((std::is_same<decltype(malloc(0)), void*>::value), "");
static_assert((std::is_same<decltype(realloc(0,0)), void*>::value), "");
static_assert((std::is_same<decltype(abort()), void>::value), "");
static_assert((std::is_same<decltype(atexit(0)), int>::value), "");
static_assert((std::is_same<decltype(exit(0)), void>::value), "");
static_assert((std::is_same<decltype(_Exit(0)), void>::value), "");
static_assert((std::is_same<decltype(getenv("")), char*>::value), "");
static_assert((std::is_same<decltype(system("")), int>::value), "");
static_assert((std::is_same<decltype(bsearch(0,0,0,0,0)), void*>::value), "");
static_assert((std::is_same<decltype(qsort(0,0,0,0)), void>::value), "");
static_assert((std::is_same<decltype(abs(0)), int>::value), "");
static_assert((std::is_same<decltype(labs((long)0)), long>::value), "");
static_assert((std::is_same<decltype(llabs((long long)0)), long long>::value), "");
static_assert((std::is_same<decltype(div(0,0)), div_t>::value), "");
static_assert((std::is_same<decltype(ldiv(0L,0L)), ldiv_t>::value), "");
static_assert((std::is_same<decltype(lldiv(0LL,0LL)), lldiv_t>::value), "");
wchar_t* pw = 0;
const wchar_t* pwc = 0;
char* pc = 0;
static_assert((std::is_same<decltype(mblen("",0)), int>::value), "");
static_assert((std::is_same<decltype(mbtowc(pw,"",0)), int>::value), "");
static_assert((std::is_same<decltype(wctomb(pc,L' ')), int>::value), "");
static_assert((std::is_same<decltype(mbstowcs(pw,"",0)), size_t>::value), "");
static_assert((std::is_same<decltype(wcstombs(pc,pwc,0)), size_t>::value), "");
}