
This patch implements the forwarding to frozen C++03 headers as discussed in https://discourse.llvm.org/t/rfc-freezing-c-03-headers-in-libc. In the RFC, we initially proposed selecting the right headers from the Clang driver, however consensus seemed to steer towards handling this in the library itself. This patch implements that direction. At a high level, the changes basically amount to making each public header look like this: ``` // inside <vector> #ifdef _LIBCPP_CXX03_LANG # include <__cxx03/vector> #else // normal <vector> content #endif ``` In most cases, public headers are simple umbrella headers so there isn't much code in the #else branch. In other cases, the #else branch contains the actual implementation of the header.
95 lines
2.6 KiB
C++
95 lines
2.6 KiB
C++
// -*- 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef _LIBCPP_WCTYPE_H
|
|
#define _LIBCPP_WCTYPE_H
|
|
|
|
/*
|
|
wctype.h synopsis
|
|
|
|
Macros:
|
|
|
|
WEOF
|
|
|
|
Types:
|
|
|
|
wint_t
|
|
wctrans_t
|
|
wctype_t
|
|
|
|
int iswalnum(wint_t wc);
|
|
int iswalpha(wint_t wc);
|
|
int iswblank(wint_t wc); // C99
|
|
int iswcntrl(wint_t wc);
|
|
int iswdigit(wint_t wc);
|
|
int iswgraph(wint_t wc);
|
|
int iswlower(wint_t wc);
|
|
int iswprint(wint_t wc);
|
|
int iswpunct(wint_t wc);
|
|
int iswspace(wint_t wc);
|
|
int iswupper(wint_t wc);
|
|
int iswxdigit(wint_t wc);
|
|
int iswctype(wint_t wc, wctype_t desc);
|
|
wctype_t wctype(const char* property);
|
|
wint_t towlower(wint_t wc);
|
|
wint_t towupper(wint_t wc);
|
|
wint_t towctrans(wint_t wc, wctrans_t desc);
|
|
wctrans_t wctrans(const char* property);
|
|
|
|
*/
|
|
|
|
#if defined(__cplusplus) && __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)
|
|
# include <__cxx03/wctype.h>
|
|
#else
|
|
# include <__config>
|
|
|
|
# if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
|
# pragma GCC system_header
|
|
# endif
|
|
|
|
// TODO:
|
|
// In the future, we should unconditionally include_next <wctype.h> here and instead
|
|
// have a mode under which the library does not need libc++'s <wctype.h> or <cwctype>
|
|
// at all (i.e. a mode without wchar_t). As it stands, we need to do that to completely
|
|
// bypass the using declarations in <cwctype> when we did not include <wctype.h>.
|
|
// Otherwise, a using declaration like `using ::wint_t` in <cwctype> will refer to
|
|
// nothing (with using_if_exists), and if we include another header that defines one
|
|
// of these declarations (e.g. <wchar.h>), the second `using ::wint_t` with using_if_exists
|
|
// will fail because it does not refer to the same declaration.
|
|
# if __has_include_next(<wctype.h>)
|
|
# include_next <wctype.h>
|
|
# define _LIBCPP_INCLUDED_C_LIBRARY_WCTYPE_H
|
|
# endif
|
|
|
|
# ifdef __cplusplus
|
|
|
|
# undef iswalnum
|
|
# undef iswalpha
|
|
# undef iswblank
|
|
# undef iswcntrl
|
|
# undef iswdigit
|
|
# undef iswgraph
|
|
# undef iswlower
|
|
# undef iswprint
|
|
# undef iswpunct
|
|
# undef iswspace
|
|
# undef iswupper
|
|
# undef iswxdigit
|
|
# undef iswctype
|
|
# undef wctype
|
|
# undef towlower
|
|
# undef towupper
|
|
# undef towctrans
|
|
# undef wctrans
|
|
|
|
# endif // __cplusplus
|
|
#endif // defined(__cplusplus) && __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)
|
|
|
|
#endif // _LIBCPP_WCTYPE_H
|