mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-25 15:46:06 +00:00

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.
73 lines
2.1 KiB
C++
73 lines
2.1 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_COROUTINE
|
|
#define _LIBCPP_COROUTINE
|
|
|
|
/**
|
|
coroutine synopsis
|
|
|
|
namespace std {
|
|
// [coroutine.traits]
|
|
template <class R, class... ArgTypes>
|
|
struct coroutine_traits;
|
|
// [coroutine.handle]
|
|
template <class Promise = void>
|
|
struct coroutine_handle;
|
|
// [coroutine.handle.compare]
|
|
constexpr bool operator==(coroutine_handle<> x, coroutine_handle<> y) noexcept;
|
|
constexpr strong_ordering operator<=>(coroutine_handle<> x, coroutine_handle<> y) noexcept;
|
|
// [coroutine.handle.hash]
|
|
template <class T> struct hash;
|
|
template <class P> struct hash<coroutine_handle<P>>;
|
|
// [coroutine.noop]
|
|
struct noop_coroutine_promise;
|
|
template<> struct coroutine_handle<noop_coroutine_promise>;
|
|
using noop_coroutine_handle = coroutine_handle<noop_coroutine_promise>;
|
|
noop_coroutine_handle noop_coroutine() noexcept;
|
|
// [coroutine.trivial.awaitables]
|
|
struct suspend_never;
|
|
struct suspend_always;
|
|
} // namespace std
|
|
|
|
*/
|
|
|
|
#if __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)
|
|
# include <__cxx03/coroutine>
|
|
#else
|
|
# include <__config>
|
|
|
|
# if _LIBCPP_STD_VER >= 20
|
|
# include <__coroutine/coroutine_handle.h>
|
|
# include <__coroutine/coroutine_traits.h>
|
|
# include <__coroutine/noop_coroutine_handle.h>
|
|
# include <__coroutine/trivial_awaitables.h>
|
|
# endif // _LIBCPP_STD_VER >= 20
|
|
|
|
# include <version>
|
|
|
|
// standard-mandated includes
|
|
|
|
// [coroutine.syn]
|
|
# include <compare>
|
|
|
|
# ifndef _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER
|
|
# pragma GCC system_header
|
|
# endif
|
|
|
|
# if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
|
|
# include <cstddef>
|
|
# include <iosfwd>
|
|
# include <limits>
|
|
# include <type_traits>
|
|
# endif
|
|
#endif // __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)
|
|
|
|
#endif // _LIBCPP_COROUTINE
|