When support for declaring the c8rtomb() and mbrtoc8() functions within the std namespace was added in commit 7e7013c5d4b1b3996c8dba668c5a94bb33b2999b, internal glibc macros were used to determine if C2X extensions are enabled. Specifically, a check for whether `__GLIBC_USE` is defined and whether `__GLIBC_USE(ISOC2X)` is non-0 was added. `__GLIBC_USE` is an internal detail of the glibc implementation that may be changed or removed in the future potentially leading to inconsistency or compilation failures. This change removes the use of the internal glibc macro to avoid such problems. Unfortunately, without another mechanism to determine if C2X extensions are enabled, this removal will result in inconsistent declarations of the c8rtomb() and mbrtoc8() functions; when C++ char8_t support is not enabled, but C2X extensions are, these functions will be declared in the global namespace but not in the std namespace. This situation will improve when C23 support is finalized and the check can be re-implemented using `__STDC_VERSION__`.
38 lines
1.5 KiB
C++
38 lines
1.5 KiB
C++
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
// UNSUPPORTED: c++03
|
|
|
|
// The system-provided <uchar.h> seems to be broken on AIX:
|
|
// error: 'error' diagnostics seen but not expected:
|
|
// File /usr/include/uchar.h Line 38: cannot combine with previous 'type-name' declaration specifier
|
|
// File /usr/include/uchar.h Line 39: cannot combine with previous 'type-name' declaration specifier
|
|
// 2 errors generated.
|
|
// XFAIL: LIBCXX-AIX-FIXME
|
|
|
|
#include <uchar.h>
|
|
|
|
#include "test_macros.h"
|
|
|
|
// When C++ char8_t support is not enabled, definitions of these functions that
|
|
// match the C2X declarations may still be present in the global namespace with
|
|
// a char8_t typedef substituted for the C++ char8_t type. If so, these are not
|
|
// the declarations we are looking for, so don't test for them.
|
|
#if !defined(TEST_HAS_NO_CHAR8_T)
|
|
using U = decltype(::c8rtomb);
|
|
using V = decltype(::mbrtoc8);
|
|
# if defined(_LIBCPP_HAS_NO_C8RTOMB_MBRTOC8)
|
|
// expected-error@-3 {{no member named 'c8rtomb' in the global namespace}}
|
|
// expected-error@-3 {{no member named 'mbrtoc8' in the global namespace}}
|
|
# else
|
|
// expected-no-diagnostics
|
|
# endif
|
|
#else
|
|
// expected-no-diagnostics
|
|
#endif
|