diff --git a/libcxx/docs/FeatureTestMacroTable.rst b/libcxx/docs/FeatureTestMacroTable.rst index c04a883de179..a6867fb30a37 100644 --- a/libcxx/docs/FeatureTestMacroTable.rst +++ b/libcxx/docs/FeatureTestMacroTable.rst @@ -1,210 +1,212 @@ .. _FeatureTestMacroTable: ========================== Feature Test Macro Support ========================== .. contents:: :local: Overview ======== This file documents the feature test macros currently supported by libc++. .. _feature-status: Status ====== .. table:: Current Status :name: feature-status-table :widths: auto ================================================= ================= Macro Name Value ================================================= ================= **C++ 14** ------------------------------------------------------------------- ``__cpp_lib_chrono_udls`` ``201304L`` ------------------------------------------------- ----------------- ``__cpp_lib_complex_udls`` ``201309L`` ------------------------------------------------- ----------------- ``__cpp_lib_exchange_function`` ``201304L`` ------------------------------------------------- ----------------- ``__cpp_lib_generic_associative_lookup`` ``201304L`` ------------------------------------------------- ----------------- ``__cpp_lib_integer_sequence`` ``201304L`` ------------------------------------------------- ----------------- ``__cpp_lib_integral_constant_callable`` ``201304L`` ------------------------------------------------- ----------------- ``__cpp_lib_is_final`` ``201402L`` ------------------------------------------------- ----------------- ``__cpp_lib_is_null_pointer`` ``201309L`` ------------------------------------------------- ----------------- ``__cpp_lib_make_reverse_iterator`` ``201402L`` ------------------------------------------------- ----------------- ``__cpp_lib_make_unique`` ``201304L`` ------------------------------------------------- ----------------- ``__cpp_lib_null_iterators`` ``201304L`` ------------------------------------------------- ----------------- ``__cpp_lib_quoted_string_io`` ``201304L`` ------------------------------------------------- ----------------- ``__cpp_lib_result_of_sfinae`` ``201210L`` ------------------------------------------------- ----------------- ``__cpp_lib_robust_nonmodifying_seq_ops`` ``201304L`` ------------------------------------------------- ----------------- ``__cpp_lib_shared_timed_mutex`` ``201402L`` ------------------------------------------------- ----------------- ``__cpp_lib_string_udls`` ``201304L`` ------------------------------------------------- ----------------- ``__cpp_lib_transformation_trait_aliases`` ``201304L`` ------------------------------------------------- ----------------- ``__cpp_lib_transparent_operators`` ``201210L`` ------------------------------------------------- ----------------- ``__cpp_lib_tuple_element_t`` ``201402L`` ------------------------------------------------- ----------------- ``__cpp_lib_tuples_by_type`` ``201304L`` ------------------------------------------------- ----------------- **C++ 17** ------------------------------------------------------------------- ``__cpp_lib_addressof_constexpr`` ``201603L`` ------------------------------------------------- ----------------- ``__cpp_lib_allocator_traits_is_always_equal`` ``201411L`` ------------------------------------------------- ----------------- ``__cpp_lib_any`` ``201606L`` ------------------------------------------------- ----------------- ``__cpp_lib_apply`` ``201603L`` ------------------------------------------------- ----------------- ``__cpp_lib_array_constexpr`` ``201603L`` ------------------------------------------------- ----------------- ``__cpp_lib_as_const`` ``201510L`` ------------------------------------------------- ----------------- ``__cpp_lib_atomic_is_always_lock_free`` ``201603L`` ------------------------------------------------- ----------------- ``__cpp_lib_bool_constant`` ``201505L`` ------------------------------------------------- ----------------- ``__cpp_lib_boyer_moore_searcher`` *unimplemented* ------------------------------------------------- ----------------- ``__cpp_lib_byte`` ``201603L`` ------------------------------------------------- ----------------- ``__cpp_lib_chrono`` ``201611L`` ------------------------------------------------- ----------------- ``__cpp_lib_clamp`` ``201603L`` ------------------------------------------------- ----------------- ``__cpp_lib_enable_shared_from_this`` ``201603L`` ------------------------------------------------- ----------------- ``__cpp_lib_execution`` *unimplemented* ------------------------------------------------- ----------------- ``__cpp_lib_filesystem`` ``201703L`` ------------------------------------------------- ----------------- ``__cpp_lib_gcd_lcm`` ``201606L`` ------------------------------------------------- ----------------- ``__cpp_lib_hardware_interference_size`` *unimplemented* ------------------------------------------------- ----------------- ``__cpp_lib_has_unique_object_representations`` ``201606L`` ------------------------------------------------- ----------------- ``__cpp_lib_hypot`` ``201603L`` ------------------------------------------------- ----------------- ``__cpp_lib_incomplete_container_elements`` ``201505L`` ------------------------------------------------- ----------------- ``__cpp_lib_invoke`` ``201411L`` ------------------------------------------------- ----------------- ``__cpp_lib_is_aggregate`` ``201703L`` ------------------------------------------------- ----------------- ``__cpp_lib_is_invocable`` ``201703L`` ------------------------------------------------- ----------------- ``__cpp_lib_is_swappable`` ``201603L`` ------------------------------------------------- ----------------- ``__cpp_lib_launder`` ``201606L`` ------------------------------------------------- ----------------- ``__cpp_lib_logical_traits`` ``201510L`` ------------------------------------------------- ----------------- ``__cpp_lib_make_from_tuple`` ``201606L`` ------------------------------------------------- ----------------- ``__cpp_lib_map_try_emplace`` ``201411L`` ------------------------------------------------- ----------------- ``__cpp_lib_math_special_functions`` *unimplemented* ------------------------------------------------- ----------------- ``__cpp_lib_memory_resource`` *unimplemented* ------------------------------------------------- ----------------- ``__cpp_lib_node_extract`` ``201606L`` ------------------------------------------------- ----------------- ``__cpp_lib_nonmember_container_access`` ``201411L`` ------------------------------------------------- ----------------- ``__cpp_lib_not_fn`` ``201603L`` ------------------------------------------------- ----------------- ``__cpp_lib_optional`` ``201606L`` ------------------------------------------------- ----------------- ``__cpp_lib_parallel_algorithm`` *unimplemented* ------------------------------------------------- ----------------- ``__cpp_lib_raw_memory_algorithms`` ``201606L`` ------------------------------------------------- ----------------- ``__cpp_lib_sample`` ``201603L`` ------------------------------------------------- ----------------- ``__cpp_lib_scoped_lock`` ``201703L`` ------------------------------------------------- ----------------- ``__cpp_lib_shared_mutex`` ``201505L`` ------------------------------------------------- ----------------- ``__cpp_lib_shared_ptr_arrays`` *unimplemented* ------------------------------------------------- ----------------- ``__cpp_lib_shared_ptr_weak_type`` ``201606L`` ------------------------------------------------- ----------------- ``__cpp_lib_string_view`` ``201606L`` ------------------------------------------------- ----------------- ``__cpp_lib_to_chars`` *unimplemented* ------------------------------------------------- ----------------- ``__cpp_lib_transparent_operators`` ``201510L`` ------------------------------------------------- ----------------- ``__cpp_lib_type_trait_variable_templates`` ``201510L`` ------------------------------------------------- ----------------- ``__cpp_lib_uncaught_exceptions`` ``201411L`` ------------------------------------------------- ----------------- ``__cpp_lib_unordered_map_try_emplace`` ``201411L`` ------------------------------------------------- ----------------- ``__cpp_lib_variant`` ``201606L`` ------------------------------------------------- ----------------- ``__cpp_lib_void_t`` ``201411L`` ------------------------------------------------- ----------------- **C++ 2a** ------------------------------------------------------------------- ``__cpp_lib_array_constexpr`` ``201811L`` ------------------------------------------------- ----------------- ``__cpp_lib_atomic_ref`` *unimplemented* ------------------------------------------------- ----------------- ``__cpp_lib_bind_front`` *unimplemented* ------------------------------------------------- ----------------- ``__cpp_lib_bit_cast`` *unimplemented* ------------------------------------------------- ----------------- ``__cpp_lib_char8_t`` ``201811L`` ------------------------------------------------- ----------------- ``__cpp_lib_concepts`` *unimplemented* ------------------------------------------------- ----------------- ``__cpp_lib_constexpr_misc`` *unimplemented* ------------------------------------------------- ----------------- ``__cpp_lib_constexpr_swap_algorithms`` *unimplemented* ------------------------------------------------- ----------------- ``__cpp_lib_destroying_delete`` ``201806L`` ------------------------------------------------- ----------------- ``__cpp_lib_endian`` ``201907L`` ------------------------------------------------- ----------------- ``__cpp_lib_erase_if`` ``202002L`` ------------------------------------------------- ----------------- ``__cpp_lib_generic_unordered_lookup`` *unimplemented* ------------------------------------------------- ----------------- ``__cpp_lib_interpolate`` ``201902L`` ------------------------------------------------- ----------------- ``__cpp_lib_is_constant_evaluated`` ``201811L`` ------------------------------------------------- ----------------- ``__cpp_lib_list_remove_return_type`` ``201806L`` ------------------------------------------------- ----------------- + ``__cpp_lib_math_constants`` ``201907L`` + ------------------------------------------------- ----------------- ``__cpp_lib_ranges`` *unimplemented* ------------------------------------------------- ----------------- ``__cpp_lib_span`` ``202002L`` ------------------------------------------------- ----------------- ``__cpp_lib_three_way_comparison`` *unimplemented* ------------------------------------------------- ----------------- ``__cpp_lib_to_array`` ``201907L`` ================================================= ================= diff --git a/libcxx/docs/ReleaseNotes.rst b/libcxx/docs/ReleaseNotes.rst index dfc0538a19ed..1db79153ed89 100644 --- a/libcxx/docs/ReleaseNotes.rst +++ b/libcxx/docs/ReleaseNotes.rst @@ -1,43 +1,45 @@ ========================================= Libc++ 11.0.0 (In-Progress) Release Notes ========================================= .. contents:: :local: :depth: 2 Written by the `Libc++ Team `_ .. warning:: These are in-progress notes for the upcoming libc++ 11 release. Release notes for previous releases can be found on `the Download Page `_. Introduction ============ This document contains the release notes for the libc++ C++ Standard Library, part of the LLVM Compiler Infrastructure, release 11.0.0. Here we describe the status of libc++ in some detail, including major improvements from the previous release and new feature work. For the general LLVM release notes, see `the LLVM documentation `_. All LLVM releases may be downloaded from the `LLVM releases web site `_. For more information about libc++, please see the `Libc++ Web Site `_ or the `LLVM Web Site `_. Note that if you are reading this file from a Git checkout or the main Libc++ web page, this document applies to the *next* release, not the current one. To see the release notes for a specific release, please see the `releases page `_. What's New in Libc++ 11.0.0? ============================ New Features ------------ +- ```` + API Changes ----------- - ... diff --git a/libcxx/include/CMakeLists.txt b/libcxx/include/CMakeLists.txt index 250d804f800e..3625dd9f6286 100644 --- a/libcxx/include/CMakeLists.txt +++ b/libcxx/include/CMakeLists.txt @@ -1,275 +1,276 @@ set(files __bit_reference __bsd_locale_defaults.h __bsd_locale_fallbacks.h __errc __debug __functional_03 __functional_base __functional_base_03 __hash_table __libcpp_version __locale __mutex_base __node_handle __nullptr __split_buffer __sso_allocator __std_stream __string __threading_support __tree __tuple __undef_macros algorithm any array atomic barrier bit bitset cassert ccomplex cctype cerrno cfenv cfloat charconv chrono cinttypes ciso646 climits clocale cmath codecvt compare complex complex.h concepts condition_variable csetjmp csignal cstdarg cstdbool cstddef cstdint cstdio cstdlib cstring ctgmath ctime ctype.h cwchar cwctype deque errno.h exception execution experimental/__config experimental/__memory experimental/algorithm experimental/coroutine experimental/deque experimental/filesystem experimental/forward_list experimental/functional experimental/iterator experimental/list experimental/map experimental/memory_resource experimental/propagate_const experimental/regex experimental/set experimental/simd experimental/string experimental/type_traits experimental/unordered_map experimental/unordered_set experimental/utility experimental/vector ext/__hash ext/hash_map ext/hash_set fenv.h filesystem float.h forward_list fstream functional future initializer_list inttypes.h iomanip ios iosfwd iostream istream iterator latch limits limits.h list locale locale.h map math.h memory module.modulemap mutex new + numbers numeric optional ostream queue random ratio regex scoped_allocator semaphore set setjmp.h shared_mutex span sstream stack stdbool.h stddef.h stdexcept stdint.h stdio.h stdlib.h streambuf string string.h string_view strstream system_error tgmath.h thread tuple type_traits typeindex typeinfo unordered_map unordered_set utility valarray variant vector version wchar.h wctype.h ) if(LIBCXX_INSTALL_SUPPORT_HEADERS) set(files ${files} support/android/locale_bionic.h support/fuchsia/xlocale.h support/ibm/limits.h support/ibm/locale_mgmt_aix.h support/ibm/support.h support/ibm/xlocale.h support/musl/xlocale.h support/newlib/xlocale.h support/solaris/floatingpoint.h support/solaris/wchar.h support/solaris/xlocale.h support/win32/limits_msvc_win32.h support/win32/locale_win32.h support/xlocale/__nop_locale_mgmt.h support/xlocale/__posix_l_fallback.h support/xlocale/__strtonum_fallback.h ) endif() if (LIBCXX_NEEDS_SITE_CONFIG) # Generate a custom __config header. The new header is created # by prepending __config_site to the current __config header. add_custom_command(OUTPUT ${LIBCXX_BINARY_DIR}/__generated_config COMMAND ${Python3_EXECUTABLE} ${LIBCXX_SOURCE_DIR}/utils/cat_files.py ${LIBCXX_BINARY_DIR}/__config_site ${LIBCXX_SOURCE_DIR}/include/__config -o ${LIBCXX_BINARY_DIR}/__generated_config DEPENDS ${LIBCXX_SOURCE_DIR}/include/__config ${LIBCXX_BINARY_DIR}/__config_site ) # Add a target that executes the generation commands. add_custom_target(cxx-generated-config ALL DEPENDS ${LIBCXX_BINARY_DIR}/__generated_config) set(generated_config_deps cxx-generated-config) else() set(files ${files} __config ) endif() # In some build configurations (like bootstrapping clang), we need to be able to # install the libcxx headers before the CMake configuration for libcxx runs. Making # the name of this target configurable allows LLVM/runtimes/CMakeLists.txt to # add this subdirectory to the LLVM build to put libcxx's headers in place # before libcxx's build configuration is run. if (NOT CXX_HEADER_TARGET) set(CXX_HEADER_TARGET cxx-headers) endif() if(NOT LIBCXX_USING_INSTALLED_LLVM AND LIBCXX_HEADER_DIR) set(output_dir ${LIBCXX_HEADER_DIR}/include/c++/v1) set(out_files) foreach(f ${files}) set(src ${CMAKE_CURRENT_SOURCE_DIR}/${f}) set(dst ${output_dir}/${f}) add_custom_command(OUTPUT ${dst} DEPENDS ${src} COMMAND ${CMAKE_COMMAND} -E copy_if_different ${src} ${dst} COMMENT "Copying CXX header ${f}") list(APPEND out_files ${dst}) endforeach() if (LIBCXX_NEEDS_SITE_CONFIG) # Copy the generated header as __config into build directory. set(src ${LIBCXX_BINARY_DIR}/__generated_config) set(dst ${output_dir}/__config) add_custom_command(OUTPUT ${dst} DEPENDS ${src} ${generated_config_deps} COMMAND ${CMAKE_COMMAND} -E copy_if_different ${src} ${dst} COMMENT "Copying CXX __config") list(APPEND out_files ${dst}) endif() add_custom_target(${CXX_HEADER_TARGET} ALL DEPENDS ${out_files} ${LIBCXX_CXX_ABI_HEADER_TARGET}) else() add_custom_target(${CXX_HEADER_TARGET}) endif() set_target_properties(${CXX_HEADER_TARGET} PROPERTIES FOLDER "Misc") if (LIBCXX_INSTALL_HEADERS) foreach(file ${files}) get_filename_component(dir ${file} DIRECTORY) install(FILES ${file} DESTINATION ${LIBCXX_INSTALL_HEADER_PREFIX}include/c++/v1/${dir} COMPONENT ${CXX_HEADER_TARGET} PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ ) endforeach() if (LIBCXX_NEEDS_SITE_CONFIG) # Install the generated header as __config. install(FILES ${LIBCXX_BINARY_DIR}/__generated_config DESTINATION ${LIBCXX_INSTALL_HEADER_PREFIX}include/c++/v1 PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ RENAME __config COMPONENT ${CXX_HEADER_TARGET}) endif() if (NOT CMAKE_CONFIGURATION_TYPES) add_custom_target(install-${CXX_HEADER_TARGET} DEPENDS ${CXX_HEADER_TARGET} ${generated_config_deps} COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=${CXX_HEADER_TARGET} -P "${CMAKE_BINARY_DIR}/cmake_install.cmake") # Stripping is a no-op for headers add_custom_target(install-${CXX_HEADER_TARGET}-stripped DEPENDS install-${CXX_HEADER_TARGET}) endif() endif() diff --git a/libcxx/include/module.modulemap b/libcxx/include/module.modulemap index fb6705c790d2..b8d2a6669aac 100644 --- a/libcxx/include/module.modulemap +++ b/libcxx/include/module.modulemap @@ -1,631 +1,635 @@ // define the module for __config outside of the top level 'std' module // since __config may be included from C headers which may create an // include cycle. module std_config [system] [extern_c] { header "__config" } module std [system] { export std_config // FIXME: The standard does not require that each of these submodules // re-exports its imported modules. We should provide an alternative form of // export that issues a warning if a name from the submodule is used, and // use that to provide a 'strict mode' for libc++. // Deprecated C-compatibility headers. These can all be included from within // an 'extern "C"' context. module depr [extern_c] { // provided by C library. module ctype_h { header "ctype.h" export * } module errno_h { header "errno.h" export * } module fenv_h { header "fenv.h" export * } // provided by compiler or C library. module inttypes_h { header "inttypes.h" export stdint_h export * } // provided by compiler. // provided by compiler or C library. module locale_h { header "locale.h" export * } module math_h { header "math.h" export * } module setjmp_h { header "setjmp.h" export * } // FIXME: is missing. // provided by C library. // provided by compiler. // provided by compiler. module stddef_h { // 's __need_* macros require textual inclusion. textual header "stddef.h" } module stdint_h { header "stdint.h" export * // FIXME: This module only exists on OS X and for some reason the // wildcard above doesn't export it. export Darwin.C.stdint } module stdio_h { // 's __need_* macros require textual inclusion. textual header "stdio.h" export * export Darwin.C.stdio } module stdlib_h { // 's __need_* macros require textual inclusion. textual header "stdlib.h" export * } module string_h { header "string.h" export * } // FIXME: is missing. // provided by C library. module wchar_h { // 's __need_* macros require textual inclusion. textual header "wchar.h" export * } module wctype_h { header "wctype.h" export * } } // and are not C headers in any real sense, do not // allow their use in extern "C" contexts. module complex_h { header "complex.h" export ccomplex export * } module tgmath_h { header "tgmath.h" export ccomplex export cmath export * } // C compatibility headers. module compat { module cassert { // 's use of NDEBUG requires textual inclusion. textual header "cassert" } module ccomplex { header "ccomplex" export complex export * } module cctype { header "cctype" export * } module cerrno { header "cerrno" export * } module cfenv { header "cfenv" export * } module cfloat { header "cfloat" export * } module cinttypes { header "cinttypes" export cstdint export * } module ciso646 { header "ciso646" export * } module climits { header "climits" export * } module clocale { header "clocale" export * } module cmath { header "cmath" export * } module csetjmp { header "csetjmp" export * } module csignal { header "csignal" export * } // FIXME: is missing. module cstdarg { header "cstdarg" export * } module cstdbool { header "cstdbool" export * } module cstddef { header "cstddef" export * } module cstdint { header "cstdint" export depr.stdint_h export * } module cstdio { header "cstdio" export * } module cstdlib { header "cstdlib" export * } module cstring { header "cstring" export * } module ctgmath { header "ctgmath" export ccomplex export cmath export * } module ctime { header "ctime" export * } // FIXME: is missing. module cwchar { header "cwchar" export depr.stdio_h export * } module cwctype { header "cwctype" export * } } module algorithm { header "algorithm" export initializer_list export * } module any { header "any" export * } module array { header "array" export initializer_list export * } module atomic { header "atomic" export * } module barrier { requires cplusplus14 header "barrier" export * } module bit { header "bit" export * } module bitset { header "bitset" export string export iosfwd export * } // No submodule for cassert. It fundamentally needs repeated, textual inclusion. module charconv { header "charconv" export * } module chrono { header "chrono" export * } module codecvt { header "codecvt" export * } module compare { header "compare" export * } module complex { header "complex" export * } module concepts { header "concepts" export * } module condition_variable { header "condition_variable" export * } module deque { header "deque" export initializer_list export * } module exception { header "exception" export * } module execution { header "execution" export * } module filesystem { header "filesystem" export * } module forward_list { header "forward_list" export initializer_list export * } module fstream { header "fstream" export * } module functional { header "functional" export * } module future { header "future" export * } module initializer_list { header "initializer_list" export * } module iomanip { header "iomanip" export * } module ios { header "ios" export iosfwd export * } module iosfwd { header "iosfwd" export * } module iostream { header "iostream" export ios export streambuf export istream export ostream export * } module istream { header "istream" // FIXME: should re-export ios, streambuf? export * } module iterator { header "iterator" export * } module latch { requires cplusplus14 header "latch" export * } module limits { header "limits" export * } module list { header "list" export initializer_list export * } module locale { header "locale" export * } module map { header "map" export initializer_list export * } module memory { header "memory" export * } module mutex { header "mutex" export * } module new { header "new" export * } + module numbers { + header "numbers" + export * + } module numeric { header "numeric" export * } module optional { header "optional" export * } module ostream { header "ostream" // FIXME: should re-export ios, streambuf? export * } module queue { header "queue" export initializer_list export * } module random { header "random" export initializer_list export * } module ratio { header "ratio" export * } module regex { header "regex" export initializer_list export * } module scoped_allocator { header "scoped_allocator" export * } module semaphore { requires cplusplus14 header "semaphore" export * } module set { header "set" export initializer_list export * } module sstream { header "sstream" // FIXME: should re-export istream, ostream, ios, streambuf, string? export * } module stack { header "stack" export initializer_list export * } module stdexcept { header "stdexcept" export * } module streambuf { header "streambuf" export * } module string { header "string" export initializer_list export string_view export __string export * } module string_view { header "string_view" export initializer_list export __string export * } module strstream { header "strstream" export * } module system_error { header "system_error" export * } module thread { header "thread" export * } module tuple { header "tuple" export * } module type_traits { header "type_traits" export * } module typeindex { header "typeindex" export * } module typeinfo { header "typeinfo" export * } module unordered_map { header "unordered_map" export initializer_list export * } module unordered_set { header "unordered_set" export initializer_list export * } module utility { header "utility" export initializer_list export * } module valarray { header "valarray" export initializer_list export * } module variant { header "variant" export * } module vector { header "vector" export initializer_list export * } module version { header "version" export * } // FIXME: These should be private. module __bit_reference { header "__bit_reference" export * } module __debug { header "__debug" export * } module __errc { header "__errc" export * } module __functional_base { header "__functional_base" export * } module __hash_table { header "__hash_table" export * } module __locale { header "__locale" export * } module __mutex_base { header "__mutex_base" export * } module __split_buffer { header "__split_buffer" export * } module __sso_allocator { header "__sso_allocator" export * } module __std_stream { header "__std_stream" export * } module __string { header "__string" export * } module __tree { header "__tree" export * } module __tuple { header "__tuple" export * } module __undef_macros { header "__undef_macros" export * } module __node_handle { header "__node_handle" export * } module experimental { requires cplusplus11 module algorithm { header "experimental/algorithm" export * } module coroutine { requires coroutines header "experimental/coroutine" export * } module deque { header "experimental/deque" export * } module filesystem { header "experimental/filesystem" export * } module forward_list { header "experimental/forward_list" export * } module functional { header "experimental/functional" export * } module iterator { header "experimental/iterator" export * } module list { header "experimental/list" export * } module map { header "experimental/map" export * } module memory_resource { header "experimental/memory_resource" export * } module propagate_const { header "experimental/propagate_const" export * } module regex { header "experimental/regex" export * } module simd { header "experimental/simd" export * } module set { header "experimental/set" export * } module span { header "span" export * } module string { header "experimental/string" export * } module type_traits { header "experimental/type_traits" export * } module unordered_map { header "experimental/unordered_map" export * } module unordered_set { header "experimental/unordered_set" export * } module utility { header "experimental/utility" export * } module vector { header "experimental/vector" export * } // FIXME these should be private module __memory { header "experimental/__memory" export * } } // end experimental } diff --git a/libcxx/include/numbers b/libcxx/include/numbers new file mode 100644 index 000000000000..cbf54cd156ef --- /dev/null +++ b/libcxx/include/numbers @@ -0,0 +1,141 @@ +// -*- C++ -*- +//===---------------------------- numbers ---------------------------------===// +// +// 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_NUMBERS +#define _LIBCPP_NUMBERS + +/* + numbers synopsis + +namespace std::numbers { + template inline constexpr T e_v = unspecified; + template inline constexpr T log2e_v = unspecified; + template inline constexpr T log10e_v = unspecified; + template inline constexpr T pi_v = unspecified; + template inline constexpr T inv_pi_v = unspecified; + template inline constexpr T inv_sqrtpi_v = unspecified; + template inline constexpr T ln2_v = unspecified; + template inline constexpr T ln10_v = unspecified; + template inline constexpr T sqrt2_v = unspecified; + template inline constexpr T sqrt3_v = unspecified; + template inline constexpr T inv_sqrt3_v = unspecified; + template inline constexpr T egamma_v = unspecified; + template inline constexpr T phi_v = unspecified; + + template inline constexpr T e_v = see below; + template inline constexpr T log2e_v = see below; + template inline constexpr T log10e_v = see below; + template inline constexpr T pi_v = see below; + template inline constexpr T inv_pi_v = see below; + template inline constexpr T inv_sqrtpi_v = see below; + template inline constexpr T ln2_v = see below; + template inline constexpr T ln10_v = see below; + template inline constexpr T sqrt2_v = see below; + template inline constexpr T sqrt3_v = see below; + template inline constexpr T inv_sqrt3_v = see below; + template inline constexpr T egamma_v = see below; + template inline constexpr T phi_v = see below; + + inline constexpr double e = e_v; + inline constexpr double log2e = log2e_v; + inline constexpr double log10e = log10e_v; + inline constexpr double pi = pi_v; + inline constexpr double inv_pi = inv_pi_v; + inline constexpr double inv_sqrtpi = inv_sqrtpi_v; + inline constexpr double ln2 = ln2_v; + inline constexpr double ln10 = ln10_v; + inline constexpr double sqrt2 = sqrt2_v; + inline constexpr double sqrt3 = sqrt3_v; + inline constexpr double inv_sqrt3 = inv_sqrt3_v; + inline constexpr double egamma = egamma_v; + inline constexpr double phi = phi_v; +} +*/ + +#include <__config> + +#if _LIBCPP_STD_VER > 17 + +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace numbers { + +template +inline constexpr bool __false = false; + +template +struct __illformed +{ + static_assert(__false, "A program that instantiates a primary template of a mathematical constant variable template is ill-formed."); +}; + +template inline constexpr T e_v = __illformed{}; +template inline constexpr T log2e_v = __illformed{}; +template inline constexpr T log10e_v = __illformed{}; +template inline constexpr T pi_v = __illformed{}; +template inline constexpr T inv_pi_v = __illformed{}; +template inline constexpr T inv_sqrtpi_v = __illformed{}; +template inline constexpr T ln2_v = __illformed{}; +template inline constexpr T ln10_v = __illformed{}; +template inline constexpr T sqrt2_v = __illformed{}; +template inline constexpr T sqrt3_v = __illformed{}; +template inline constexpr T inv_sqrt3_v = __illformed{}; +template inline constexpr T egamma_v = __illformed{}; +template inline constexpr T phi_v = __illformed{}; + +template +concept __floating_point = std::is_floating_point_v; + +template <__floating_point T> inline constexpr T e_v = 2.718281828459045235360287471352662; +template <__floating_point T> inline constexpr T log2e_v = 1.442695040888963407359924681001892; +template <__floating_point T> inline constexpr T log10e_v = 0.434294481903251827651128918916605; +template <__floating_point T> inline constexpr T pi_v = 3.141592653589793238462643383279502; +template <__floating_point T> inline constexpr T inv_pi_v = 0.318309886183790671537767526745028; +template <__floating_point T> inline constexpr T inv_sqrtpi_v = 0.564189583547756286948079451560772; +template <__floating_point T> inline constexpr T ln2_v = 0.693147180559945309417232121458176; +template <__floating_point T> inline constexpr T ln10_v = 2.302585092994045684017991454684364; +template <__floating_point T> inline constexpr T sqrt2_v = 1.414213562373095048801688724209698; +template <__floating_point T> inline constexpr T sqrt3_v = 1.732050807568877293527446341505872; +template <__floating_point T> inline constexpr T inv_sqrt3_v = 0.577350269189625764509148780501957; +template <__floating_point T> inline constexpr T egamma_v = 0.577215664901532860606512090082402; +template <__floating_point T> inline constexpr T phi_v = 1.618033988749894848204586834365638; + +inline constexpr double e = e_v; +inline constexpr double log2e = log2e_v; +inline constexpr double log10e = log10e_v; +inline constexpr double pi = pi_v; +inline constexpr double inv_pi = inv_pi_v; +inline constexpr double inv_sqrtpi = inv_sqrtpi_v; +inline constexpr double ln2 = ln2_v; +inline constexpr double ln10 = ln10_v; +inline constexpr double sqrt2 = sqrt2_v; +inline constexpr double sqrt3 = sqrt3_v; +inline constexpr double inv_sqrt3 = inv_sqrt3_v; +inline constexpr double egamma = egamma_v; +inline constexpr double phi = phi_v; + +} // namespace numbers + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif //_LIBCPP_STD_VER > 17 + +#endif // _LIBCPP_NUMBERS diff --git a/libcxx/include/version b/libcxx/include/version index 5a250471a03e..ee78e6cb1372 100644 --- a/libcxx/include/version +++ b/libcxx/include/version @@ -1,246 +1,248 @@ // -*- C++ -*- //===--------------------------- version ----------------------------------===// // // 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_VERSIONH #define _LIBCPP_VERSIONH /* version synopsis Macro name Value Headers __cpp_lib_addressof_constexpr 201603L __cpp_lib_allocator_traits_is_always_equal 201411L __cpp_lib_any 201606L __cpp_lib_apply 201603L __cpp_lib_array_constexpr 201811L 201603L // C++17 __cpp_lib_as_const 201510L __cpp_lib_atomic_is_always_lock_free 201603L __cpp_lib_atomic_ref 201806L __cpp_lib_bind_front 201811L __cpp_lib_bit_cast 201806L __cpp_lib_bool_constant 201505L __cpp_lib_boyer_moore_searcher 201603L __cpp_lib_byte 201603L __cpp_lib_char8_t 201811L __cpp_lib_chrono 201611L __cpp_lib_chrono_udls 201304L __cpp_lib_clamp 201603L __cpp_lib_complex_udls 201309L __cpp_lib_concepts 201806L __cpp_lib_constexpr_misc 201811L __cpp_lib_constexpr_swap_algorithms 201806L __cpp_lib_destroying_delete 201806L __cpp_lib_enable_shared_from_this 201603L __cpp_lib_endian 201907L __cpp_lib_erase_if 202002L __cpp_lib_exchange_function 201304L __cpp_lib_execution 201603L __cpp_lib_filesystem 201703L __cpp_lib_gcd_lcm 201606L __cpp_lib_generic_associative_lookup 201304L __cpp_lib_generic_unordered_lookup 201811L __cpp_lib_hardware_interference_size 201703L __cpp_lib_has_unique_object_representations 201606L __cpp_lib_hypot 201603L __cpp_lib_incomplete_container_elements 201505L __cpp_lib_integer_sequence 201304L __cpp_lib_integral_constant_callable 201304L __cpp_lib_interpolate 201902L __cpp_lib_invoke 201411L __cpp_lib_is_aggregate 201703L __cpp_lib_is_constant_evaluated 201811L __cpp_lib_is_final 201402L __cpp_lib_is_invocable 201703L __cpp_lib_is_null_pointer 201309L __cpp_lib_is_swappable 201603L __cpp_lib_launder 201606L __cpp_lib_list_remove_return_type 201806L __cpp_lib_logical_traits 201510L __cpp_lib_make_from_tuple 201606L __cpp_lib_make_reverse_iterator 201402L __cpp_lib_make_unique 201304L __cpp_lib_map_try_emplace 201411L +__cpp_lib_math_constants 201907L __cpp_lib_math_special_functions 201603L __cpp_lib_memory_resource 201603L __cpp_lib_node_extract 201606L __cpp_lib_nonmember_container_access 201411L __cpp_lib_not_fn 201603L __cpp_lib_null_iterators 201304L __cpp_lib_optional 201606L __cpp_lib_parallel_algorithm 201603L __cpp_lib_quoted_string_io 201304L __cpp_lib_ranges 201811L __cpp_lib_raw_memory_algorithms 201606L __cpp_lib_result_of_sfinae 201210L __cpp_lib_robust_nonmodifying_seq_ops 201304L __cpp_lib_sample 201603L __cpp_lib_scoped_lock 201703L __cpp_lib_shared_mutex 201505L __cpp_lib_shared_ptr_arrays 201611L __cpp_lib_shared_ptr_weak_type 201606L __cpp_lib_shared_timed_mutex 201402L __cpp_lib_span 202002L __cpp_lib_string_udls 201304L __cpp_lib_string_view 201606L __cpp_lib_three_way_comparison 201711L __cpp_lib_to_array 201907L __cpp_lib_to_chars 201611L __cpp_lib_transformation_trait_aliases 201304L __cpp_lib_transparent_operators 201510L 201210L // C++14 __cpp_lib_tuple_element_t 201402L __cpp_lib_tuples_by_type 201304L __cpp_lib_type_trait_variable_templates 201510L __cpp_lib_uncaught_exceptions 201411L __cpp_lib_unordered_map_try_emplace 201411L __cpp_lib_variant 201606L __cpp_lib_void_t 201411L */ #include <__config> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) #pragma GCC system_header #endif #if _LIBCPP_STD_VER > 11 # define __cpp_lib_chrono_udls 201304L # define __cpp_lib_complex_udls 201309L # define __cpp_lib_exchange_function 201304L # define __cpp_lib_generic_associative_lookup 201304L # define __cpp_lib_integer_sequence 201304L # define __cpp_lib_integral_constant_callable 201304L # define __cpp_lib_is_final 201402L # define __cpp_lib_is_null_pointer 201309L # define __cpp_lib_make_reverse_iterator 201402L # define __cpp_lib_make_unique 201304L # define __cpp_lib_null_iterators 201304L # define __cpp_lib_quoted_string_io 201304L # define __cpp_lib_result_of_sfinae 201210L # define __cpp_lib_robust_nonmodifying_seq_ops 201304L # if !defined(_LIBCPP_HAS_NO_THREADS) # define __cpp_lib_shared_timed_mutex 201402L # endif # define __cpp_lib_string_udls 201304L # define __cpp_lib_transformation_trait_aliases 201304L # define __cpp_lib_transparent_operators 201210L # define __cpp_lib_tuple_element_t 201402L # define __cpp_lib_tuples_by_type 201304L #endif #if _LIBCPP_STD_VER > 14 # if !defined(_LIBCPP_HAS_NO_BUILTIN_ADDRESSOF) # define __cpp_lib_addressof_constexpr 201603L # endif # define __cpp_lib_allocator_traits_is_always_equal 201411L # define __cpp_lib_any 201606L # define __cpp_lib_apply 201603L # define __cpp_lib_array_constexpr 201603L # define __cpp_lib_as_const 201510L # if !defined(_LIBCPP_HAS_NO_THREADS) # define __cpp_lib_atomic_is_always_lock_free 201603L # endif # define __cpp_lib_bool_constant 201505L // # define __cpp_lib_boyer_moore_searcher 201603L # define __cpp_lib_byte 201603L # define __cpp_lib_chrono 201611L # define __cpp_lib_clamp 201603L # define __cpp_lib_enable_shared_from_this 201603L // # define __cpp_lib_execution 201603L # define __cpp_lib_filesystem 201703L # define __cpp_lib_gcd_lcm 201606L // # define __cpp_lib_hardware_interference_size 201703L # if defined(_LIBCPP_HAS_UNIQUE_OBJECT_REPRESENTATIONS) # define __cpp_lib_has_unique_object_representations 201606L # endif # define __cpp_lib_hypot 201603L # define __cpp_lib_incomplete_container_elements 201505L # define __cpp_lib_invoke 201411L # if !defined(_LIBCPP_HAS_NO_IS_AGGREGATE) # define __cpp_lib_is_aggregate 201703L # endif # define __cpp_lib_is_invocable 201703L # define __cpp_lib_is_swappable 201603L # define __cpp_lib_launder 201606L # define __cpp_lib_logical_traits 201510L # define __cpp_lib_make_from_tuple 201606L # define __cpp_lib_map_try_emplace 201411L // # define __cpp_lib_math_special_functions 201603L // # define __cpp_lib_memory_resource 201603L # define __cpp_lib_node_extract 201606L # define __cpp_lib_nonmember_container_access 201411L # define __cpp_lib_not_fn 201603L # define __cpp_lib_optional 201606L // # define __cpp_lib_parallel_algorithm 201603L # define __cpp_lib_raw_memory_algorithms 201606L # define __cpp_lib_sample 201603L # define __cpp_lib_scoped_lock 201703L # if !defined(_LIBCPP_HAS_NO_THREADS) # define __cpp_lib_shared_mutex 201505L # endif // # define __cpp_lib_shared_ptr_arrays 201611L # define __cpp_lib_shared_ptr_weak_type 201606L # define __cpp_lib_string_view 201606L // # define __cpp_lib_to_chars 201611L # undef __cpp_lib_transparent_operators # define __cpp_lib_transparent_operators 201510L # define __cpp_lib_type_trait_variable_templates 201510L # define __cpp_lib_uncaught_exceptions 201411L # define __cpp_lib_unordered_map_try_emplace 201411L # define __cpp_lib_variant 201606L # define __cpp_lib_void_t 201411L #endif #if _LIBCPP_STD_VER > 17 # undef __cpp_lib_array_constexpr # define __cpp_lib_array_constexpr 201811L # if !defined(_LIBCPP_HAS_NO_THREADS) // # define __cpp_lib_atomic_ref 201806L # endif // # define __cpp_lib_bind_front 201811L // # define __cpp_lib_bit_cast 201806L # if !defined(_LIBCPP_NO_HAS_CHAR8_T) # define __cpp_lib_char8_t 201811L # endif // # define __cpp_lib_concepts 201806L // # define __cpp_lib_constexpr_misc 201811L // # define __cpp_lib_constexpr_swap_algorithms 201806L # if _LIBCPP_STD_VER > 17 && defined(__cpp_impl_destroying_delete) && __cpp_impl_destroying_delete >= 201806L # define __cpp_lib_destroying_delete 201806L # endif # define __cpp_lib_endian 201907L # define __cpp_lib_erase_if 202002L // # define __cpp_lib_generic_unordered_lookup 201811L # define __cpp_lib_interpolate 201902L # if !defined(_LIBCPP_HAS_NO_BUILTIN_IS_CONSTANT_EVALUATED) # define __cpp_lib_is_constant_evaluated 201811L # endif # define __cpp_lib_list_remove_return_type 201806L +# define __cpp_lib_math_constants 201907L // # define __cpp_lib_ranges 201811L # define __cpp_lib_span 202002L // # define __cpp_lib_three_way_comparison 201711L # define __cpp_lib_to_array 201907L #endif #endif // _LIBCPP_VERSIONH diff --git a/libcxx/test/libcxx/double_include.sh.cpp b/libcxx/test/libcxx/double_include.sh.cpp index 37fa0e5c8c7b..9fdd82f06e91 100644 --- a/libcxx/test/libcxx/double_include.sh.cpp +++ b/libcxx/test/libcxx/double_include.sh.cpp @@ -1,178 +1,179 @@ // -*- 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 // //===----------------------------------------------------------------------===// // Test that we can include each header in two TU's and link them together. // RUN: %{cxx} -c %s -o %t.first.o %{flags} %{compile_flags} // RUN: %{cxx} -c %s -o %t.second.o -DWITH_MAIN %{flags} %{compile_flags} // RUN: %{cxx} -o %t.exe %t.first.o %t.second.o %{flags} %{link_flags} // RUN: %{run} // Prevent from generating deprecated warnings for this test. #if defined(__DEPRECATED) #undef __DEPRECATED #endif // Top level headers #include #include #include #ifndef _LIBCPP_HAS_NO_THREADS #include #include #include #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifndef _LIBCPP_HAS_NO_THREADS #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifndef _LIBCPP_HAS_NO_THREADS #include #endif #include +#include #include #include #include #include #include #include #include #include #include #include #ifndef _LIBCPP_HAS_NO_THREADS #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifndef _LIBCPP_HAS_NO_THREADS #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include // experimental headers #if __cplusplus >= 201103L #include #if defined(__cpp_coroutines) #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #endif // __cplusplus >= 201103L // extended headers #include #include #if defined(WITH_MAIN) int main(int, char**) { return 0; } #endif diff --git a/libcxx/test/std/language.support/support.limits/support.limits.general/numbers.version.pass.cpp b/libcxx/test/std/language.support/support.limits/support.limits.general/numbers.version.pass.cpp new file mode 100644 index 000000000000..9812b9ff0779 --- /dev/null +++ b/libcxx/test/std/language.support/support.limits/support.limits.general/numbers.version.pass.cpp @@ -0,0 +1,52 @@ +//===----------------------------------------------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// +// +// WARNING: This test was generated by generate_feature_test_macro_components.py +// and should not be edited manually. + +// + +// Test the feature test macros defined by + +/* Constant Value + __cpp_lib_math_constants 201907L [C++2a] +*/ + +#include +#include "test_macros.h" + +#if TEST_STD_VER < 14 + +# ifdef __cpp_lib_math_constants +# error "__cpp_lib_math_constants should not be defined before c++2a" +# endif + +#elif TEST_STD_VER == 14 + +# ifdef __cpp_lib_math_constants +# error "__cpp_lib_math_constants should not be defined before c++2a" +# endif + +#elif TEST_STD_VER == 17 + +# ifdef __cpp_lib_math_constants +# error "__cpp_lib_math_constants should not be defined before c++2a" +# endif + +#elif TEST_STD_VER > 17 + +# ifndef __cpp_lib_math_constants +# error "__cpp_lib_math_constants should be defined in c++2a" +# endif +# if __cpp_lib_math_constants != 201907L +# error "__cpp_lib_math_constants should have the value 201907L in c++2a" +# endif + +#endif // TEST_STD_VER > 17 + +int main(int, char**) { return 0; } diff --git a/libcxx/test/std/language.support/support.limits/support.limits.general/version.version.pass.cpp b/libcxx/test/std/language.support/support.limits/support.limits.general/version.version.pass.cpp index 901cb2539635..9fcaa8b523d9 100644 --- a/libcxx/test/std/language.support/support.limits/support.limits.general/version.version.pass.cpp +++ b/libcxx/test/std/language.support/support.limits/support.limits.general/version.version.pass.cpp @@ -1,2264 +1,2284 @@ //===----------------------------------------------------------------------===// // // 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 // //===----------------------------------------------------------------------===// // // WARNING: This test was generated by generate_feature_test_macro_components.py // and should not be edited manually. // // Test the feature test macros defined by /* Constant Value __cpp_lib_addressof_constexpr 201603L [C++17] __cpp_lib_allocator_traits_is_always_equal 201411L [C++17] __cpp_lib_any 201606L [C++17] __cpp_lib_apply 201603L [C++17] __cpp_lib_array_constexpr 201603L [C++17] 201811L [C++2a] __cpp_lib_as_const 201510L [C++17] __cpp_lib_atomic_is_always_lock_free 201603L [C++17] __cpp_lib_atomic_ref 201806L [C++2a] __cpp_lib_bind_front 201811L [C++2a] __cpp_lib_bit_cast 201806L [C++2a] __cpp_lib_bool_constant 201505L [C++17] __cpp_lib_boyer_moore_searcher 201603L [C++17] __cpp_lib_byte 201603L [C++17] __cpp_lib_char8_t 201811L [C++2a] __cpp_lib_chrono 201611L [C++17] __cpp_lib_chrono_udls 201304L [C++14] __cpp_lib_clamp 201603L [C++17] __cpp_lib_complex_udls 201309L [C++14] __cpp_lib_concepts 201806L [C++2a] __cpp_lib_constexpr_misc 201811L [C++2a] __cpp_lib_constexpr_swap_algorithms 201806L [C++2a] __cpp_lib_destroying_delete 201806L [C++2a] __cpp_lib_enable_shared_from_this 201603L [C++17] __cpp_lib_endian 201907L [C++2a] __cpp_lib_erase_if 202002L [C++2a] __cpp_lib_exchange_function 201304L [C++14] __cpp_lib_execution 201603L [C++17] __cpp_lib_filesystem 201703L [C++17] __cpp_lib_gcd_lcm 201606L [C++17] __cpp_lib_generic_associative_lookup 201304L [C++14] __cpp_lib_generic_unordered_lookup 201811L [C++2a] __cpp_lib_hardware_interference_size 201703L [C++17] __cpp_lib_has_unique_object_representations 201606L [C++17] __cpp_lib_hypot 201603L [C++17] __cpp_lib_incomplete_container_elements 201505L [C++17] __cpp_lib_integer_sequence 201304L [C++14] __cpp_lib_integral_constant_callable 201304L [C++14] __cpp_lib_interpolate 201902L [C++2a] __cpp_lib_invoke 201411L [C++17] __cpp_lib_is_aggregate 201703L [C++17] __cpp_lib_is_constant_evaluated 201811L [C++2a] __cpp_lib_is_final 201402L [C++14] __cpp_lib_is_invocable 201703L [C++17] __cpp_lib_is_null_pointer 201309L [C++14] __cpp_lib_is_swappable 201603L [C++17] __cpp_lib_launder 201606L [C++17] __cpp_lib_list_remove_return_type 201806L [C++2a] __cpp_lib_logical_traits 201510L [C++17] __cpp_lib_make_from_tuple 201606L [C++17] __cpp_lib_make_reverse_iterator 201402L [C++14] __cpp_lib_make_unique 201304L [C++14] __cpp_lib_map_try_emplace 201411L [C++17] + __cpp_lib_math_constants 201907L [C++2a] __cpp_lib_math_special_functions 201603L [C++17] __cpp_lib_memory_resource 201603L [C++17] __cpp_lib_node_extract 201606L [C++17] __cpp_lib_nonmember_container_access 201411L [C++17] __cpp_lib_not_fn 201603L [C++17] __cpp_lib_null_iterators 201304L [C++14] __cpp_lib_optional 201606L [C++17] __cpp_lib_parallel_algorithm 201603L [C++17] __cpp_lib_quoted_string_io 201304L [C++14] __cpp_lib_ranges 201811L [C++2a] __cpp_lib_raw_memory_algorithms 201606L [C++17] __cpp_lib_result_of_sfinae 201210L [C++14] __cpp_lib_robust_nonmodifying_seq_ops 201304L [C++14] __cpp_lib_sample 201603L [C++17] __cpp_lib_scoped_lock 201703L [C++17] __cpp_lib_shared_mutex 201505L [C++17] __cpp_lib_shared_ptr_arrays 201611L [C++17] __cpp_lib_shared_ptr_weak_type 201606L [C++17] __cpp_lib_shared_timed_mutex 201402L [C++14] __cpp_lib_span 202002L [C++2a] __cpp_lib_string_udls 201304L [C++14] __cpp_lib_string_view 201606L [C++17] __cpp_lib_three_way_comparison 201711L [C++2a] __cpp_lib_to_array 201907L [C++2a] __cpp_lib_to_chars 201611L [C++17] __cpp_lib_transformation_trait_aliases 201304L [C++14] __cpp_lib_transparent_operators 201210L [C++14] 201510L [C++17] __cpp_lib_tuple_element_t 201402L [C++14] __cpp_lib_tuples_by_type 201304L [C++14] __cpp_lib_type_trait_variable_templates 201510L [C++17] __cpp_lib_uncaught_exceptions 201411L [C++17] __cpp_lib_unordered_map_try_emplace 201411L [C++17] __cpp_lib_variant 201606L [C++17] __cpp_lib_void_t 201411L [C++17] */ #include #include "test_macros.h" #if TEST_STD_VER < 14 # ifdef __cpp_lib_addressof_constexpr # error "__cpp_lib_addressof_constexpr should not be defined before c++17" # endif # ifdef __cpp_lib_allocator_traits_is_always_equal # error "__cpp_lib_allocator_traits_is_always_equal should not be defined before c++17" # endif # ifdef __cpp_lib_any # error "__cpp_lib_any should not be defined before c++17" # endif # ifdef __cpp_lib_apply # error "__cpp_lib_apply should not be defined before c++17" # endif # ifdef __cpp_lib_array_constexpr # error "__cpp_lib_array_constexpr should not be defined before c++17" # endif # ifdef __cpp_lib_as_const # error "__cpp_lib_as_const should not be defined before c++17" # endif # ifdef __cpp_lib_atomic_is_always_lock_free # error "__cpp_lib_atomic_is_always_lock_free should not be defined before c++17" # endif # ifdef __cpp_lib_atomic_ref # error "__cpp_lib_atomic_ref should not be defined before c++2a" # endif # ifdef __cpp_lib_bind_front # error "__cpp_lib_bind_front should not be defined before c++2a" # endif # ifdef __cpp_lib_bit_cast # error "__cpp_lib_bit_cast should not be defined before c++2a" # endif # ifdef __cpp_lib_bool_constant # error "__cpp_lib_bool_constant should not be defined before c++17" # endif # ifdef __cpp_lib_boyer_moore_searcher # error "__cpp_lib_boyer_moore_searcher should not be defined before c++17" # endif # ifdef __cpp_lib_byte # error "__cpp_lib_byte should not be defined before c++17" # endif # ifdef __cpp_lib_char8_t # error "__cpp_lib_char8_t should not be defined before c++2a" # endif # ifdef __cpp_lib_chrono # error "__cpp_lib_chrono should not be defined before c++17" # endif # ifdef __cpp_lib_chrono_udls # error "__cpp_lib_chrono_udls should not be defined before c++14" # endif # ifdef __cpp_lib_clamp # error "__cpp_lib_clamp should not be defined before c++17" # endif # ifdef __cpp_lib_complex_udls # error "__cpp_lib_complex_udls should not be defined before c++14" # endif # ifdef __cpp_lib_concepts # error "__cpp_lib_concepts should not be defined before c++2a" # endif # ifdef __cpp_lib_constexpr_misc # error "__cpp_lib_constexpr_misc should not be defined before c++2a" # endif # ifdef __cpp_lib_constexpr_swap_algorithms # error "__cpp_lib_constexpr_swap_algorithms should not be defined before c++2a" # endif # ifdef __cpp_lib_destroying_delete # error "__cpp_lib_destroying_delete should not be defined before c++2a" # endif # ifdef __cpp_lib_enable_shared_from_this # error "__cpp_lib_enable_shared_from_this should not be defined before c++17" # endif # ifdef __cpp_lib_endian # error "__cpp_lib_endian should not be defined before c++2a" # endif # ifdef __cpp_lib_erase_if # error "__cpp_lib_erase_if should not be defined before c++2a" # endif # ifdef __cpp_lib_exchange_function # error "__cpp_lib_exchange_function should not be defined before c++14" # endif # ifdef __cpp_lib_execution # error "__cpp_lib_execution should not be defined before c++17" # endif # ifdef __cpp_lib_filesystem # error "__cpp_lib_filesystem should not be defined before c++17" # endif # ifdef __cpp_lib_gcd_lcm # error "__cpp_lib_gcd_lcm should not be defined before c++17" # endif # ifdef __cpp_lib_generic_associative_lookup # error "__cpp_lib_generic_associative_lookup should not be defined before c++14" # endif # ifdef __cpp_lib_generic_unordered_lookup # error "__cpp_lib_generic_unordered_lookup should not be defined before c++2a" # endif # ifdef __cpp_lib_hardware_interference_size # error "__cpp_lib_hardware_interference_size should not be defined before c++17" # endif # ifdef __cpp_lib_has_unique_object_representations # error "__cpp_lib_has_unique_object_representations should not be defined before c++17" # endif # ifdef __cpp_lib_hypot # error "__cpp_lib_hypot should not be defined before c++17" # endif # ifdef __cpp_lib_incomplete_container_elements # error "__cpp_lib_incomplete_container_elements should not be defined before c++17" # endif # ifdef __cpp_lib_integer_sequence # error "__cpp_lib_integer_sequence should not be defined before c++14" # endif # ifdef __cpp_lib_integral_constant_callable # error "__cpp_lib_integral_constant_callable should not be defined before c++14" # endif # ifdef __cpp_lib_interpolate # error "__cpp_lib_interpolate should not be defined before c++2a" # endif # ifdef __cpp_lib_invoke # error "__cpp_lib_invoke should not be defined before c++17" # endif # ifdef __cpp_lib_is_aggregate # error "__cpp_lib_is_aggregate should not be defined before c++17" # endif # ifdef __cpp_lib_is_constant_evaluated # error "__cpp_lib_is_constant_evaluated should not be defined before c++2a" # endif # ifdef __cpp_lib_is_final # error "__cpp_lib_is_final should not be defined before c++14" # endif # ifdef __cpp_lib_is_invocable # error "__cpp_lib_is_invocable should not be defined before c++17" # endif # ifdef __cpp_lib_is_null_pointer # error "__cpp_lib_is_null_pointer should not be defined before c++14" # endif # ifdef __cpp_lib_is_swappable # error "__cpp_lib_is_swappable should not be defined before c++17" # endif # ifdef __cpp_lib_launder # error "__cpp_lib_launder should not be defined before c++17" # endif # ifdef __cpp_lib_list_remove_return_type # error "__cpp_lib_list_remove_return_type should not be defined before c++2a" # endif # ifdef __cpp_lib_logical_traits # error "__cpp_lib_logical_traits should not be defined before c++17" # endif # ifdef __cpp_lib_make_from_tuple # error "__cpp_lib_make_from_tuple should not be defined before c++17" # endif # ifdef __cpp_lib_make_reverse_iterator # error "__cpp_lib_make_reverse_iterator should not be defined before c++14" # endif # ifdef __cpp_lib_make_unique # error "__cpp_lib_make_unique should not be defined before c++14" # endif # ifdef __cpp_lib_map_try_emplace # error "__cpp_lib_map_try_emplace should not be defined before c++17" # endif +# ifdef __cpp_lib_math_constants +# error "__cpp_lib_math_constants should not be defined before c++2a" +# endif + # ifdef __cpp_lib_math_special_functions # error "__cpp_lib_math_special_functions should not be defined before c++17" # endif # ifdef __cpp_lib_memory_resource # error "__cpp_lib_memory_resource should not be defined before c++17" # endif # ifdef __cpp_lib_node_extract # error "__cpp_lib_node_extract should not be defined before c++17" # endif # ifdef __cpp_lib_nonmember_container_access # error "__cpp_lib_nonmember_container_access should not be defined before c++17" # endif # ifdef __cpp_lib_not_fn # error "__cpp_lib_not_fn should not be defined before c++17" # endif # ifdef __cpp_lib_null_iterators # error "__cpp_lib_null_iterators should not be defined before c++14" # endif # ifdef __cpp_lib_optional # error "__cpp_lib_optional should not be defined before c++17" # endif # ifdef __cpp_lib_parallel_algorithm # error "__cpp_lib_parallel_algorithm should not be defined before c++17" # endif # ifdef __cpp_lib_quoted_string_io # error "__cpp_lib_quoted_string_io should not be defined before c++14" # endif # ifdef __cpp_lib_ranges # error "__cpp_lib_ranges should not be defined before c++2a" # endif # ifdef __cpp_lib_raw_memory_algorithms # error "__cpp_lib_raw_memory_algorithms should not be defined before c++17" # endif # ifdef __cpp_lib_result_of_sfinae # error "__cpp_lib_result_of_sfinae should not be defined before c++14" # endif # ifdef __cpp_lib_robust_nonmodifying_seq_ops # error "__cpp_lib_robust_nonmodifying_seq_ops should not be defined before c++14" # endif # ifdef __cpp_lib_sample # error "__cpp_lib_sample should not be defined before c++17" # endif # ifdef __cpp_lib_scoped_lock # error "__cpp_lib_scoped_lock should not be defined before c++17" # endif # ifdef __cpp_lib_shared_mutex # error "__cpp_lib_shared_mutex should not be defined before c++17" # endif # ifdef __cpp_lib_shared_ptr_arrays # error "__cpp_lib_shared_ptr_arrays should not be defined before c++17" # endif # ifdef __cpp_lib_shared_ptr_weak_type # error "__cpp_lib_shared_ptr_weak_type should not be defined before c++17" # endif # ifdef __cpp_lib_shared_timed_mutex # error "__cpp_lib_shared_timed_mutex should not be defined before c++14" # endif # ifdef __cpp_lib_span # error "__cpp_lib_span should not be defined before c++2a" # endif # ifdef __cpp_lib_string_udls # error "__cpp_lib_string_udls should not be defined before c++14" # endif # ifdef __cpp_lib_string_view # error "__cpp_lib_string_view should not be defined before c++17" # endif # ifdef __cpp_lib_three_way_comparison # error "__cpp_lib_three_way_comparison should not be defined before c++2a" # endif # ifdef __cpp_lib_to_array # error "__cpp_lib_to_array should not be defined before c++2a" # endif # ifdef __cpp_lib_to_chars # error "__cpp_lib_to_chars should not be defined before c++17" # endif # ifdef __cpp_lib_transformation_trait_aliases # error "__cpp_lib_transformation_trait_aliases should not be defined before c++14" # endif # ifdef __cpp_lib_transparent_operators # error "__cpp_lib_transparent_operators should not be defined before c++14" # endif # ifdef __cpp_lib_tuple_element_t # error "__cpp_lib_tuple_element_t should not be defined before c++14" # endif # ifdef __cpp_lib_tuples_by_type # error "__cpp_lib_tuples_by_type should not be defined before c++14" # endif # ifdef __cpp_lib_type_trait_variable_templates # error "__cpp_lib_type_trait_variable_templates should not be defined before c++17" # endif # ifdef __cpp_lib_uncaught_exceptions # error "__cpp_lib_uncaught_exceptions should not be defined before c++17" # endif # ifdef __cpp_lib_unordered_map_try_emplace # error "__cpp_lib_unordered_map_try_emplace should not be defined before c++17" # endif # ifdef __cpp_lib_variant # error "__cpp_lib_variant should not be defined before c++17" # endif # ifdef __cpp_lib_void_t # error "__cpp_lib_void_t should not be defined before c++17" # endif #elif TEST_STD_VER == 14 # ifdef __cpp_lib_addressof_constexpr # error "__cpp_lib_addressof_constexpr should not be defined before c++17" # endif # ifdef __cpp_lib_allocator_traits_is_always_equal # error "__cpp_lib_allocator_traits_is_always_equal should not be defined before c++17" # endif # ifdef __cpp_lib_any # error "__cpp_lib_any should not be defined before c++17" # endif # ifdef __cpp_lib_apply # error "__cpp_lib_apply should not be defined before c++17" # endif # ifdef __cpp_lib_array_constexpr # error "__cpp_lib_array_constexpr should not be defined before c++17" # endif # ifdef __cpp_lib_as_const # error "__cpp_lib_as_const should not be defined before c++17" # endif # ifdef __cpp_lib_atomic_is_always_lock_free # error "__cpp_lib_atomic_is_always_lock_free should not be defined before c++17" # endif # ifdef __cpp_lib_atomic_ref # error "__cpp_lib_atomic_ref should not be defined before c++2a" # endif # ifdef __cpp_lib_bind_front # error "__cpp_lib_bind_front should not be defined before c++2a" # endif # ifdef __cpp_lib_bit_cast # error "__cpp_lib_bit_cast should not be defined before c++2a" # endif # ifdef __cpp_lib_bool_constant # error "__cpp_lib_bool_constant should not be defined before c++17" # endif # ifdef __cpp_lib_boyer_moore_searcher # error "__cpp_lib_boyer_moore_searcher should not be defined before c++17" # endif # ifdef __cpp_lib_byte # error "__cpp_lib_byte should not be defined before c++17" # endif # ifdef __cpp_lib_char8_t # error "__cpp_lib_char8_t should not be defined before c++2a" # endif # ifdef __cpp_lib_chrono # error "__cpp_lib_chrono should not be defined before c++17" # endif # ifndef __cpp_lib_chrono_udls # error "__cpp_lib_chrono_udls should be defined in c++14" # endif # if __cpp_lib_chrono_udls != 201304L # error "__cpp_lib_chrono_udls should have the value 201304L in c++14" # endif # ifdef __cpp_lib_clamp # error "__cpp_lib_clamp should not be defined before c++17" # endif # ifndef __cpp_lib_complex_udls # error "__cpp_lib_complex_udls should be defined in c++14" # endif # if __cpp_lib_complex_udls != 201309L # error "__cpp_lib_complex_udls should have the value 201309L in c++14" # endif # ifdef __cpp_lib_concepts # error "__cpp_lib_concepts should not be defined before c++2a" # endif # ifdef __cpp_lib_constexpr_misc # error "__cpp_lib_constexpr_misc should not be defined before c++2a" # endif # ifdef __cpp_lib_constexpr_swap_algorithms # error "__cpp_lib_constexpr_swap_algorithms should not be defined before c++2a" # endif # ifdef __cpp_lib_destroying_delete # error "__cpp_lib_destroying_delete should not be defined before c++2a" # endif # ifdef __cpp_lib_enable_shared_from_this # error "__cpp_lib_enable_shared_from_this should not be defined before c++17" # endif # ifdef __cpp_lib_endian # error "__cpp_lib_endian should not be defined before c++2a" # endif # ifdef __cpp_lib_erase_if # error "__cpp_lib_erase_if should not be defined before c++2a" # endif # ifndef __cpp_lib_exchange_function # error "__cpp_lib_exchange_function should be defined in c++14" # endif # if __cpp_lib_exchange_function != 201304L # error "__cpp_lib_exchange_function should have the value 201304L in c++14" # endif # ifdef __cpp_lib_execution # error "__cpp_lib_execution should not be defined before c++17" # endif # ifdef __cpp_lib_filesystem # error "__cpp_lib_filesystem should not be defined before c++17" # endif # ifdef __cpp_lib_gcd_lcm # error "__cpp_lib_gcd_lcm should not be defined before c++17" # endif # ifndef __cpp_lib_generic_associative_lookup # error "__cpp_lib_generic_associative_lookup should be defined in c++14" # endif # if __cpp_lib_generic_associative_lookup != 201304L # error "__cpp_lib_generic_associative_lookup should have the value 201304L in c++14" # endif # ifdef __cpp_lib_generic_unordered_lookup # error "__cpp_lib_generic_unordered_lookup should not be defined before c++2a" # endif # ifdef __cpp_lib_hardware_interference_size # error "__cpp_lib_hardware_interference_size should not be defined before c++17" # endif # ifdef __cpp_lib_has_unique_object_representations # error "__cpp_lib_has_unique_object_representations should not be defined before c++17" # endif # ifdef __cpp_lib_hypot # error "__cpp_lib_hypot should not be defined before c++17" # endif # ifdef __cpp_lib_incomplete_container_elements # error "__cpp_lib_incomplete_container_elements should not be defined before c++17" # endif # ifndef __cpp_lib_integer_sequence # error "__cpp_lib_integer_sequence should be defined in c++14" # endif # if __cpp_lib_integer_sequence != 201304L # error "__cpp_lib_integer_sequence should have the value 201304L in c++14" # endif # ifndef __cpp_lib_integral_constant_callable # error "__cpp_lib_integral_constant_callable should be defined in c++14" # endif # if __cpp_lib_integral_constant_callable != 201304L # error "__cpp_lib_integral_constant_callable should have the value 201304L in c++14" # endif # ifdef __cpp_lib_interpolate # error "__cpp_lib_interpolate should not be defined before c++2a" # endif # ifdef __cpp_lib_invoke # error "__cpp_lib_invoke should not be defined before c++17" # endif # ifdef __cpp_lib_is_aggregate # error "__cpp_lib_is_aggregate should not be defined before c++17" # endif # ifdef __cpp_lib_is_constant_evaluated # error "__cpp_lib_is_constant_evaluated should not be defined before c++2a" # endif # ifndef __cpp_lib_is_final # error "__cpp_lib_is_final should be defined in c++14" # endif # if __cpp_lib_is_final != 201402L # error "__cpp_lib_is_final should have the value 201402L in c++14" # endif # ifdef __cpp_lib_is_invocable # error "__cpp_lib_is_invocable should not be defined before c++17" # endif # ifndef __cpp_lib_is_null_pointer # error "__cpp_lib_is_null_pointer should be defined in c++14" # endif # if __cpp_lib_is_null_pointer != 201309L # error "__cpp_lib_is_null_pointer should have the value 201309L in c++14" # endif # ifdef __cpp_lib_is_swappable # error "__cpp_lib_is_swappable should not be defined before c++17" # endif # ifdef __cpp_lib_launder # error "__cpp_lib_launder should not be defined before c++17" # endif # ifdef __cpp_lib_list_remove_return_type # error "__cpp_lib_list_remove_return_type should not be defined before c++2a" # endif # ifdef __cpp_lib_logical_traits # error "__cpp_lib_logical_traits should not be defined before c++17" # endif # ifdef __cpp_lib_make_from_tuple # error "__cpp_lib_make_from_tuple should not be defined before c++17" # endif # ifndef __cpp_lib_make_reverse_iterator # error "__cpp_lib_make_reverse_iterator should be defined in c++14" # endif # if __cpp_lib_make_reverse_iterator != 201402L # error "__cpp_lib_make_reverse_iterator should have the value 201402L in c++14" # endif # ifndef __cpp_lib_make_unique # error "__cpp_lib_make_unique should be defined in c++14" # endif # if __cpp_lib_make_unique != 201304L # error "__cpp_lib_make_unique should have the value 201304L in c++14" # endif # ifdef __cpp_lib_map_try_emplace # error "__cpp_lib_map_try_emplace should not be defined before c++17" # endif +# ifdef __cpp_lib_math_constants +# error "__cpp_lib_math_constants should not be defined before c++2a" +# endif + # ifdef __cpp_lib_math_special_functions # error "__cpp_lib_math_special_functions should not be defined before c++17" # endif # ifdef __cpp_lib_memory_resource # error "__cpp_lib_memory_resource should not be defined before c++17" # endif # ifdef __cpp_lib_node_extract # error "__cpp_lib_node_extract should not be defined before c++17" # endif # ifdef __cpp_lib_nonmember_container_access # error "__cpp_lib_nonmember_container_access should not be defined before c++17" # endif # ifdef __cpp_lib_not_fn # error "__cpp_lib_not_fn should not be defined before c++17" # endif # ifndef __cpp_lib_null_iterators # error "__cpp_lib_null_iterators should be defined in c++14" # endif # if __cpp_lib_null_iterators != 201304L # error "__cpp_lib_null_iterators should have the value 201304L in c++14" # endif # ifdef __cpp_lib_optional # error "__cpp_lib_optional should not be defined before c++17" # endif # ifdef __cpp_lib_parallel_algorithm # error "__cpp_lib_parallel_algorithm should not be defined before c++17" # endif # ifndef __cpp_lib_quoted_string_io # error "__cpp_lib_quoted_string_io should be defined in c++14" # endif # if __cpp_lib_quoted_string_io != 201304L # error "__cpp_lib_quoted_string_io should have the value 201304L in c++14" # endif # ifdef __cpp_lib_ranges # error "__cpp_lib_ranges should not be defined before c++2a" # endif # ifdef __cpp_lib_raw_memory_algorithms # error "__cpp_lib_raw_memory_algorithms should not be defined before c++17" # endif # ifndef __cpp_lib_result_of_sfinae # error "__cpp_lib_result_of_sfinae should be defined in c++14" # endif # if __cpp_lib_result_of_sfinae != 201210L # error "__cpp_lib_result_of_sfinae should have the value 201210L in c++14" # endif # ifndef __cpp_lib_robust_nonmodifying_seq_ops # error "__cpp_lib_robust_nonmodifying_seq_ops should be defined in c++14" # endif # if __cpp_lib_robust_nonmodifying_seq_ops != 201304L # error "__cpp_lib_robust_nonmodifying_seq_ops should have the value 201304L in c++14" # endif # ifdef __cpp_lib_sample # error "__cpp_lib_sample should not be defined before c++17" # endif # ifdef __cpp_lib_scoped_lock # error "__cpp_lib_scoped_lock should not be defined before c++17" # endif # ifdef __cpp_lib_shared_mutex # error "__cpp_lib_shared_mutex should not be defined before c++17" # endif # ifdef __cpp_lib_shared_ptr_arrays # error "__cpp_lib_shared_ptr_arrays should not be defined before c++17" # endif # ifdef __cpp_lib_shared_ptr_weak_type # error "__cpp_lib_shared_ptr_weak_type should not be defined before c++17" # endif # if !defined(_LIBCPP_HAS_NO_THREADS) # ifndef __cpp_lib_shared_timed_mutex # error "__cpp_lib_shared_timed_mutex should be defined in c++14" # endif # if __cpp_lib_shared_timed_mutex != 201402L # error "__cpp_lib_shared_timed_mutex should have the value 201402L in c++14" # endif # else # ifdef __cpp_lib_shared_timed_mutex # error "__cpp_lib_shared_timed_mutex should not be defined when !defined(_LIBCPP_HAS_NO_THREADS) is not defined!" # endif # endif # ifdef __cpp_lib_span # error "__cpp_lib_span should not be defined before c++2a" # endif # ifndef __cpp_lib_string_udls # error "__cpp_lib_string_udls should be defined in c++14" # endif # if __cpp_lib_string_udls != 201304L # error "__cpp_lib_string_udls should have the value 201304L in c++14" # endif # ifdef __cpp_lib_string_view # error "__cpp_lib_string_view should not be defined before c++17" # endif # ifdef __cpp_lib_three_way_comparison # error "__cpp_lib_three_way_comparison should not be defined before c++2a" # endif # ifdef __cpp_lib_to_array # error "__cpp_lib_to_array should not be defined before c++2a" # endif # ifdef __cpp_lib_to_chars # error "__cpp_lib_to_chars should not be defined before c++17" # endif # ifndef __cpp_lib_transformation_trait_aliases # error "__cpp_lib_transformation_trait_aliases should be defined in c++14" # endif # if __cpp_lib_transformation_trait_aliases != 201304L # error "__cpp_lib_transformation_trait_aliases should have the value 201304L in c++14" # endif # ifndef __cpp_lib_transparent_operators # error "__cpp_lib_transparent_operators should be defined in c++14" # endif # if __cpp_lib_transparent_operators != 201210L # error "__cpp_lib_transparent_operators should have the value 201210L in c++14" # endif # ifndef __cpp_lib_tuple_element_t # error "__cpp_lib_tuple_element_t should be defined in c++14" # endif # if __cpp_lib_tuple_element_t != 201402L # error "__cpp_lib_tuple_element_t should have the value 201402L in c++14" # endif # ifndef __cpp_lib_tuples_by_type # error "__cpp_lib_tuples_by_type should be defined in c++14" # endif # if __cpp_lib_tuples_by_type != 201304L # error "__cpp_lib_tuples_by_type should have the value 201304L in c++14" # endif # ifdef __cpp_lib_type_trait_variable_templates # error "__cpp_lib_type_trait_variable_templates should not be defined before c++17" # endif # ifdef __cpp_lib_uncaught_exceptions # error "__cpp_lib_uncaught_exceptions should not be defined before c++17" # endif # ifdef __cpp_lib_unordered_map_try_emplace # error "__cpp_lib_unordered_map_try_emplace should not be defined before c++17" # endif # ifdef __cpp_lib_variant # error "__cpp_lib_variant should not be defined before c++17" # endif # ifdef __cpp_lib_void_t # error "__cpp_lib_void_t should not be defined before c++17" # endif #elif TEST_STD_VER == 17 # if TEST_HAS_BUILTIN(__builtin_addressof) || TEST_GCC_VER >= 700 # ifndef __cpp_lib_addressof_constexpr # error "__cpp_lib_addressof_constexpr should be defined in c++17" # endif # if __cpp_lib_addressof_constexpr != 201603L # error "__cpp_lib_addressof_constexpr should have the value 201603L in c++17" # endif # else # ifdef __cpp_lib_addressof_constexpr # error "__cpp_lib_addressof_constexpr should not be defined when TEST_HAS_BUILTIN(__builtin_addressof) || TEST_GCC_VER >= 700 is not defined!" # endif # endif # ifndef __cpp_lib_allocator_traits_is_always_equal # error "__cpp_lib_allocator_traits_is_always_equal should be defined in c++17" # endif # if __cpp_lib_allocator_traits_is_always_equal != 201411L # error "__cpp_lib_allocator_traits_is_always_equal should have the value 201411L in c++17" # endif # ifndef __cpp_lib_any # error "__cpp_lib_any should be defined in c++17" # endif # if __cpp_lib_any != 201606L # error "__cpp_lib_any should have the value 201606L in c++17" # endif # ifndef __cpp_lib_apply # error "__cpp_lib_apply should be defined in c++17" # endif # if __cpp_lib_apply != 201603L # error "__cpp_lib_apply should have the value 201603L in c++17" # endif # ifndef __cpp_lib_array_constexpr # error "__cpp_lib_array_constexpr should be defined in c++17" # endif # if __cpp_lib_array_constexpr != 201603L # error "__cpp_lib_array_constexpr should have the value 201603L in c++17" # endif # ifndef __cpp_lib_as_const # error "__cpp_lib_as_const should be defined in c++17" # endif # if __cpp_lib_as_const != 201510L # error "__cpp_lib_as_const should have the value 201510L in c++17" # endif # if !defined(_LIBCPP_HAS_NO_THREADS) # ifndef __cpp_lib_atomic_is_always_lock_free # error "__cpp_lib_atomic_is_always_lock_free should be defined in c++17" # endif # if __cpp_lib_atomic_is_always_lock_free != 201603L # error "__cpp_lib_atomic_is_always_lock_free should have the value 201603L in c++17" # endif # else # ifdef __cpp_lib_atomic_is_always_lock_free # error "__cpp_lib_atomic_is_always_lock_free should not be defined when !defined(_LIBCPP_HAS_NO_THREADS) is not defined!" # endif # endif # ifdef __cpp_lib_atomic_ref # error "__cpp_lib_atomic_ref should not be defined before c++2a" # endif # ifdef __cpp_lib_bind_front # error "__cpp_lib_bind_front should not be defined before c++2a" # endif # ifdef __cpp_lib_bit_cast # error "__cpp_lib_bit_cast should not be defined before c++2a" # endif # ifndef __cpp_lib_bool_constant # error "__cpp_lib_bool_constant should be defined in c++17" # endif # if __cpp_lib_bool_constant != 201505L # error "__cpp_lib_bool_constant should have the value 201505L in c++17" # endif # if !defined(_LIBCPP_VERSION) # ifndef __cpp_lib_boyer_moore_searcher # error "__cpp_lib_boyer_moore_searcher should be defined in c++17" # endif # if __cpp_lib_boyer_moore_searcher != 201603L # error "__cpp_lib_boyer_moore_searcher should have the value 201603L in c++17" # endif # else // _LIBCPP_VERSION # ifdef __cpp_lib_boyer_moore_searcher # error "__cpp_lib_boyer_moore_searcher should not be defined because it is unimplemented in libc++!" # endif # endif # ifndef __cpp_lib_byte # error "__cpp_lib_byte should be defined in c++17" # endif # if __cpp_lib_byte != 201603L # error "__cpp_lib_byte should have the value 201603L in c++17" # endif # ifdef __cpp_lib_char8_t # error "__cpp_lib_char8_t should not be defined before c++2a" # endif # ifndef __cpp_lib_chrono # error "__cpp_lib_chrono should be defined in c++17" # endif # if __cpp_lib_chrono != 201611L # error "__cpp_lib_chrono should have the value 201611L in c++17" # endif # ifndef __cpp_lib_chrono_udls # error "__cpp_lib_chrono_udls should be defined in c++17" # endif # if __cpp_lib_chrono_udls != 201304L # error "__cpp_lib_chrono_udls should have the value 201304L in c++17" # endif # ifndef __cpp_lib_clamp # error "__cpp_lib_clamp should be defined in c++17" # endif # if __cpp_lib_clamp != 201603L # error "__cpp_lib_clamp should have the value 201603L in c++17" # endif # ifndef __cpp_lib_complex_udls # error "__cpp_lib_complex_udls should be defined in c++17" # endif # if __cpp_lib_complex_udls != 201309L # error "__cpp_lib_complex_udls should have the value 201309L in c++17" # endif # ifdef __cpp_lib_concepts # error "__cpp_lib_concepts should not be defined before c++2a" # endif # ifdef __cpp_lib_constexpr_misc # error "__cpp_lib_constexpr_misc should not be defined before c++2a" # endif # ifdef __cpp_lib_constexpr_swap_algorithms # error "__cpp_lib_constexpr_swap_algorithms should not be defined before c++2a" # endif # ifdef __cpp_lib_destroying_delete # error "__cpp_lib_destroying_delete should not be defined before c++2a" # endif # ifndef __cpp_lib_enable_shared_from_this # error "__cpp_lib_enable_shared_from_this should be defined in c++17" # endif # if __cpp_lib_enable_shared_from_this != 201603L # error "__cpp_lib_enable_shared_from_this should have the value 201603L in c++17" # endif # ifdef __cpp_lib_endian # error "__cpp_lib_endian should not be defined before c++2a" # endif # ifdef __cpp_lib_erase_if # error "__cpp_lib_erase_if should not be defined before c++2a" # endif # ifndef __cpp_lib_exchange_function # error "__cpp_lib_exchange_function should be defined in c++17" # endif # if __cpp_lib_exchange_function != 201304L # error "__cpp_lib_exchange_function should have the value 201304L in c++17" # endif # if !defined(_LIBCPP_VERSION) # ifndef __cpp_lib_execution # error "__cpp_lib_execution should be defined in c++17" # endif # if __cpp_lib_execution != 201603L # error "__cpp_lib_execution should have the value 201603L in c++17" # endif # else // _LIBCPP_VERSION # ifdef __cpp_lib_execution # error "__cpp_lib_execution should not be defined because it is unimplemented in libc++!" # endif # endif # ifndef __cpp_lib_filesystem # error "__cpp_lib_filesystem should be defined in c++17" # endif # if __cpp_lib_filesystem != 201703L # error "__cpp_lib_filesystem should have the value 201703L in c++17" # endif # ifndef __cpp_lib_gcd_lcm # error "__cpp_lib_gcd_lcm should be defined in c++17" # endif # if __cpp_lib_gcd_lcm != 201606L # error "__cpp_lib_gcd_lcm should have the value 201606L in c++17" # endif # ifndef __cpp_lib_generic_associative_lookup # error "__cpp_lib_generic_associative_lookup should be defined in c++17" # endif # if __cpp_lib_generic_associative_lookup != 201304L # error "__cpp_lib_generic_associative_lookup should have the value 201304L in c++17" # endif # ifdef __cpp_lib_generic_unordered_lookup # error "__cpp_lib_generic_unordered_lookup should not be defined before c++2a" # endif # if !defined(_LIBCPP_VERSION) # ifndef __cpp_lib_hardware_interference_size # error "__cpp_lib_hardware_interference_size should be defined in c++17" # endif # if __cpp_lib_hardware_interference_size != 201703L # error "__cpp_lib_hardware_interference_size should have the value 201703L in c++17" # endif # else // _LIBCPP_VERSION # ifdef __cpp_lib_hardware_interference_size # error "__cpp_lib_hardware_interference_size should not be defined because it is unimplemented in libc++!" # endif # endif # if TEST_HAS_BUILTIN_IDENTIFIER(__has_unique_object_representations) || TEST_GCC_VER >= 700 # ifndef __cpp_lib_has_unique_object_representations # error "__cpp_lib_has_unique_object_representations should be defined in c++17" # endif # if __cpp_lib_has_unique_object_representations != 201606L # error "__cpp_lib_has_unique_object_representations should have the value 201606L in c++17" # endif # else # ifdef __cpp_lib_has_unique_object_representations # error "__cpp_lib_has_unique_object_representations should not be defined when TEST_HAS_BUILTIN_IDENTIFIER(__has_unique_object_representations) || TEST_GCC_VER >= 700 is not defined!" # endif # endif # ifndef __cpp_lib_hypot # error "__cpp_lib_hypot should be defined in c++17" # endif # if __cpp_lib_hypot != 201603L # error "__cpp_lib_hypot should have the value 201603L in c++17" # endif # ifndef __cpp_lib_incomplete_container_elements # error "__cpp_lib_incomplete_container_elements should be defined in c++17" # endif # if __cpp_lib_incomplete_container_elements != 201505L # error "__cpp_lib_incomplete_container_elements should have the value 201505L in c++17" # endif # ifndef __cpp_lib_integer_sequence # error "__cpp_lib_integer_sequence should be defined in c++17" # endif # if __cpp_lib_integer_sequence != 201304L # error "__cpp_lib_integer_sequence should have the value 201304L in c++17" # endif # ifndef __cpp_lib_integral_constant_callable # error "__cpp_lib_integral_constant_callable should be defined in c++17" # endif # if __cpp_lib_integral_constant_callable != 201304L # error "__cpp_lib_integral_constant_callable should have the value 201304L in c++17" # endif # ifdef __cpp_lib_interpolate # error "__cpp_lib_interpolate should not be defined before c++2a" # endif # ifndef __cpp_lib_invoke # error "__cpp_lib_invoke should be defined in c++17" # endif # if __cpp_lib_invoke != 201411L # error "__cpp_lib_invoke should have the value 201411L in c++17" # endif # if TEST_HAS_BUILTIN_IDENTIFIER(__is_aggregate) || TEST_GCC_VER_NEW >= 7001 # ifndef __cpp_lib_is_aggregate # error "__cpp_lib_is_aggregate should be defined in c++17" # endif # if __cpp_lib_is_aggregate != 201703L # error "__cpp_lib_is_aggregate should have the value 201703L in c++17" # endif # else # ifdef __cpp_lib_is_aggregate # error "__cpp_lib_is_aggregate should not be defined when TEST_HAS_BUILTIN_IDENTIFIER(__is_aggregate) || TEST_GCC_VER_NEW >= 7001 is not defined!" # endif # endif # ifdef __cpp_lib_is_constant_evaluated # error "__cpp_lib_is_constant_evaluated should not be defined before c++2a" # endif # ifndef __cpp_lib_is_final # error "__cpp_lib_is_final should be defined in c++17" # endif # if __cpp_lib_is_final != 201402L # error "__cpp_lib_is_final should have the value 201402L in c++17" # endif # ifndef __cpp_lib_is_invocable # error "__cpp_lib_is_invocable should be defined in c++17" # endif # if __cpp_lib_is_invocable != 201703L # error "__cpp_lib_is_invocable should have the value 201703L in c++17" # endif # ifndef __cpp_lib_is_null_pointer # error "__cpp_lib_is_null_pointer should be defined in c++17" # endif # if __cpp_lib_is_null_pointer != 201309L # error "__cpp_lib_is_null_pointer should have the value 201309L in c++17" # endif # ifndef __cpp_lib_is_swappable # error "__cpp_lib_is_swappable should be defined in c++17" # endif # if __cpp_lib_is_swappable != 201603L # error "__cpp_lib_is_swappable should have the value 201603L in c++17" # endif # ifndef __cpp_lib_launder # error "__cpp_lib_launder should be defined in c++17" # endif # if __cpp_lib_launder != 201606L # error "__cpp_lib_launder should have the value 201606L in c++17" # endif # ifdef __cpp_lib_list_remove_return_type # error "__cpp_lib_list_remove_return_type should not be defined before c++2a" # endif # ifndef __cpp_lib_logical_traits # error "__cpp_lib_logical_traits should be defined in c++17" # endif # if __cpp_lib_logical_traits != 201510L # error "__cpp_lib_logical_traits should have the value 201510L in c++17" # endif # ifndef __cpp_lib_make_from_tuple # error "__cpp_lib_make_from_tuple should be defined in c++17" # endif # if __cpp_lib_make_from_tuple != 201606L # error "__cpp_lib_make_from_tuple should have the value 201606L in c++17" # endif # ifndef __cpp_lib_make_reverse_iterator # error "__cpp_lib_make_reverse_iterator should be defined in c++17" # endif # if __cpp_lib_make_reverse_iterator != 201402L # error "__cpp_lib_make_reverse_iterator should have the value 201402L in c++17" # endif # ifndef __cpp_lib_make_unique # error "__cpp_lib_make_unique should be defined in c++17" # endif # if __cpp_lib_make_unique != 201304L # error "__cpp_lib_make_unique should have the value 201304L in c++17" # endif # ifndef __cpp_lib_map_try_emplace # error "__cpp_lib_map_try_emplace should be defined in c++17" # endif # if __cpp_lib_map_try_emplace != 201411L # error "__cpp_lib_map_try_emplace should have the value 201411L in c++17" # endif +# ifdef __cpp_lib_math_constants +# error "__cpp_lib_math_constants should not be defined before c++2a" +# endif + # if !defined(_LIBCPP_VERSION) # ifndef __cpp_lib_math_special_functions # error "__cpp_lib_math_special_functions should be defined in c++17" # endif # if __cpp_lib_math_special_functions != 201603L # error "__cpp_lib_math_special_functions should have the value 201603L in c++17" # endif # else // _LIBCPP_VERSION # ifdef __cpp_lib_math_special_functions # error "__cpp_lib_math_special_functions should not be defined because it is unimplemented in libc++!" # endif # endif # if !defined(_LIBCPP_VERSION) # ifndef __cpp_lib_memory_resource # error "__cpp_lib_memory_resource should be defined in c++17" # endif # if __cpp_lib_memory_resource != 201603L # error "__cpp_lib_memory_resource should have the value 201603L in c++17" # endif # else // _LIBCPP_VERSION # ifdef __cpp_lib_memory_resource # error "__cpp_lib_memory_resource should not be defined because it is unimplemented in libc++!" # endif # endif # ifndef __cpp_lib_node_extract # error "__cpp_lib_node_extract should be defined in c++17" # endif # if __cpp_lib_node_extract != 201606L # error "__cpp_lib_node_extract should have the value 201606L in c++17" # endif # ifndef __cpp_lib_nonmember_container_access # error "__cpp_lib_nonmember_container_access should be defined in c++17" # endif # if __cpp_lib_nonmember_container_access != 201411L # error "__cpp_lib_nonmember_container_access should have the value 201411L in c++17" # endif # ifndef __cpp_lib_not_fn # error "__cpp_lib_not_fn should be defined in c++17" # endif # if __cpp_lib_not_fn != 201603L # error "__cpp_lib_not_fn should have the value 201603L in c++17" # endif # ifndef __cpp_lib_null_iterators # error "__cpp_lib_null_iterators should be defined in c++17" # endif # if __cpp_lib_null_iterators != 201304L # error "__cpp_lib_null_iterators should have the value 201304L in c++17" # endif # ifndef __cpp_lib_optional # error "__cpp_lib_optional should be defined in c++17" # endif # if __cpp_lib_optional != 201606L # error "__cpp_lib_optional should have the value 201606L in c++17" # endif # if !defined(_LIBCPP_VERSION) # ifndef __cpp_lib_parallel_algorithm # error "__cpp_lib_parallel_algorithm should be defined in c++17" # endif # if __cpp_lib_parallel_algorithm != 201603L # error "__cpp_lib_parallel_algorithm should have the value 201603L in c++17" # endif # else // _LIBCPP_VERSION # ifdef __cpp_lib_parallel_algorithm # error "__cpp_lib_parallel_algorithm should not be defined because it is unimplemented in libc++!" # endif # endif # ifndef __cpp_lib_quoted_string_io # error "__cpp_lib_quoted_string_io should be defined in c++17" # endif # if __cpp_lib_quoted_string_io != 201304L # error "__cpp_lib_quoted_string_io should have the value 201304L in c++17" # endif # ifdef __cpp_lib_ranges # error "__cpp_lib_ranges should not be defined before c++2a" # endif # ifndef __cpp_lib_raw_memory_algorithms # error "__cpp_lib_raw_memory_algorithms should be defined in c++17" # endif # if __cpp_lib_raw_memory_algorithms != 201606L # error "__cpp_lib_raw_memory_algorithms should have the value 201606L in c++17" # endif # ifndef __cpp_lib_result_of_sfinae # error "__cpp_lib_result_of_sfinae should be defined in c++17" # endif # if __cpp_lib_result_of_sfinae != 201210L # error "__cpp_lib_result_of_sfinae should have the value 201210L in c++17" # endif # ifndef __cpp_lib_robust_nonmodifying_seq_ops # error "__cpp_lib_robust_nonmodifying_seq_ops should be defined in c++17" # endif # if __cpp_lib_robust_nonmodifying_seq_ops != 201304L # error "__cpp_lib_robust_nonmodifying_seq_ops should have the value 201304L in c++17" # endif # ifndef __cpp_lib_sample # error "__cpp_lib_sample should be defined in c++17" # endif # if __cpp_lib_sample != 201603L # error "__cpp_lib_sample should have the value 201603L in c++17" # endif # ifndef __cpp_lib_scoped_lock # error "__cpp_lib_scoped_lock should be defined in c++17" # endif # if __cpp_lib_scoped_lock != 201703L # error "__cpp_lib_scoped_lock should have the value 201703L in c++17" # endif # if !defined(_LIBCPP_HAS_NO_THREADS) # ifndef __cpp_lib_shared_mutex # error "__cpp_lib_shared_mutex should be defined in c++17" # endif # if __cpp_lib_shared_mutex != 201505L # error "__cpp_lib_shared_mutex should have the value 201505L in c++17" # endif # else # ifdef __cpp_lib_shared_mutex # error "__cpp_lib_shared_mutex should not be defined when !defined(_LIBCPP_HAS_NO_THREADS) is not defined!" # endif # endif # if !defined(_LIBCPP_VERSION) # ifndef __cpp_lib_shared_ptr_arrays # error "__cpp_lib_shared_ptr_arrays should be defined in c++17" # endif # if __cpp_lib_shared_ptr_arrays != 201611L # error "__cpp_lib_shared_ptr_arrays should have the value 201611L in c++17" # endif # else // _LIBCPP_VERSION # ifdef __cpp_lib_shared_ptr_arrays # error "__cpp_lib_shared_ptr_arrays should not be defined because it is unimplemented in libc++!" # endif # endif # ifndef __cpp_lib_shared_ptr_weak_type # error "__cpp_lib_shared_ptr_weak_type should be defined in c++17" # endif # if __cpp_lib_shared_ptr_weak_type != 201606L # error "__cpp_lib_shared_ptr_weak_type should have the value 201606L in c++17" # endif # if !defined(_LIBCPP_HAS_NO_THREADS) # ifndef __cpp_lib_shared_timed_mutex # error "__cpp_lib_shared_timed_mutex should be defined in c++17" # endif # if __cpp_lib_shared_timed_mutex != 201402L # error "__cpp_lib_shared_timed_mutex should have the value 201402L in c++17" # endif # else # ifdef __cpp_lib_shared_timed_mutex # error "__cpp_lib_shared_timed_mutex should not be defined when !defined(_LIBCPP_HAS_NO_THREADS) is not defined!" # endif # endif # ifdef __cpp_lib_span # error "__cpp_lib_span should not be defined before c++2a" # endif # ifndef __cpp_lib_string_udls # error "__cpp_lib_string_udls should be defined in c++17" # endif # if __cpp_lib_string_udls != 201304L # error "__cpp_lib_string_udls should have the value 201304L in c++17" # endif # ifndef __cpp_lib_string_view # error "__cpp_lib_string_view should be defined in c++17" # endif # if __cpp_lib_string_view != 201606L # error "__cpp_lib_string_view should have the value 201606L in c++17" # endif # ifdef __cpp_lib_three_way_comparison # error "__cpp_lib_three_way_comparison should not be defined before c++2a" # endif # ifdef __cpp_lib_to_array # error "__cpp_lib_to_array should not be defined before c++2a" # endif # if !defined(_LIBCPP_VERSION) # ifndef __cpp_lib_to_chars # error "__cpp_lib_to_chars should be defined in c++17" # endif # if __cpp_lib_to_chars != 201611L # error "__cpp_lib_to_chars should have the value 201611L in c++17" # endif # else // _LIBCPP_VERSION # ifdef __cpp_lib_to_chars # error "__cpp_lib_to_chars should not be defined because it is unimplemented in libc++!" # endif # endif # ifndef __cpp_lib_transformation_trait_aliases # error "__cpp_lib_transformation_trait_aliases should be defined in c++17" # endif # if __cpp_lib_transformation_trait_aliases != 201304L # error "__cpp_lib_transformation_trait_aliases should have the value 201304L in c++17" # endif # ifndef __cpp_lib_transparent_operators # error "__cpp_lib_transparent_operators should be defined in c++17" # endif # if __cpp_lib_transparent_operators != 201510L # error "__cpp_lib_transparent_operators should have the value 201510L in c++17" # endif # ifndef __cpp_lib_tuple_element_t # error "__cpp_lib_tuple_element_t should be defined in c++17" # endif # if __cpp_lib_tuple_element_t != 201402L # error "__cpp_lib_tuple_element_t should have the value 201402L in c++17" # endif # ifndef __cpp_lib_tuples_by_type # error "__cpp_lib_tuples_by_type should be defined in c++17" # endif # if __cpp_lib_tuples_by_type != 201304L # error "__cpp_lib_tuples_by_type should have the value 201304L in c++17" # endif # ifndef __cpp_lib_type_trait_variable_templates # error "__cpp_lib_type_trait_variable_templates should be defined in c++17" # endif # if __cpp_lib_type_trait_variable_templates != 201510L # error "__cpp_lib_type_trait_variable_templates should have the value 201510L in c++17" # endif # ifndef __cpp_lib_uncaught_exceptions # error "__cpp_lib_uncaught_exceptions should be defined in c++17" # endif # if __cpp_lib_uncaught_exceptions != 201411L # error "__cpp_lib_uncaught_exceptions should have the value 201411L in c++17" # endif # ifndef __cpp_lib_unordered_map_try_emplace # error "__cpp_lib_unordered_map_try_emplace should be defined in c++17" # endif # if __cpp_lib_unordered_map_try_emplace != 201411L # error "__cpp_lib_unordered_map_try_emplace should have the value 201411L in c++17" # endif # ifndef __cpp_lib_variant # error "__cpp_lib_variant should be defined in c++17" # endif # if __cpp_lib_variant != 201606L # error "__cpp_lib_variant should have the value 201606L in c++17" # endif # ifndef __cpp_lib_void_t # error "__cpp_lib_void_t should be defined in c++17" # endif # if __cpp_lib_void_t != 201411L # error "__cpp_lib_void_t should have the value 201411L in c++17" # endif #elif TEST_STD_VER > 17 # if TEST_HAS_BUILTIN(__builtin_addressof) || TEST_GCC_VER >= 700 # ifndef __cpp_lib_addressof_constexpr # error "__cpp_lib_addressof_constexpr should be defined in c++2a" # endif # if __cpp_lib_addressof_constexpr != 201603L # error "__cpp_lib_addressof_constexpr should have the value 201603L in c++2a" # endif # else # ifdef __cpp_lib_addressof_constexpr # error "__cpp_lib_addressof_constexpr should not be defined when TEST_HAS_BUILTIN(__builtin_addressof) || TEST_GCC_VER >= 700 is not defined!" # endif # endif # ifndef __cpp_lib_allocator_traits_is_always_equal # error "__cpp_lib_allocator_traits_is_always_equal should be defined in c++2a" # endif # if __cpp_lib_allocator_traits_is_always_equal != 201411L # error "__cpp_lib_allocator_traits_is_always_equal should have the value 201411L in c++2a" # endif # ifndef __cpp_lib_any # error "__cpp_lib_any should be defined in c++2a" # endif # if __cpp_lib_any != 201606L # error "__cpp_lib_any should have the value 201606L in c++2a" # endif # ifndef __cpp_lib_apply # error "__cpp_lib_apply should be defined in c++2a" # endif # if __cpp_lib_apply != 201603L # error "__cpp_lib_apply should have the value 201603L in c++2a" # endif # ifndef __cpp_lib_array_constexpr # error "__cpp_lib_array_constexpr should be defined in c++2a" # endif # if __cpp_lib_array_constexpr != 201811L # error "__cpp_lib_array_constexpr should have the value 201811L in c++2a" # endif # ifndef __cpp_lib_as_const # error "__cpp_lib_as_const should be defined in c++2a" # endif # if __cpp_lib_as_const != 201510L # error "__cpp_lib_as_const should have the value 201510L in c++2a" # endif # if !defined(_LIBCPP_HAS_NO_THREADS) # ifndef __cpp_lib_atomic_is_always_lock_free # error "__cpp_lib_atomic_is_always_lock_free should be defined in c++2a" # endif # if __cpp_lib_atomic_is_always_lock_free != 201603L # error "__cpp_lib_atomic_is_always_lock_free should have the value 201603L in c++2a" # endif # else # ifdef __cpp_lib_atomic_is_always_lock_free # error "__cpp_lib_atomic_is_always_lock_free should not be defined when !defined(_LIBCPP_HAS_NO_THREADS) is not defined!" # endif # endif # if !defined(_LIBCPP_VERSION) # ifndef __cpp_lib_atomic_ref # error "__cpp_lib_atomic_ref should be defined in c++2a" # endif # if __cpp_lib_atomic_ref != 201806L # error "__cpp_lib_atomic_ref should have the value 201806L in c++2a" # endif # else // _LIBCPP_VERSION # ifdef __cpp_lib_atomic_ref # error "__cpp_lib_atomic_ref should not be defined because it is unimplemented in libc++!" # endif # endif # if !defined(_LIBCPP_VERSION) # ifndef __cpp_lib_bind_front # error "__cpp_lib_bind_front should be defined in c++2a" # endif # if __cpp_lib_bind_front != 201811L # error "__cpp_lib_bind_front should have the value 201811L in c++2a" # endif # else // _LIBCPP_VERSION # ifdef __cpp_lib_bind_front # error "__cpp_lib_bind_front should not be defined because it is unimplemented in libc++!" # endif # endif # if !defined(_LIBCPP_VERSION) # ifndef __cpp_lib_bit_cast # error "__cpp_lib_bit_cast should be defined in c++2a" # endif # if __cpp_lib_bit_cast != 201806L # error "__cpp_lib_bit_cast should have the value 201806L in c++2a" # endif # else // _LIBCPP_VERSION # ifdef __cpp_lib_bit_cast # error "__cpp_lib_bit_cast should not be defined because it is unimplemented in libc++!" # endif # endif # ifndef __cpp_lib_bool_constant # error "__cpp_lib_bool_constant should be defined in c++2a" # endif # if __cpp_lib_bool_constant != 201505L # error "__cpp_lib_bool_constant should have the value 201505L in c++2a" # endif # if !defined(_LIBCPP_VERSION) # ifndef __cpp_lib_boyer_moore_searcher # error "__cpp_lib_boyer_moore_searcher should be defined in c++2a" # endif # if __cpp_lib_boyer_moore_searcher != 201603L # error "__cpp_lib_boyer_moore_searcher should have the value 201603L in c++2a" # endif # else // _LIBCPP_VERSION # ifdef __cpp_lib_boyer_moore_searcher # error "__cpp_lib_boyer_moore_searcher should not be defined because it is unimplemented in libc++!" # endif # endif # ifndef __cpp_lib_byte # error "__cpp_lib_byte should be defined in c++2a" # endif # if __cpp_lib_byte != 201603L # error "__cpp_lib_byte should have the value 201603L in c++2a" # endif # if defined(__cpp_char8_t) # ifndef __cpp_lib_char8_t # error "__cpp_lib_char8_t should be defined in c++2a" # endif # if __cpp_lib_char8_t != 201811L # error "__cpp_lib_char8_t should have the value 201811L in c++2a" # endif # else # ifdef __cpp_lib_char8_t # error "__cpp_lib_char8_t should not be defined when defined(__cpp_char8_t) is not defined!" # endif # endif # ifndef __cpp_lib_chrono # error "__cpp_lib_chrono should be defined in c++2a" # endif # if __cpp_lib_chrono != 201611L # error "__cpp_lib_chrono should have the value 201611L in c++2a" # endif # ifndef __cpp_lib_chrono_udls # error "__cpp_lib_chrono_udls should be defined in c++2a" # endif # if __cpp_lib_chrono_udls != 201304L # error "__cpp_lib_chrono_udls should have the value 201304L in c++2a" # endif # ifndef __cpp_lib_clamp # error "__cpp_lib_clamp should be defined in c++2a" # endif # if __cpp_lib_clamp != 201603L # error "__cpp_lib_clamp should have the value 201603L in c++2a" # endif # ifndef __cpp_lib_complex_udls # error "__cpp_lib_complex_udls should be defined in c++2a" # endif # if __cpp_lib_complex_udls != 201309L # error "__cpp_lib_complex_udls should have the value 201309L in c++2a" # endif # if !defined(_LIBCPP_VERSION) # ifndef __cpp_lib_concepts # error "__cpp_lib_concepts should be defined in c++2a" # endif # if __cpp_lib_concepts != 201806L # error "__cpp_lib_concepts should have the value 201806L in c++2a" # endif # else // _LIBCPP_VERSION # ifdef __cpp_lib_concepts # error "__cpp_lib_concepts should not be defined because it is unimplemented in libc++!" # endif # endif # if !defined(_LIBCPP_VERSION) # ifndef __cpp_lib_constexpr_misc # error "__cpp_lib_constexpr_misc should be defined in c++2a" # endif # if __cpp_lib_constexpr_misc != 201811L # error "__cpp_lib_constexpr_misc should have the value 201811L in c++2a" # endif # else // _LIBCPP_VERSION # ifdef __cpp_lib_constexpr_misc # error "__cpp_lib_constexpr_misc should not be defined because it is unimplemented in libc++!" # endif # endif # if !defined(_LIBCPP_VERSION) # ifndef __cpp_lib_constexpr_swap_algorithms # error "__cpp_lib_constexpr_swap_algorithms should be defined in c++2a" # endif # if __cpp_lib_constexpr_swap_algorithms != 201806L # error "__cpp_lib_constexpr_swap_algorithms should have the value 201806L in c++2a" # endif # else // _LIBCPP_VERSION # ifdef __cpp_lib_constexpr_swap_algorithms # error "__cpp_lib_constexpr_swap_algorithms should not be defined because it is unimplemented in libc++!" # endif # endif # if TEST_STD_VER > 17 && defined(__cpp_impl_destroying_delete) && __cpp_impl_destroying_delete >= 201806L # ifndef __cpp_lib_destroying_delete # error "__cpp_lib_destroying_delete should be defined in c++2a" # endif # if __cpp_lib_destroying_delete != 201806L # error "__cpp_lib_destroying_delete should have the value 201806L in c++2a" # endif # else # ifdef __cpp_lib_destroying_delete # error "__cpp_lib_destroying_delete should not be defined when TEST_STD_VER > 17 && defined(__cpp_impl_destroying_delete) && __cpp_impl_destroying_delete >= 201806L is not defined!" # endif # endif # ifndef __cpp_lib_enable_shared_from_this # error "__cpp_lib_enable_shared_from_this should be defined in c++2a" # endif # if __cpp_lib_enable_shared_from_this != 201603L # error "__cpp_lib_enable_shared_from_this should have the value 201603L in c++2a" # endif # ifndef __cpp_lib_endian # error "__cpp_lib_endian should be defined in c++2a" # endif # if __cpp_lib_endian != 201907L # error "__cpp_lib_endian should have the value 201907L in c++2a" # endif # ifndef __cpp_lib_erase_if # error "__cpp_lib_erase_if should be defined in c++2a" # endif # if __cpp_lib_erase_if != 202002L # error "__cpp_lib_erase_if should have the value 202002L in c++2a" # endif # ifndef __cpp_lib_exchange_function # error "__cpp_lib_exchange_function should be defined in c++2a" # endif # if __cpp_lib_exchange_function != 201304L # error "__cpp_lib_exchange_function should have the value 201304L in c++2a" # endif # if !defined(_LIBCPP_VERSION) # ifndef __cpp_lib_execution # error "__cpp_lib_execution should be defined in c++2a" # endif # if __cpp_lib_execution != 201603L # error "__cpp_lib_execution should have the value 201603L in c++2a" # endif # else // _LIBCPP_VERSION # ifdef __cpp_lib_execution # error "__cpp_lib_execution should not be defined because it is unimplemented in libc++!" # endif # endif # ifndef __cpp_lib_filesystem # error "__cpp_lib_filesystem should be defined in c++2a" # endif # if __cpp_lib_filesystem != 201703L # error "__cpp_lib_filesystem should have the value 201703L in c++2a" # endif # ifndef __cpp_lib_gcd_lcm # error "__cpp_lib_gcd_lcm should be defined in c++2a" # endif # if __cpp_lib_gcd_lcm != 201606L # error "__cpp_lib_gcd_lcm should have the value 201606L in c++2a" # endif # ifndef __cpp_lib_generic_associative_lookup # error "__cpp_lib_generic_associative_lookup should be defined in c++2a" # endif # if __cpp_lib_generic_associative_lookup != 201304L # error "__cpp_lib_generic_associative_lookup should have the value 201304L in c++2a" # endif # if !defined(_LIBCPP_VERSION) # ifndef __cpp_lib_generic_unordered_lookup # error "__cpp_lib_generic_unordered_lookup should be defined in c++2a" # endif # if __cpp_lib_generic_unordered_lookup != 201811L # error "__cpp_lib_generic_unordered_lookup should have the value 201811L in c++2a" # endif # else // _LIBCPP_VERSION # ifdef __cpp_lib_generic_unordered_lookup # error "__cpp_lib_generic_unordered_lookup should not be defined because it is unimplemented in libc++!" # endif # endif # if !defined(_LIBCPP_VERSION) # ifndef __cpp_lib_hardware_interference_size # error "__cpp_lib_hardware_interference_size should be defined in c++2a" # endif # if __cpp_lib_hardware_interference_size != 201703L # error "__cpp_lib_hardware_interference_size should have the value 201703L in c++2a" # endif # else // _LIBCPP_VERSION # ifdef __cpp_lib_hardware_interference_size # error "__cpp_lib_hardware_interference_size should not be defined because it is unimplemented in libc++!" # endif # endif # if TEST_HAS_BUILTIN_IDENTIFIER(__has_unique_object_representations) || TEST_GCC_VER >= 700 # ifndef __cpp_lib_has_unique_object_representations # error "__cpp_lib_has_unique_object_representations should be defined in c++2a" # endif # if __cpp_lib_has_unique_object_representations != 201606L # error "__cpp_lib_has_unique_object_representations should have the value 201606L in c++2a" # endif # else # ifdef __cpp_lib_has_unique_object_representations # error "__cpp_lib_has_unique_object_representations should not be defined when TEST_HAS_BUILTIN_IDENTIFIER(__has_unique_object_representations) || TEST_GCC_VER >= 700 is not defined!" # endif # endif # ifndef __cpp_lib_hypot # error "__cpp_lib_hypot should be defined in c++2a" # endif # if __cpp_lib_hypot != 201603L # error "__cpp_lib_hypot should have the value 201603L in c++2a" # endif # ifndef __cpp_lib_incomplete_container_elements # error "__cpp_lib_incomplete_container_elements should be defined in c++2a" # endif # if __cpp_lib_incomplete_container_elements != 201505L # error "__cpp_lib_incomplete_container_elements should have the value 201505L in c++2a" # endif # ifndef __cpp_lib_integer_sequence # error "__cpp_lib_integer_sequence should be defined in c++2a" # endif # if __cpp_lib_integer_sequence != 201304L # error "__cpp_lib_integer_sequence should have the value 201304L in c++2a" # endif # ifndef __cpp_lib_integral_constant_callable # error "__cpp_lib_integral_constant_callable should be defined in c++2a" # endif # if __cpp_lib_integral_constant_callable != 201304L # error "__cpp_lib_integral_constant_callable should have the value 201304L in c++2a" # endif # ifndef __cpp_lib_interpolate # error "__cpp_lib_interpolate should be defined in c++2a" # endif # if __cpp_lib_interpolate != 201902L # error "__cpp_lib_interpolate should have the value 201902L in c++2a" # endif # ifndef __cpp_lib_invoke # error "__cpp_lib_invoke should be defined in c++2a" # endif # if __cpp_lib_invoke != 201411L # error "__cpp_lib_invoke should have the value 201411L in c++2a" # endif # if TEST_HAS_BUILTIN_IDENTIFIER(__is_aggregate) || TEST_GCC_VER_NEW >= 7001 # ifndef __cpp_lib_is_aggregate # error "__cpp_lib_is_aggregate should be defined in c++2a" # endif # if __cpp_lib_is_aggregate != 201703L # error "__cpp_lib_is_aggregate should have the value 201703L in c++2a" # endif # else # ifdef __cpp_lib_is_aggregate # error "__cpp_lib_is_aggregate should not be defined when TEST_HAS_BUILTIN_IDENTIFIER(__is_aggregate) || TEST_GCC_VER_NEW >= 7001 is not defined!" # endif # endif # if TEST_HAS_BUILTIN(__builtin_is_constant_evaluated) || TEST_GCC_VER >= 900 # ifndef __cpp_lib_is_constant_evaluated # error "__cpp_lib_is_constant_evaluated should be defined in c++2a" # endif # if __cpp_lib_is_constant_evaluated != 201811L # error "__cpp_lib_is_constant_evaluated should have the value 201811L in c++2a" # endif # else # ifdef __cpp_lib_is_constant_evaluated # error "__cpp_lib_is_constant_evaluated should not be defined when TEST_HAS_BUILTIN(__builtin_is_constant_evaluated) || TEST_GCC_VER >= 900 is not defined!" # endif # endif # ifndef __cpp_lib_is_final # error "__cpp_lib_is_final should be defined in c++2a" # endif # if __cpp_lib_is_final != 201402L # error "__cpp_lib_is_final should have the value 201402L in c++2a" # endif # ifndef __cpp_lib_is_invocable # error "__cpp_lib_is_invocable should be defined in c++2a" # endif # if __cpp_lib_is_invocable != 201703L # error "__cpp_lib_is_invocable should have the value 201703L in c++2a" # endif # ifndef __cpp_lib_is_null_pointer # error "__cpp_lib_is_null_pointer should be defined in c++2a" # endif # if __cpp_lib_is_null_pointer != 201309L # error "__cpp_lib_is_null_pointer should have the value 201309L in c++2a" # endif # ifndef __cpp_lib_is_swappable # error "__cpp_lib_is_swappable should be defined in c++2a" # endif # if __cpp_lib_is_swappable != 201603L # error "__cpp_lib_is_swappable should have the value 201603L in c++2a" # endif # ifndef __cpp_lib_launder # error "__cpp_lib_launder should be defined in c++2a" # endif # if __cpp_lib_launder != 201606L # error "__cpp_lib_launder should have the value 201606L in c++2a" # endif # ifndef __cpp_lib_list_remove_return_type # error "__cpp_lib_list_remove_return_type should be defined in c++2a" # endif # if __cpp_lib_list_remove_return_type != 201806L # error "__cpp_lib_list_remove_return_type should have the value 201806L in c++2a" # endif # ifndef __cpp_lib_logical_traits # error "__cpp_lib_logical_traits should be defined in c++2a" # endif # if __cpp_lib_logical_traits != 201510L # error "__cpp_lib_logical_traits should have the value 201510L in c++2a" # endif # ifndef __cpp_lib_make_from_tuple # error "__cpp_lib_make_from_tuple should be defined in c++2a" # endif # if __cpp_lib_make_from_tuple != 201606L # error "__cpp_lib_make_from_tuple should have the value 201606L in c++2a" # endif # ifndef __cpp_lib_make_reverse_iterator # error "__cpp_lib_make_reverse_iterator should be defined in c++2a" # endif # if __cpp_lib_make_reverse_iterator != 201402L # error "__cpp_lib_make_reverse_iterator should have the value 201402L in c++2a" # endif # ifndef __cpp_lib_make_unique # error "__cpp_lib_make_unique should be defined in c++2a" # endif # if __cpp_lib_make_unique != 201304L # error "__cpp_lib_make_unique should have the value 201304L in c++2a" # endif # ifndef __cpp_lib_map_try_emplace # error "__cpp_lib_map_try_emplace should be defined in c++2a" # endif # if __cpp_lib_map_try_emplace != 201411L # error "__cpp_lib_map_try_emplace should have the value 201411L in c++2a" # endif +# ifndef __cpp_lib_math_constants +# error "__cpp_lib_math_constants should be defined in c++2a" +# endif +# if __cpp_lib_math_constants != 201907L +# error "__cpp_lib_math_constants should have the value 201907L in c++2a" +# endif + # if !defined(_LIBCPP_VERSION) # ifndef __cpp_lib_math_special_functions # error "__cpp_lib_math_special_functions should be defined in c++2a" # endif # if __cpp_lib_math_special_functions != 201603L # error "__cpp_lib_math_special_functions should have the value 201603L in c++2a" # endif # else // _LIBCPP_VERSION # ifdef __cpp_lib_math_special_functions # error "__cpp_lib_math_special_functions should not be defined because it is unimplemented in libc++!" # endif # endif # if !defined(_LIBCPP_VERSION) # ifndef __cpp_lib_memory_resource # error "__cpp_lib_memory_resource should be defined in c++2a" # endif # if __cpp_lib_memory_resource != 201603L # error "__cpp_lib_memory_resource should have the value 201603L in c++2a" # endif # else // _LIBCPP_VERSION # ifdef __cpp_lib_memory_resource # error "__cpp_lib_memory_resource should not be defined because it is unimplemented in libc++!" # endif # endif # ifndef __cpp_lib_node_extract # error "__cpp_lib_node_extract should be defined in c++2a" # endif # if __cpp_lib_node_extract != 201606L # error "__cpp_lib_node_extract should have the value 201606L in c++2a" # endif # ifndef __cpp_lib_nonmember_container_access # error "__cpp_lib_nonmember_container_access should be defined in c++2a" # endif # if __cpp_lib_nonmember_container_access != 201411L # error "__cpp_lib_nonmember_container_access should have the value 201411L in c++2a" # endif # ifndef __cpp_lib_not_fn # error "__cpp_lib_not_fn should be defined in c++2a" # endif # if __cpp_lib_not_fn != 201603L # error "__cpp_lib_not_fn should have the value 201603L in c++2a" # endif # ifndef __cpp_lib_null_iterators # error "__cpp_lib_null_iterators should be defined in c++2a" # endif # if __cpp_lib_null_iterators != 201304L # error "__cpp_lib_null_iterators should have the value 201304L in c++2a" # endif # ifndef __cpp_lib_optional # error "__cpp_lib_optional should be defined in c++2a" # endif # if __cpp_lib_optional != 201606L # error "__cpp_lib_optional should have the value 201606L in c++2a" # endif # if !defined(_LIBCPP_VERSION) # ifndef __cpp_lib_parallel_algorithm # error "__cpp_lib_parallel_algorithm should be defined in c++2a" # endif # if __cpp_lib_parallel_algorithm != 201603L # error "__cpp_lib_parallel_algorithm should have the value 201603L in c++2a" # endif # else // _LIBCPP_VERSION # ifdef __cpp_lib_parallel_algorithm # error "__cpp_lib_parallel_algorithm should not be defined because it is unimplemented in libc++!" # endif # endif # ifndef __cpp_lib_quoted_string_io # error "__cpp_lib_quoted_string_io should be defined in c++2a" # endif # if __cpp_lib_quoted_string_io != 201304L # error "__cpp_lib_quoted_string_io should have the value 201304L in c++2a" # endif # if !defined(_LIBCPP_VERSION) # ifndef __cpp_lib_ranges # error "__cpp_lib_ranges should be defined in c++2a" # endif # if __cpp_lib_ranges != 201811L # error "__cpp_lib_ranges should have the value 201811L in c++2a" # endif # else // _LIBCPP_VERSION # ifdef __cpp_lib_ranges # error "__cpp_lib_ranges should not be defined because it is unimplemented in libc++!" # endif # endif # ifndef __cpp_lib_raw_memory_algorithms # error "__cpp_lib_raw_memory_algorithms should be defined in c++2a" # endif # if __cpp_lib_raw_memory_algorithms != 201606L # error "__cpp_lib_raw_memory_algorithms should have the value 201606L in c++2a" # endif # ifndef __cpp_lib_result_of_sfinae # error "__cpp_lib_result_of_sfinae should be defined in c++2a" # endif # if __cpp_lib_result_of_sfinae != 201210L # error "__cpp_lib_result_of_sfinae should have the value 201210L in c++2a" # endif # ifndef __cpp_lib_robust_nonmodifying_seq_ops # error "__cpp_lib_robust_nonmodifying_seq_ops should be defined in c++2a" # endif # if __cpp_lib_robust_nonmodifying_seq_ops != 201304L # error "__cpp_lib_robust_nonmodifying_seq_ops should have the value 201304L in c++2a" # endif # ifndef __cpp_lib_sample # error "__cpp_lib_sample should be defined in c++2a" # endif # if __cpp_lib_sample != 201603L # error "__cpp_lib_sample should have the value 201603L in c++2a" # endif # ifndef __cpp_lib_scoped_lock # error "__cpp_lib_scoped_lock should be defined in c++2a" # endif # if __cpp_lib_scoped_lock != 201703L # error "__cpp_lib_scoped_lock should have the value 201703L in c++2a" # endif # if !defined(_LIBCPP_HAS_NO_THREADS) # ifndef __cpp_lib_shared_mutex # error "__cpp_lib_shared_mutex should be defined in c++2a" # endif # if __cpp_lib_shared_mutex != 201505L # error "__cpp_lib_shared_mutex should have the value 201505L in c++2a" # endif # else # ifdef __cpp_lib_shared_mutex # error "__cpp_lib_shared_mutex should not be defined when !defined(_LIBCPP_HAS_NO_THREADS) is not defined!" # endif # endif # if !defined(_LIBCPP_VERSION) # ifndef __cpp_lib_shared_ptr_arrays # error "__cpp_lib_shared_ptr_arrays should be defined in c++2a" # endif # if __cpp_lib_shared_ptr_arrays != 201611L # error "__cpp_lib_shared_ptr_arrays should have the value 201611L in c++2a" # endif # else // _LIBCPP_VERSION # ifdef __cpp_lib_shared_ptr_arrays # error "__cpp_lib_shared_ptr_arrays should not be defined because it is unimplemented in libc++!" # endif # endif # ifndef __cpp_lib_shared_ptr_weak_type # error "__cpp_lib_shared_ptr_weak_type should be defined in c++2a" # endif # if __cpp_lib_shared_ptr_weak_type != 201606L # error "__cpp_lib_shared_ptr_weak_type should have the value 201606L in c++2a" # endif # if !defined(_LIBCPP_HAS_NO_THREADS) # ifndef __cpp_lib_shared_timed_mutex # error "__cpp_lib_shared_timed_mutex should be defined in c++2a" # endif # if __cpp_lib_shared_timed_mutex != 201402L # error "__cpp_lib_shared_timed_mutex should have the value 201402L in c++2a" # endif # else # ifdef __cpp_lib_shared_timed_mutex # error "__cpp_lib_shared_timed_mutex should not be defined when !defined(_LIBCPP_HAS_NO_THREADS) is not defined!" # endif # endif # ifndef __cpp_lib_span # error "__cpp_lib_span should be defined in c++2a" # endif # if __cpp_lib_span != 202002L # error "__cpp_lib_span should have the value 202002L in c++2a" # endif # ifndef __cpp_lib_string_udls # error "__cpp_lib_string_udls should be defined in c++2a" # endif # if __cpp_lib_string_udls != 201304L # error "__cpp_lib_string_udls should have the value 201304L in c++2a" # endif # ifndef __cpp_lib_string_view # error "__cpp_lib_string_view should be defined in c++2a" # endif # if __cpp_lib_string_view != 201606L # error "__cpp_lib_string_view should have the value 201606L in c++2a" # endif # if !defined(_LIBCPP_VERSION) # ifndef __cpp_lib_three_way_comparison # error "__cpp_lib_three_way_comparison should be defined in c++2a" # endif # if __cpp_lib_three_way_comparison != 201711L # error "__cpp_lib_three_way_comparison should have the value 201711L in c++2a" # endif # else // _LIBCPP_VERSION # ifdef __cpp_lib_three_way_comparison # error "__cpp_lib_three_way_comparison should not be defined because it is unimplemented in libc++!" # endif # endif # ifndef __cpp_lib_to_array # error "__cpp_lib_to_array should be defined in c++2a" # endif # if __cpp_lib_to_array != 201907L # error "__cpp_lib_to_array should have the value 201907L in c++2a" # endif # if !defined(_LIBCPP_VERSION) # ifndef __cpp_lib_to_chars # error "__cpp_lib_to_chars should be defined in c++2a" # endif # if __cpp_lib_to_chars != 201611L # error "__cpp_lib_to_chars should have the value 201611L in c++2a" # endif # else // _LIBCPP_VERSION # ifdef __cpp_lib_to_chars # error "__cpp_lib_to_chars should not be defined because it is unimplemented in libc++!" # endif # endif # ifndef __cpp_lib_transformation_trait_aliases # error "__cpp_lib_transformation_trait_aliases should be defined in c++2a" # endif # if __cpp_lib_transformation_trait_aliases != 201304L # error "__cpp_lib_transformation_trait_aliases should have the value 201304L in c++2a" # endif # ifndef __cpp_lib_transparent_operators # error "__cpp_lib_transparent_operators should be defined in c++2a" # endif # if __cpp_lib_transparent_operators != 201510L # error "__cpp_lib_transparent_operators should have the value 201510L in c++2a" # endif # ifndef __cpp_lib_tuple_element_t # error "__cpp_lib_tuple_element_t should be defined in c++2a" # endif # if __cpp_lib_tuple_element_t != 201402L # error "__cpp_lib_tuple_element_t should have the value 201402L in c++2a" # endif # ifndef __cpp_lib_tuples_by_type # error "__cpp_lib_tuples_by_type should be defined in c++2a" # endif # if __cpp_lib_tuples_by_type != 201304L # error "__cpp_lib_tuples_by_type should have the value 201304L in c++2a" # endif # ifndef __cpp_lib_type_trait_variable_templates # error "__cpp_lib_type_trait_variable_templates should be defined in c++2a" # endif # if __cpp_lib_type_trait_variable_templates != 201510L # error "__cpp_lib_type_trait_variable_templates should have the value 201510L in c++2a" # endif # ifndef __cpp_lib_uncaught_exceptions # error "__cpp_lib_uncaught_exceptions should be defined in c++2a" # endif # if __cpp_lib_uncaught_exceptions != 201411L # error "__cpp_lib_uncaught_exceptions should have the value 201411L in c++2a" # endif # ifndef __cpp_lib_unordered_map_try_emplace # error "__cpp_lib_unordered_map_try_emplace should be defined in c++2a" # endif # if __cpp_lib_unordered_map_try_emplace != 201411L # error "__cpp_lib_unordered_map_try_emplace should have the value 201411L in c++2a" # endif # ifndef __cpp_lib_variant # error "__cpp_lib_variant should be defined in c++2a" # endif # if __cpp_lib_variant != 201606L # error "__cpp_lib_variant should have the value 201606L in c++2a" # endif # ifndef __cpp_lib_void_t # error "__cpp_lib_void_t should be defined in c++2a" # endif # if __cpp_lib_void_t != 201411L # error "__cpp_lib_void_t should have the value 201411L in c++2a" # endif #endif // TEST_STD_VER > 17 int main(int, char**) { return 0; } diff --git a/libcxx/test/std/numerics/numbers/defined.pass.cpp b/libcxx/test/std/numerics/numbers/defined.pass.cpp new file mode 100644 index 000000000000..7cc2c1080452 --- /dev/null +++ b/libcxx/test/std/numerics/numbers/defined.pass.cpp @@ -0,0 +1,80 @@ +//===----------------------------------------------------------------------===// +// +// 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++98, c++03, c++11, c++14, c++17 + +#include + +// We are testing if these are defined by taking an address. Don't care if the result is unused. +#if defined(__clang__) +# pragma clang diagnostic ignored "-Wunused-variable" +#endif + +constexpr bool tests() { + const double* dd0{&std::numbers::e}; + const double* dd1{&std::numbers::log2e}; + const double* dd2{&std::numbers::log10e}; + const double* dd3{&std::numbers::pi}; + const double* dd4{&std::numbers::inv_pi}; + const double* dd5{&std::numbers::inv_sqrtpi}; + const double* dd6{&std::numbers::ln2}; + const double* dd7{&std::numbers::ln10}; + const double* dd8{&std::numbers::sqrt2}; + const double* dd9{&std::numbers::sqrt3}; + const double* dd10{&std::numbers::inv_sqrt3}; + const double* dd11{&std::numbers::egamma}; + const double* dd12{&std::numbers::phi}; + + const float* f0{&std::numbers::e_v}; + const float* f1{&std::numbers::log2e_v}; + const float* f2{&std::numbers::log10e_v}; + const float* f3{&std::numbers::pi_v}; + const float* f4{&std::numbers::inv_pi_v}; + const float* f5{&std::numbers::inv_sqrtpi_v}; + const float* f6{&std::numbers::ln2_v}; + const float* f7{&std::numbers::ln10_v}; + const float* f8{&std::numbers::sqrt2_v}; + const float* f9{&std::numbers::sqrt3_v}; + const float* f10{&std::numbers::inv_sqrt3_v}; + const float* f11{&std::numbers::egamma_v}; + const float* f12{&std::numbers::phi_v}; + + const double* d0{&std::numbers::e_v}; + const double* d1{&std::numbers::log2e_v}; + const double* d2{&std::numbers::log10e_v}; + const double* d3{&std::numbers::pi_v}; + const double* d4{&std::numbers::inv_pi_v}; + const double* d5{&std::numbers::inv_sqrtpi_v}; + const double* d6{&std::numbers::ln2_v}; + const double* d7{&std::numbers::ln10_v}; + const double* d8{&std::numbers::sqrt2_v}; + const double* d9{&std::numbers::sqrt3_v}; + const double* d10{&std::numbers::inv_sqrt3_v}; + const double* d11{&std::numbers::egamma_v}; + const double* d12{&std::numbers::phi_v}; + + const long double* ld0{&std::numbers::e_v}; + const long double* ld1{&std::numbers::log2e_v}; + const long double* ld2{&std::numbers::log10e_v}; + const long double* ld3{&std::numbers::pi_v}; + const long double* ld4{&std::numbers::inv_pi_v}; + const long double* ld5{&std::numbers::inv_sqrtpi_v}; + const long double* ld6{&std::numbers::ln2_v}; + const long double* ld7{&std::numbers::ln10_v}; + const long double* ld8{&std::numbers::sqrt2_v}; + const long double* ld9{&std::numbers::sqrt3_v}; + const long double* ld10{&std::numbers::inv_sqrt3_v}; + const long double* ld11{&std::numbers::egamma_v}; + const long double* ld12{&std::numbers::phi_v}; + + return true; +} + +static_assert(tests()); + +int main() { tests(); } diff --git a/libcxx/test/std/numerics/numbers/illformed.verify.cpp b/libcxx/test/std/numerics/numbers/illformed.verify.cpp new file mode 100644 index 000000000000..239ee1678756 --- /dev/null +++ b/libcxx/test/std/numerics/numbers/illformed.verify.cpp @@ -0,0 +1,28 @@ +//===----------------------------------------------------------------------===// +// +// 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++98, c++03, c++11, c++14, c++17 + +#include + +// Initializing the primary template is ill-formed. +int log2e{std::numbers::log2e_v< + int>}; // expected-error-re@numbers:* {{static_assert failed {{.*}} "A program that instantiates a primary template of a mathematical constant variable template is ill-formed."}} +int log10e{std::numbers::log10e_v}; +int pi{std::numbers::pi_v}; +int inv_pi{std::numbers::inv_pi_v}; +int inv_sqrtpi{std::numbers::inv_sqrtpi_v}; +int ln2{std::numbers::ln2_v}; +int ln10{std::numbers::ln10_v}; +int sqrt2{std::numbers::sqrt2_v}; +int sqrt3{std::numbers::sqrt3_v}; +int inv_sqrt3{std::numbers::inv_sqrt3_v}; +int egamma{std::numbers::egamma_v}; +int phi{std::numbers::phi_v}; + +int main() { return 0; } diff --git a/libcxx/test/std/numerics/numbers/specialize.pass.cpp b/libcxx/test/std/numerics/numbers/specialize.pass.cpp new file mode 100644 index 000000000000..db6f31c3aee3 --- /dev/null +++ b/libcxx/test/std/numerics/numbers/specialize.pass.cpp @@ -0,0 +1,81 @@ +//===----------------------------------------------------------------------===// +// +// 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++98, c++03, c++11, c++14, c++17 + +#include +#include + +// We are testing if template instantiation works. Don't care if the result is unused. +#if defined(__clang__) +# pragma clang diagnostic ignored "-Wunused-variable" +#endif + +constexpr bool tests() { + float f0{std::numbers::e_v}; + float f1{std::numbers::log2e_v}; + float f2{std::numbers::log10e_v}; + float f3{std::numbers::pi_v}; + float f4{std::numbers::inv_pi_v}; + float f5{std::numbers::inv_sqrtpi_v}; + float f6{std::numbers::ln2_v}; + float f7{std::numbers::ln10_v}; + float f8{std::numbers::sqrt2_v}; + float f9{std::numbers::sqrt3_v}; + float f10{std::numbers::inv_sqrt3_v}; + float f11{std::numbers::egamma_v}; + float f12{std::numbers::phi_v}; + + double d0{std::numbers::e_v}; + double d1{std::numbers::log2e_v}; + double d2{std::numbers::log10e_v}; + double d3{std::numbers::pi_v}; + double d4{std::numbers::inv_pi_v}; + double d5{std::numbers::inv_sqrtpi_v}; + double d6{std::numbers::ln2_v}; + double d7{std::numbers::ln10_v}; + double d8{std::numbers::sqrt2_v}; + double d9{std::numbers::sqrt3_v}; + double d10{std::numbers::inv_sqrt3_v}; + double d11{std::numbers::egamma_v}; + double d12{std::numbers::phi_v}; + + assert(d0 == std::numbers::e); + assert(d1 == std::numbers::log2e); + assert(d2 == std::numbers::log10e); + assert(d3 == std::numbers::pi); + assert(d4 == std::numbers::inv_pi); + assert(d5 == std::numbers::inv_sqrtpi); + assert(d6 == std::numbers::ln2); + assert(d7 == std::numbers::ln10); + assert(d8 == std::numbers::sqrt2); + assert(d9 == std::numbers::sqrt3); + assert(d10 == std::numbers::inv_sqrt3); + assert(d11 == std::numbers::egamma); + assert(d12 == std::numbers::phi); + + long double ld0{std::numbers::e_v}; + long double ld1{std::numbers::log2e_v}; + long double ld2{std::numbers::log10e_v}; + long double ld3{std::numbers::pi_v}; + long double ld4{std::numbers::inv_pi_v}; + long double ld5{std::numbers::inv_sqrtpi_v}; + long double ld6{std::numbers::ln2_v}; + long double ld7{std::numbers::ln10_v}; + long double ld8{std::numbers::sqrt2_v}; + long double ld9{std::numbers::sqrt3_v}; + long double ld10{std::numbers::inv_sqrt3_v}; + long double ld11{std::numbers::egamma_v}; + long double ld12{std::numbers::phi_v}; + + return true; +} + +static_assert(tests()); + +int main() { tests(); } diff --git a/libcxx/test/std/numerics/numbers/user_type.pass.cpp b/libcxx/test/std/numerics/numbers/user_type.pass.cpp new file mode 100644 index 000000000000..fd087086a08c --- /dev/null +++ b/libcxx/test/std/numerics/numbers/user_type.pass.cpp @@ -0,0 +1,56 @@ +//===----------------------------------------------------------------------===// +// +// 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++98, c++03, c++11, c++14, c++17 + +#include + +struct user { + int value; +}; + +template <> +user std::numbers::e_v{}; + +template <> +user std::numbers::log2e_v{}; + +template <> +user std::numbers::log10e_v{}; + +template <> +user std::numbers::pi_v{}; + +template <> +user std::numbers::inv_pi_v{}; + +template <> +user std::numbers::inv_sqrtpi_v{}; + +template <> +user std::numbers::ln2_v{}; + +template <> +user std::numbers::ln10_v{}; + +template <> +user std::numbers::sqrt2_v{}; + +template <> +user std::numbers::sqrt3_v{}; + +template <> +user std::numbers::inv_sqrt3_v{}; + +template <> +user std::numbers::egamma_v{}; + +template <> +user std::numbers::phi_v{}; + +int main() { return 0; } diff --git a/libcxx/test/std/numerics/numbers/value.pass.cpp b/libcxx/test/std/numerics/numbers/value.pass.cpp new file mode 100644 index 000000000000..1d2a67cb8a79 --- /dev/null +++ b/libcxx/test/std/numerics/numbers/value.pass.cpp @@ -0,0 +1,85 @@ +//===----------------------------------------------------------------------===// +// +// 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++98, c++03, c++11, c++14, c++17 + +#include +#include + +constexpr bool tests() { + assert(std::numbers::e == 0x1.5bf0a8b145769p+1); + assert(std::numbers::e_v == 0x1.5bf0a8b145769p+1); + assert(std::numbers::e_v == 0x1.5bf0a8b145769p+1l); + assert(std::numbers::e_v == 0x1.5bf0a8p+1f); + + assert(std::numbers::log2e == 0x1.71547652b82fep+0); + assert(std::numbers::log2e_v == 0x1.71547652b82fep+0); + assert(std::numbers::log2e_v == 0x1.71547652b82fep+0l); + assert(std::numbers::log2e_v == 0x1.715476p+0f); + + assert(std::numbers::log10e == 0x1.bcb7b1526e50ep-2); + assert(std::numbers::log10e_v == 0x1.bcb7b1526e50ep-2); + assert(std::numbers::log10e_v == 0x1.bcb7b1526e50ep-2l); + assert(std::numbers::log10e_v == 0x1.bcb7b15p-2f); + + assert(std::numbers::pi == 0x1.921fb54442d18p+1); + assert(std::numbers::pi_v == 0x1.921fb54442d18p+1); + assert(std::numbers::pi_v == 0x1.921fb54442d18p+1l); + assert(std::numbers::pi_v == 0x1.921fb54p+1f); + + assert(std::numbers::inv_pi == 0x1.45f306dc9c883p-2); + assert(std::numbers::inv_pi_v == 0x1.45f306dc9c883p-2); + assert(std::numbers::inv_pi_v == 0x1.45f306dc9c883p-2l); + assert(std::numbers::inv_pi_v == 0x1.45f306p-2f); + + assert(std::numbers::inv_sqrtpi == 0x1.20dd750429b6dp-1); + assert(std::numbers::inv_sqrtpi_v == 0x1.20dd750429b6dp-1); + assert(std::numbers::inv_sqrtpi_v == 0x1.20dd750429b6dp-1l); + assert(std::numbers::inv_sqrtpi_v == 0x1.20dd76p-1f); + + assert(std::numbers::ln2 == 0x1.62e42fefa39efp-1); + assert(std::numbers::ln2_v == 0x1.62e42fefa39efp-1); + assert(std::numbers::ln2_v == 0x1.62e42fefa39efp-1l); + assert(std::numbers::ln2_v == 0x1.62e42fp-1f); + + assert(std::numbers::ln10 == 0x1.26bb1bbb55516p+1); + assert(std::numbers::ln10_v == 0x1.26bb1bbb55516p+1); + assert(std::numbers::ln10_v == 0x1.26bb1bbb55516p+1l); + assert(std::numbers::ln10_v == 0x1.26bb1bp+1f); + + assert(std::numbers::sqrt2 == 0x1.6a09e667f3bcdp+0); + assert(std::numbers::sqrt2_v == 0x1.6a09e667f3bcdp+0); + assert(std::numbers::sqrt2_v == 0x1.6a09e667f3bcdp+0l); + assert(std::numbers::sqrt2_v == 0x1.6a09e6p+0f); + + assert(std::numbers::sqrt3 == 0x1.bb67ae8584caap+0); + assert(std::numbers::sqrt3_v == 0x1.bb67ae8584caap+0); + assert(std::numbers::sqrt3_v == 0x1.bb67ae8584caap+0l); + assert(std::numbers::sqrt3_v == 0x1.bb67aep+0f); + + assert(std::numbers::inv_sqrt3 == 0x1.279a74590331cp-1); + assert(std::numbers::inv_sqrt3_v == 0x1.279a74590331cp-1); + assert(std::numbers::inv_sqrt3_v == 0x1.279a74590331cp-1l); + assert(std::numbers::inv_sqrt3_v == 0x1.279a74p-1f); + + assert(std::numbers::egamma == 0x1.2788cfc6fb619p-1); + assert(std::numbers::egamma_v == 0x1.2788cfc6fb619p-1); + assert(std::numbers::egamma_v == 0x1.2788cfc6fb619p-1l); + assert(std::numbers::egamma_v == 0x1.2788cfp-1f); + + assert(std::numbers::phi == 0x1.9e3779b97f4a8p+0); + assert(std::numbers::phi_v == 0x1.9e3779b97f4a8p+0); + assert(std::numbers::phi_v == 0x1.9e3779b97f4a8p+0l); + assert(std::numbers::phi_v == 0x1.9e3779ap+0f); + + return true; +} + +static_assert(tests()); + +int main() { tests(); } diff --git a/libcxx/utils/generate_feature_test_macro_components.py b/libcxx/utils/generate_feature_test_macro_components.py index 7a3f441c1cab..dc4224885896 100755 --- a/libcxx/utils/generate_feature_test_macro_components.py +++ b/libcxx/utils/generate_feature_test_macro_components.py @@ -1,1011 +1,1017 @@ #!/usr/bin/env python import os import tempfile from builtins import int, range from functools import reduce def get_libcxx_paths(): utils_path = os.path.dirname(os.path.abspath(__file__)) script_name = os.path.basename(__file__) assert os.path.exists(utils_path) src_root = os.path.dirname(utils_path) include_path = os.path.join(src_root, 'include') assert os.path.exists(include_path) docs_path = os.path.join(src_root, 'docs') assert os.path.exists(docs_path) macro_test_path = os.path.join(src_root, 'test', 'std', 'language.support', 'support.limits', 'support.limits.general') assert os.path.exists(macro_test_path) assert os.path.exists(os.path.join(macro_test_path, 'version.version.pass.cpp')) return script_name, src_root, include_path, docs_path, macro_test_path script_name, source_root, include_path, docs_path, macro_test_path = get_libcxx_paths() def has_header(h): h_path = os.path.join(include_path, h) return os.path.exists(h_path) def add_version_header(tc): tc["headers"].append("version") return tc feature_test_macros = sorted([ add_version_header(x) for x in [ # C++14 macros {"name": "__cpp_lib_integer_sequence", "values": { "c++14": int(201304) }, "headers": ["utility"], }, {"name": "__cpp_lib_exchange_function", "values": { "c++14": int(201304) }, "headers": ["utility"], }, {"name": "__cpp_lib_tuples_by_type", "values": { "c++14": int(201304) }, "headers": ["utility", "tuple"], }, {"name": "__cpp_lib_tuple_element_t", "values": { "c++14": int(201402) }, "headers": ["tuple"], }, {"name": "__cpp_lib_make_unique", "values": { "c++14": int(201304) }, "headers": ["memory"], }, {"name": "__cpp_lib_transparent_operators", "values": { "c++14": int(201210), "c++17": int(201510), }, "headers": ["functional"], }, {"name": "__cpp_lib_integral_constant_callable", "values": { "c++14": int(201304) }, "headers": ["type_traits"], }, {"name": "__cpp_lib_transformation_trait_aliases", "values": { "c++14": int(201304), }, "headers": ["type_traits"] }, {"name": "__cpp_lib_result_of_sfinae", "values": { "c++14": int(201210), }, "headers": ["functional", "type_traits"] }, {"name": "__cpp_lib_is_final", "values": { "c++14": int(201402), }, "headers": ["type_traits"] }, {"name": "__cpp_lib_is_null_pointer", "values": { "c++14": int(201309), }, "headers": ["type_traits"] }, {"name": "__cpp_lib_chrono_udls", "values": { "c++14": int(201304), }, "headers": ["chrono"] }, {"name": "__cpp_lib_string_udls", "values": { "c++14": int(201304), }, "headers": ["string"] }, {"name": "__cpp_lib_generic_associative_lookup", "values": { "c++14": int(201304), }, "headers": ["map", "set"] }, {"name": "__cpp_lib_null_iterators", "values": { "c++14": int(201304), }, "headers": ["iterator"] }, {"name": "__cpp_lib_make_reverse_iterator", "values": { "c++14": int(201402), }, "headers": ["iterator"] }, {"name": "__cpp_lib_robust_nonmodifying_seq_ops", "values": { "c++14": int(201304), }, "headers": ["algorithm"] }, {"name": "__cpp_lib_complex_udls", "values": { "c++14": int(201309), }, "headers": ["complex"] }, {"name": "__cpp_lib_quoted_string_io", "values": { "c++14": int(201304), }, "headers": ["iomanip"] }, {"name": "__cpp_lib_shared_timed_mutex", "values": { "c++14": int(201402), }, "headers": ["shared_mutex"], "depends": "!defined(_LIBCPP_HAS_NO_THREADS)", "internal_depends": "!defined(_LIBCPP_HAS_NO_THREADS)", }, # C++17 macros {"name": "__cpp_lib_atomic_is_always_lock_free", "values": { "c++17": int(201603), }, "headers": ["atomic"], "depends": "!defined(_LIBCPP_HAS_NO_THREADS)", "internal_depends": "!defined(_LIBCPP_HAS_NO_THREADS)", }, {"name": "__cpp_lib_filesystem", "values": { "c++17": int(201703), }, "headers": ["filesystem"] }, {"name": "__cpp_lib_invoke", "values": { "c++17": int(201411), }, "headers": ["functional"] }, {"name": "__cpp_lib_void_t", "values": { "c++17": int(201411), }, "headers": ["type_traits"] }, {"name": "__cpp_lib_node_extract", "values": { "c++17": int(201606), }, "headers": ["map", "set", "unordered_map", "unordered_set"] }, {"name": "__cpp_lib_byte", "values": { "c++17": int(201603), }, "headers": ["cstddef"], }, {"name": "__cpp_lib_hardware_interference_size", "values": { "c++17": int(201703), }, "headers": ["new"], "unimplemented": True, }, {"name": "__cpp_lib_launder", "values": { "c++17": int(201606), }, "headers": ["new"], }, {"name": "__cpp_lib_uncaught_exceptions", "values": { "c++17": int(201411), }, "headers": ["exception"], }, {"name": "__cpp_lib_as_const", "values": { "c++17": int(201510), }, "headers": ["utility"], }, {"name": "__cpp_lib_make_from_tuple", "values": { "c++17": int(201606), }, "headers": ["tuple"], }, {"name": "__cpp_lib_apply", "values": { "c++17": int(201603), }, "headers": ["tuple"], }, {"name": "__cpp_lib_optional", "values": { "c++17": int(201606), }, "headers": ["optional"], }, {"name": "__cpp_lib_variant", "values": { "c++17": int(201606), }, "headers": ["variant"], }, {"name": "__cpp_lib_any", "values": { "c++17": int(201606), }, "headers": ["any"], }, {"name": "__cpp_lib_addressof_constexpr", "values": { "c++17": int(201603), }, "headers": ["memory"], "depends": "TEST_HAS_BUILTIN(__builtin_addressof) || TEST_GCC_VER >= 700", "internal_depends": "!defined(_LIBCPP_HAS_NO_BUILTIN_ADDRESSOF)", }, {"name": "__cpp_lib_raw_memory_algorithms", "values": { "c++17": int(201606), }, "headers": ["memory"], }, {"name": "__cpp_lib_enable_shared_from_this", "values": { "c++17": int(201603), }, "headers": ["memory"], }, {"name": "__cpp_lib_shared_ptr_weak_type", "values": { "c++17": int(201606), }, "headers": ["memory"], }, {"name": "__cpp_lib_shared_ptr_arrays", "values": { "c++17": int(201611), }, "headers": ["memory"], "unimplemented": True, }, {"name": "__cpp_lib_memory_resource", "values": { "c++17": int(201603), }, "headers": ["memory_resource"], "unimplemented": True, }, {"name": "__cpp_lib_boyer_moore_searcher", "values": { "c++17": int(201603), }, "headers": ["functional"], "unimplemented": True, }, {"name": "__cpp_lib_not_fn", "values": { "c++17": int(201603), }, "headers": ["functional"], }, {"name": "__cpp_lib_bool_constant", "values": { "c++17": int(201505), }, "headers": ["type_traits"], }, {"name": "__cpp_lib_type_trait_variable_templates", "values": { "c++17": int(201510), }, "headers": ["type_traits"], }, {"name": "__cpp_lib_logical_traits", "values": { "c++17": int(201510), }, "headers": ["type_traits"], }, {"name": "__cpp_lib_is_swappable", "values": { "c++17": int(201603), }, "headers": ["type_traits"], }, {"name": "__cpp_lib_is_invocable", "values": { "c++17": int(201703), }, "headers": ["type_traits"], }, {"name": "__cpp_lib_has_unique_object_representations", "values": { "c++17": int(201606), }, "headers": ["type_traits"], "depends": "TEST_HAS_BUILTIN_IDENTIFIER(__has_unique_object_representations) || TEST_GCC_VER >= 700", "internal_depends": "defined(_LIBCPP_HAS_UNIQUE_OBJECT_REPRESENTATIONS)", }, {"name": "__cpp_lib_is_aggregate", "values": { "c++17": int(201703), }, "headers": ["type_traits"], "depends": "TEST_HAS_BUILTIN_IDENTIFIER(__is_aggregate) || TEST_GCC_VER_NEW >= 7001", "internal_depends": "!defined(_LIBCPP_HAS_NO_IS_AGGREGATE)", }, {"name": "__cpp_lib_chrono", "values": { "c++17": int(201611), }, "headers": ["chrono"], }, {"name": "__cpp_lib_execution", "values": { "c++17": int(201603), }, "headers": ["execution"], "unimplemented": True }, {"name": "__cpp_lib_parallel_algorithm", "values": { "c++17": int(201603), }, "headers": ["algorithm", "numeric"], "unimplemented": True, }, {"name": "__cpp_lib_to_chars", "values": { "c++17": int(201611), }, "headers": ["utility"], "unimplemented": True, }, {"name": "__cpp_lib_string_view", "values": { "c++17": int(201606), }, "headers": ["string", "string_view"], }, {"name": "__cpp_lib_allocator_traits_is_always_equal", "values": { "c++17": int(201411), }, "headers": ["memory", "scoped_allocator", "string", "deque", "forward_list", "list", "vector", "map", "set", "unordered_map", "unordered_set"], }, {"name": "__cpp_lib_incomplete_container_elements", "values": { "c++17": int(201505), }, "headers": ["forward_list", "list", "vector"], }, {"name": "__cpp_lib_map_try_emplace", "values": { "c++17": int(201411), }, "headers": ["map"], }, {"name": "__cpp_lib_unordered_map_try_emplace", "values": { "c++17": int(201411), }, "headers": ["unordered_map"], }, {"name": "__cpp_lib_array_constexpr", "values": { "c++17": int(201603), "c++2a": int(201811), }, "headers": ["iterator", "array"], }, {"name": "__cpp_lib_nonmember_container_access", "values": { "c++17": int(201411), }, "headers": ["iterator", "array", "deque", "forward_list", "list", "map", "regex", "set", "string", "unordered_map", "unordered_set", "vector"], }, {"name": "__cpp_lib_sample", "values": { "c++17": int(201603), }, "headers": ["algorithm"], }, {"name": "__cpp_lib_clamp", "values": { "c++17": int(201603), }, "headers": ["algorithm"], }, {"name": "__cpp_lib_gcd_lcm", "values": { "c++17": int(201606), }, "headers": ["numeric"], }, {"name": "__cpp_lib_hypot", "values": { "c++17": int(201603), }, "headers": ["cmath"], }, {"name": "__cpp_lib_math_special_functions", "values": { "c++17": int(201603), }, "headers": ["cmath"], "unimplemented": True, }, {"name": "__cpp_lib_shared_mutex", "values": { "c++17": int(201505), }, "headers": ["shared_mutex"], "depends": "!defined(_LIBCPP_HAS_NO_THREADS)", "internal_depends": "!defined(_LIBCPP_HAS_NO_THREADS)", }, {"name": "__cpp_lib_scoped_lock", "values": { "c++17": int(201703), }, "headers": ["mutex"], }, # C++2a {"name": "__cpp_lib_char8_t", "values": { "c++2a": int(201811), }, "headers": ["atomic", "filesystem", "istream", "limits", "locale", "ostream", "string", "string_view"], "depends": "defined(__cpp_char8_t)", "internal_depends": "!defined(_LIBCPP_NO_HAS_CHAR8_T)", }, {"name": "__cpp_lib_erase_if", "values": { "c++2a": int(202002), }, "headers": ["string", "deque", "forward_list", "list", "vector", "map", "set", "unordered_map", "unordered_set"] }, {"name": "__cpp_lib_destroying_delete", "values": { "c++2a": int(201806), }, "headers": ["new"], "depends": "TEST_STD_VER > 17" " && defined(__cpp_impl_destroying_delete)" " && __cpp_impl_destroying_delete >= 201806L", "internal_depends": "_LIBCPP_STD_VER > 17" " && defined(__cpp_impl_destroying_delete)" " && __cpp_impl_destroying_delete >= 201806L", }, {"name": "__cpp_lib_three_way_comparison", "values": { "c++2a": int(201711), }, "headers": ["compare"], "unimplemented": True, }, {"name": "__cpp_lib_concepts", "values": { "c++2a": int(201806), }, "headers": ["concepts"], "unimplemented": True, }, {"name": "__cpp_lib_constexpr_swap_algorithms", "values": { "c++2a": int(201806), }, "headers": ["algorithm"], "unimplemented": True, }, {"name": "__cpp_lib_constexpr_misc", "values": { "c++2a": int(201811), }, "headers": ["array", "functional", "iterator", "string_view", "tuple", "utility"], "unimplemented": True, }, {"name": "__cpp_lib_bind_front", "values": { "c++2a": int(201811), }, "headers": ["functional"], "unimplemented": True, }, {"name": "__cpp_lib_is_constant_evaluated", "values": { "c++2a": int(201811), }, "headers": ["type_traits"], "depends": "TEST_HAS_BUILTIN(__builtin_is_constant_evaluated) || TEST_GCC_VER >= 900", "internal_depends": "!defined(_LIBCPP_HAS_NO_BUILTIN_IS_CONSTANT_EVALUATED)", }, {"name": "__cpp_lib_list_remove_return_type", "values": { "c++2a": int(201806), }, "headers": ["forward_list", "list"], }, {"name": "__cpp_lib_generic_unordered_lookup", "values": { "c++2a": int(201811), }, "headers": ["unordered_map", "unordered_set"], "unimplemented": True, }, {"name": "__cpp_lib_ranges", "values": { "c++2a": int(201811), }, "headers": ["algorithm", "functional", "iterator", "memory", "ranges"], "unimplemented": True, }, {"name": "__cpp_lib_bit_cast", "values": { "c++2a": int(201806), }, "headers": ["bit"], "unimplemented": True, }, {"name": "__cpp_lib_atomic_ref", "values": { "c++2a": int(201806), }, "headers": ["atomic"], "unimplemented": True, "depends": "!defined(_LIBCPP_HAS_NO_THREADS)", "internal_depends": "!defined(_LIBCPP_HAS_NO_THREADS)", }, {"name": "__cpp_lib_interpolate", "values": { "c++2a": int(201902), }, "headers": ["numeric"], }, {"name": "__cpp_lib_endian", "values": { "c++2a": int(201907), }, "headers": ["bit"], }, {"name": "__cpp_lib_to_array", "values": { "c++2a": int(201907), }, "headers": ["array"], }, {"name": "__cpp_lib_span", "values": { "c++2a": int(202002), }, "headers": ["span"], }, + {"name": "__cpp_lib_math_constants", + "values": { + "c++2a": int(201907), + }, + "headers": ["numbers"], + }, ]], key=lambda tc: tc["name"]) def get_std_dialects(): std_dialects = ['c++14', 'c++17', 'c++2a'] return list(std_dialects) def get_first_std(d): for s in get_std_dialects(): if s in d.keys(): return s return None def get_last_std(d): rev_dialects = get_std_dialects() rev_dialects.reverse() for s in rev_dialects: if s in d.keys(): return s return None def get_std_before(d, std): std_dialects = get_std_dialects() candidates = std_dialects[0:std_dialects.index(std)] candidates.reverse() for cand in candidates: if cand in d.keys(): return cand return None def get_value_before(d, std): new_std = get_std_before(d, std) if new_std is None: return None return d[new_std] def get_for_std(d, std): # This catches the C++11 case for which there should be no defined feature # test macros. std_dialects = get_std_dialects() if std not in std_dialects: return None # Find the value for the newest C++ dialect between C++14 and std std_list = list(std_dialects[0:std_dialects.index(std)+1]) std_list.reverse() for s in std_list: if s in d.keys(): return d[s] return None """ Functions to produce the header """ def produce_macros_definition_for_std(std): result = "" indent = 56 for tc in feature_test_macros: if std not in tc["values"]: continue inner_indent = 1 if 'depends' in tc.keys(): assert 'internal_depends' in tc.keys() result += "# if %s\n" % tc["internal_depends"] inner_indent += 2 if get_value_before(tc["values"], std) is not None: assert 'depends' not in tc.keys() result += "# undef %s\n" % tc["name"] line = "#%sdefine %s" % ((" " * inner_indent), tc["name"]) line += " " * (indent - len(line)) line += "%sL" % tc["values"][std] if 'unimplemented' in tc.keys(): line = "// " + line result += line result += "\n" if 'depends' in tc.keys(): result += "# endif\n" return result def chunks(l, n): """Yield successive n-sized chunks from l.""" for i in range(0, len(l), n): yield l[i:i + n] def produce_version_synopsis(): indent = 56 header_indent = 56 + len("20XXYYL ") result = "" def indent_to(s, val): if len(s) >= val: return s s += " " * (val - len(s)) return s line = indent_to("Macro name", indent) + "Value" line = indent_to(line, header_indent) + "Headers" result += line + "\n" for tc in feature_test_macros: prev_defined_std = get_last_std(tc["values"]) line = "{name: <{indent}}{value}L ".format(name=tc['name'], indent=indent, value=tc["values"][prev_defined_std]) headers = list(tc["headers"]) headers.remove("version") for chunk in chunks(headers, 3): line = indent_to(line, header_indent) chunk = ['<%s>' % header for header in chunk] line += ' '.join(chunk) result += line result += "\n" line = "" while True: prev_defined_std = get_std_before(tc["values"], prev_defined_std) if prev_defined_std is None: break result += "%s%sL // %s\n" % (indent_to("", indent), tc["values"][prev_defined_std], prev_defined_std.replace("c++", "C++")) return result def produce_version_header(): template="""// -*- C++ -*- //===--------------------------- version ----------------------------------===// // // 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_VERSIONH #define _LIBCPP_VERSIONH /* version synopsis {synopsis} */ #include <__config> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) #pragma GCC system_header #endif #if _LIBCPP_STD_VER > 11 {cxx14_macros} #endif #if _LIBCPP_STD_VER > 14 {cxx17_macros} #endif #if _LIBCPP_STD_VER > 17 {cxx2a_macros} #endif #endif // _LIBCPP_VERSIONH """ return template.format( synopsis=produce_version_synopsis().strip(), cxx14_macros=produce_macros_definition_for_std('c++14').strip(), cxx17_macros=produce_macros_definition_for_std('c++17').strip(), cxx2a_macros=produce_macros_definition_for_std('c++2a').strip()) """ Functions to produce test files """ test_types = { "undefined": """ # ifdef {name} # error "{name} should not be defined before {std_first}" # endif """, "depends": """ # if {depends} # ifndef {name} # error "{name} should be defined in {std}" # endif # if {name} != {value} # error "{name} should have the value {value} in {std}" # endif # else # ifdef {name} # error "{name} should not be defined when {depends} is not defined!" # endif # endif """, "unimplemented": """ # if !defined(_LIBCPP_VERSION) # ifndef {name} # error "{name} should be defined in {std}" # endif # if {name} != {value} # error "{name} should have the value {value} in {std}" # endif # else // _LIBCPP_VERSION # ifdef {name} # error "{name} should not be defined because it is unimplemented in libc++!" # endif # endif """, "defined":""" # ifndef {name} # error "{name} should be defined in {std}" # endif # if {name} != {value} # error "{name} should have the value {value} in {std}" # endif """ } def generate_std_test(test_list, std): result = "" for tc in test_list: val = get_for_std(tc["values"], std) if val is not None: val = "%sL" % val if val is None: result += test_types["undefined"].format(name=tc["name"], std_first=get_first_std(tc["values"])) elif 'unimplemented' in tc.keys(): result += test_types["unimplemented"].format(name=tc["name"], value=val, std=std) elif "depends" in tc.keys(): result += test_types["depends"].format(name=tc["name"], value=val, std=std, depends=tc["depends"]) else: result += test_types["defined"].format(name=tc["name"], value=val, std=std) return result def generate_synopsis(test_list): max_name_len = max([len(tc["name"]) for tc in test_list]) indent = max_name_len + 8 def mk_line(prefix, suffix): return "{prefix: <{max_len}}{suffix}\n".format(prefix=prefix, suffix=suffix, max_len=indent) result = "" result += mk_line("/* Constant", "Value") for tc in test_list: prefix = " %s" % tc["name"] for std in [s for s in get_std_dialects() if s in tc["values"].keys()]: result += mk_line(prefix, "%sL [%s]" % (tc["values"][std], std.replace("c++", "C++"))) prefix = "" result += "*/" return result def is_threading_header_unsafe_to_include(h): # NOTE: "" does not blow up when included without threads. return h in ['atomic', 'shared_mutex'] def produce_tests(): headers = set([h for tc in feature_test_macros for h in tc["headers"]]) for h in headers: test_list = [tc for tc in feature_test_macros if h in tc["headers"]] if not has_header(h): for tc in test_list: assert 'unimplemented' in tc.keys() continue test_tags = "" if is_threading_header_unsafe_to_include(h): test_tags += '\n// UNSUPPORTED: libcpp-has-no-threads\n' test_body = \ """//===----------------------------------------------------------------------===// // // 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 // //===----------------------------------------------------------------------===// // // WARNING: This test was generated by {script_name} // and should not be edited manually. {test_tags} // <{header}> // Test the feature test macros defined by <{header}> {synopsis} #include <{header}> #include "test_macros.h" #if TEST_STD_VER < 14 {cxx11_tests} #elif TEST_STD_VER == 14 {cxx14_tests} #elif TEST_STD_VER == 17 {cxx17_tests} #elif TEST_STD_VER > 17 {cxx2a_tests} #endif // TEST_STD_VER > 17 int main(int, char**) {{ return 0; }} """.format(script_name=script_name, header=h, test_tags=test_tags, synopsis=generate_synopsis(test_list), cxx11_tests=generate_std_test(test_list, 'c++11').strip(), cxx14_tests=generate_std_test(test_list, 'c++14').strip(), cxx17_tests=generate_std_test(test_list, 'c++17').strip(), cxx2a_tests=generate_std_test(test_list, 'c++2a').strip()) test_name = "{header}.version.pass.cpp".format(header=h) out_path = os.path.join(macro_test_path, test_name) with open(out_path, 'w') as f: f.write(test_body) """ Produce documentation for the feature test macros """ def make_widths(grid): widths = [] for i in range(0, len(grid[0])): cell_width = 2 + max(reduce(lambda x,y: x+y, [[len(row[i])] for row in grid], [])) widths += [cell_width] return widths def create_table(grid, indent): indent_str = ' '*indent col_widths = make_widths(grid) num_cols = len(grid[0]) result = indent_str + add_divider(col_widths, 2) header_flag = 2 for row_i in range(0, len(grid)): row = grid[row_i] result = result + indent_str + ' '.join([pad_cell(row[i], col_widths[i]) for i in range(0, len(row))]) + '\n' is_cxx_header = row[0].startswith('**') if row_i == len(grid) - 1: header_flag = 2 result = result + indent_str + add_divider(col_widths, 1 if is_cxx_header else header_flag) header_flag = 0 return result def add_divider(widths, header_flag): if header_flag == 2: return ' '.join(['='*w for w in widths]) + '\n' if header_flag == 1: return '-'.join(['-'*w for w in widths]) + '\n' else: return ' '.join(['-'*w for w in widths]) + '\n' def pad_cell(s, length, left_align=True): padding = ((length - len(s)) * ' ') return s + padding def get_status_table(): table = [["Macro Name", "Value"]] for std in get_std_dialects(): table += [["**" + std.replace("c++", "C++ ") + "**", ""]] for tc in feature_test_macros: if std not in tc["values"].keys(): continue value = "``%sL``" % tc["values"][std] if 'unimplemented' in tc.keys(): value = '*unimplemented*' table += [["``%s``" % tc["name"], value]] return table def produce_docs(): doc_str = """.. _FeatureTestMacroTable: ========================== Feature Test Macro Support ========================== .. contents:: :local: Overview ======== This file documents the feature test macros currently supported by libc++. .. _feature-status: Status ====== .. table:: Current Status :name: feature-status-table :widths: auto {status_tables} """.format(status_tables=create_table(get_status_table(), 4)) table_doc_path = os.path.join(docs_path, 'FeatureTestMacroTable.rst') with open(table_doc_path, 'w') as f: f.write(doc_str) def main(): with tempfile.NamedTemporaryFile(mode='w', prefix='version.', delete=False) as tmp_file: print("producing new header as %s" % tmp_file.name) tmp_file.write(produce_version_header()) produce_tests() produce_docs() if __name__ == '__main__': main() diff --git a/libcxx/www/cxx2a_status.html b/libcxx/www/cxx2a_status.html index 5a520f185c26..6a2f2f44d145 100644 --- a/libcxx/www/cxx2a_status.html +++ b/libcxx/www/cxx2a_status.html @@ -1,586 +1,586 @@ libc++ C++2a Status

libc++ C++2a Status

In July 2017, the C++ standard committee created a draft for the next version of the C++ standard, known here as "C++2a" (probably to be C++20).

This page shows the status of libc++; the status of clang's support of the language features is here.

Reminder: Features in unreleased drafts of the standard are subject to change.

The groups that have contributed papers:

  • LWG - Library working group
  • CWG - Core Language Working group
  • SG1 - Study group #1 (Concurrency working group)

Paper Status

- +
Paper #GroupPaper NameMeetingStatusFirst released version
P0463R1LWGEndian just EndianTorontoComplete7.0
P0674R1LWGExtending make_shared to Support ArraysToronto
P0020R6LWGFloating Point AtomicAlbuquerque
P0053R7LWGC++ Synchronized Buffered OstreamAlbuquerque
P0202R3LWGAdd constexpr modifiers to functions in <algorithm> and <utility> HeadersAlbuquerqueIn Progress7.0
P0415R1LWGConstexpr for std::complexAlbuquerqueIn Progress7.0
P0439R0LWGMake std::memory_order a scoped enumerationAlbuquerqueComplete
P0457R2LWGString Prefix and Suffix CheckingAlbuquerqueComplete6.0
P0550R2LWGTransformation Trait remove_cvrefAlbuquerqueComplete6.0
P0600R1LWGnodiscard in the LibraryAlbuquerqueIn Progress7.0
P0616R0LWGde-pessimize legacy algorithms with std::moveAlbuquerque
P0653R2LWGUtility to convert a pointer to a raw pointerAlbuquerqueComplete6.0
P0718R2LWGAtomic shared_ptrAlbuquerque
P0767R1CWGDeprecate PODAlbuquerqueComplete7.0
P0768R1CWGLibrary Support for the Spaceship (Comparison) OperatorAlbuquerqueComplete
P0777R1LWGTreating Unnecessary decayAlbuquerqueComplete7.0
P0122R7LWG<span>JacksonvilleComplete7.0
P0355R7LWGExtending chrono to Calendars and Time ZonesJacksonvilleIn progress
P0551R3LWGThou Shalt Not Specialize std Function Templates!Jacksonville
P0753R2LWGManipulators for C++ Synchronized Buffered OstreamJacksonville
P0754R2LWG<version>JacksonvilleComplete7.0
P0809R0LWGComparing Unordered ContainersJacksonville
P0858R0LWGConstexpr iterator requirementsJacksonville
P0905R1CWGSymmetry for spaceshipJacksonville
P0966R1LWGstring::reserve Should Not ShrinkJacksonvilleComplete8.0
P0019R8LWGAtomic RefRapperswil
P0458R2LWGChecking for Existence of an Element in Associative ContainersRapperswilComplete
P0475R1LWGLWG 2511: guaranteed copy elision for piecewise constructionRapperswil
P0476R2LWGBit-casting object representationsRapperswil
P0528R3CWGThe Curious Case of Padding Bits, Featuring Atomic Compare-and-ExchangeRapperswil
P0542R5CWGSupport for contract based programming in C++Rapperswil
P0556R3LWGIntegral power-of-2 operationsRapperswilComplete9.0
P0619R4LWGReviewing Deprecated Facilities of C++17 for C++20Rapperswil
P0646R1LWGImproving the Return Value of Erase-Like AlgorithmsRapperswilComplete10.0
P0722R3CWGEfficient sized delete for variable sized classesRapperswilComplete9.0
P0758R1LWGImplicit conversion traits and utility functionsRapperswilComplete
P0759R1LWGfpos RequirementsRapperswilComplete11.0
P0769R2LWGAdd shift to <algorithm>Rapperswil
P0788R3LWGStandard Library Specification in a Concepts and Contracts WorldRapperswil
P0879R0LWGConstexpr for swap and swap related functions Also resolves LWG issue 2800.Rapperswil
P0887R1LWGThe identity metafunctionRapperswilComplete8.0
P0892R2CWGexplicit(bool)Rapperswil
P0898R3LWGStandard Library ConceptsRapperswil
P0935R0LWGEradicating unnecessarily explicit default constructors from the standard libraryRapperswil
P0941R2CWGIntegrating feature-test macros into the C++ WDRapperswilIn progress
P1023R0LWGconstexpr comparison operators for std::arrayRapperswilComplete8.0
P1025R1CWGUpdate The Reference To The Unicode StandardRapperswil
P1120R0CWGConsistency improvements for <=> and other comparison operatorsRapperswil
P0318R1LWGunwrap_ref_decay and unwrap_referenceSan DiegoComplete8.0
P0356R5LWGSimplified partial function applicationSan Diego
P0357R3LWGreference_wrapper for incomplete typesSan DiegoComplete8.0
P0482R6CWGchar8_t: A type for UTF-8 characters and stringsSan Diego
P0487R1LWGFixing operator>>(basic_istream&, CharT*) (LWG 2499)San DiegoComplete8.0
P0591R4LWGUtility functions to implement uses-allocator constructionSan Diego
P0595R2CWGP0595R2 std::is_constant_evaluated()San DiegoComplete9.0
P0602R4LWGvariant and optional should propagate copy/move trivialitySan DiegoComplete8.0
P0608R3LWGA sane variant converting constructorSan DiegoComplete9.0
P0655R1LWGvisit<R>: Explicit Return Type for visitSan Diego
P0771R1LWGstd::function move constructor should be noexceptSan DiegoComplete6.0
P0896R4LWGThe One Ranges ProposalSan Diego
P0899R1LWGP0899R1 - LWG 3016 is not a defectSan DiegoNothing to do
P0919R3LWGHeterogeneous lookup for unordered containersSan Diego
P0972R0LWG<chrono> zero(), min(), and max() should be noexceptSan DiegoComplete8.0
P1006R1LWGConstexpr in std::pointer_traitsSan DiegoComplete8.0
P1007R3LWGstd::assume_alignedSan Diego
P1020R1LWGSmart pointer creation with default initializationSan Diego
P1032R1LWGMisc constexpr bitsSan Diego
P1085R2LWGShould Span be Regular?San DiegoComplete8.0
P1123R0LWGEditorial Guidance for merging P0019r8 and P0528r3San Diego
P1148R0LWGCleaning up Clause 20San Diego
P1165R1LWGMake stateful allocator propagation more consistent for operator+(basic_string)San Diego
P1209R0LWGAdopt Consistent Container Erasure from Library Fundamentals 2 for C++20San DiegoComplete8.0
P1210R0LWGCompleting the Rebase of Library Fundamentals, Version 3, Working DraftSan Diego
P1236R1CWGAlternative Wording for P0907R4 Signed Integers are Two's ComplementSan Diego
P1248R1LWGRemove CommonReference requirement from StrictWeakOrdering (a.k.a Fixing Relations)San Diego
P1285R0LWGImproving Completeness Requirements for Type TraitsSan Diego
P1353R0CWGMissing feature test macrosSan Diego
P0339R6LWGpolymorphic_allocator<> as a vocabulary typeKona
P0340R3LWGMaking std::underlying_type SFINAE-friendlyKona
P0738R2LWGI Stream, You Stream, We All Stream for istream_iteratorKona
P0811R3LWGWell-behaved interpolation for numbers and pointersKonaComplete9.0
P0920R2LWGPrecalculated hash values in lookupKonaReverted by P1661
P1001R2LWGTarget Vectorization Policies from Parallelism V2 TS to C++20Kona
P1024R3LWGUsability Enhancements for std::spanKonaComplete9.0
P1164R1LWGMake create_directory() IntuitiveKona
P1227R2LWGSigned ssize() functions, unsigned size() functions KonaComplete9.0
P1252R2LWGRanges Design CleanupKona
P1286R2CWGContra CWG DR1778Kona
P1357R1LWGTraits for [Un]bounded ArraysKonaComplete9.0
P1458R1LWGMandating the Standard Library: Clause 16 - Language support libraryKonaComplete9.0
P1459R1LWGMandating the Standard Library: Clause 18 - Diagnostics libraryKonaComplete9.0
P1462R1LWGMandating the Standard Library: Clause 20 - Strings libraryKonaComplete9.0
P1463R1LWGMandating the Standard Library: Clause 21 - Containers libraryKona
P1464R1LWGMandating the Standard Library: Clause 22 - Iterators libraryKonaComplete9.0
P0325LWGto_array from LFTS with updatesCologneComplete10.0
P0408LWGEfficient Access to basic_stringbuf ’s BufferCologne
P0466LWGLayout-compatibility and Pointer-interconvertibility TraitsCologne
P0553LWGBit operationsCologneComplete9.0
P0631LWGMath ConstantsCologne
P0631LWGMath ConstantsCologneComplete11.0
P0645LWGText FormattingCologne
P0660LWGStop Token and Joining Thread, Rev 10Cologne
P0784CWGMore constexpr containersCologne
P0980LWGMaking std::string constexprCologne
P1004LWGMaking std::vector constexprCologne
P1035LWGInput Range AdaptorsCologne
P1065LWGConstexpr INVOKECologne
P1135LWGThe C++20 Synchronization LibraryCologneComplete
P1207LWGMovability of Single-pass IteratorsCologne
P1208LWGAdopt source_location for C++20Cologne
P1355LWGExposing a narrow contract for ceil2CologneComplete9.0
P1361LWGIntegration of chrono with text formattingCologne
P1423LWGchar8_t backward compatibility remediationCologne
P1424LWG'constexpr' feature macro concernsCologne
P1466LWGMiscellaneous minor fixes for chronoCologne
P1474LWGHelpful pointers for ContiguousIteratorCologne
P1502LWGStandard library header units for C++20Cologne
P1522LWGIterator Difference Type and Integer OverflowCologne
P1523LWGViews and Size TypesCologne
P1612LWGRelocate Endian’s SpecificationCologneComplete10.0
P1614LWGThe Mothership has LandedCologneIn progress
P1638LWGbasic_istream_view::iterator should not be copyableCologne
P1643LWGAdd wait/notify to atomic_refCologne
P1644LWGAdd wait/notify to atomicCologne
P1650LWGOutput std::chrono::days with 'd' suffixCologne
P1651LWGbind_front should not unwrap reference_wrapperCologne
P1652LWGPrintf corner cases in std::formatCologne
P1661LWGRemove dedicated precalculated hash lookup interfaceCologneNothing to do
P1754LWGRename concepts to standard_case for C++20, while we still canCologne
P0883LWGFixing Atomic Initialization Belfast
P1391LWGRange constructor for std::string_view Belfast
P1394LWGRange constructor for std::span Belfast
P1456LWGMove-only views Belfast
P1622LWGMandating the Standard Library: Clause 32 - Thread support library Belfast
P1645LWGconstexpr for numeric algorithms Belfast
P1664LWGreconstructible_range - a concept for putting ranges back together Belfast
P1686LWGMandating the Standard Library: Clause 27 - Time library Belfast
P1690LWGRefinement Proposal for P0919 Heterogeneous lookup for unordered containers Belfast
P1716LWGranges compare algorithm are over-constrained Belfast
P1718LWGMandating the Standard Library: Clause 25 - Algorithms library Belfast
P1719LWGMandating the Standard Library: Clause 26 - Numerics library Belfast
P1720LWGMandating the Standard Library: Clause 28 - Localization library Belfast
P1721LWGMandating the Standard Library: Clause 29 - Input/Output library Belfast
P1722LWGMandating the Standard Library: Clause 30 - Regular Expression library Belfast
P1723LWGMandating the Standard Library: Clause 31 - Atomics library Belfast
P1855LWGMake <compare> freestandingBelfast
P1862LWGRanges adaptors for non-copyable iterators Belfast
P1865LWGAdd max() to latch and barrier Belfast
P1869LWGRename 'condition_variable_any' interruptible wait methods Belfast
P1870LWGforwarding-range is too subtle Belfast
P1871LWGShould concepts be enabled or disabled? Belfast
P1872LWGspan should have size_type, not index_type BelfastComplete10.0
P1878LWGConstraining Readable Types Belfast
P1892LWGExtended locale-specific presentation specifiers for std::format Belfast
P1902LWGMissing feature-test macros 2018-2019 Belfast
P1959LWGRemove std::weak_equality and std::strong_equalityBelfast
P1960LWGNB Comment Changes Reviewed by SG1Belfast
P1961LWGHarmonizing the definitions of total order for pointersBelfast
P1965LWGBlanket Wording for Specifying “Hidden Friends”Belfast
P0586LWGSafe integral comparisonsPrague
P0593CWGImplicit creation of objects for low-level object manipulationPrague
P1115LWGImproving the Return Value of Erase-Like Algorithms II: Free erase/erase ifPragueComplete11.0
P1243LWGRangify New AlgorithmsPrague
P1460LWGMandating the Standard Library: Clause 20 - Utilities libraryPrague
P1739LWGAvoid template bloat for safe_ranges in combination with "subrange-y" view adaptorsPrague
P1831LWGDeprecating volatile: libraryPrague
P1868LWGwidth: clarifying units of width and precision in std::formatPrague
P1908CWGReserving Attribute Namespaces for Future UsePrague
P1937CWGFixing inconsistencies between constexpr and consteval functionsPrague
P1956LWGOn the names of low-level bit manipulation functionsPrague
P1957CWGConverting from T* to bool should be considered narrowing (re: US 212)Prague
P1963LWGFixing US 313Prague
P1964LWGWording for boolean-testablePrague
P1970LWGConsistency for size() functions: Add ranges::ssizePrague
P1973LWGRename "_default_init" Functions, Rev1Prague
P1976LWGFixed-size span construction from dynamic rangePragueComplete11.0
P1981LWGRename leap to leap_secondPrague
P1982LWGRename link to time_zone_linkPrague
P1983LWGWording for GB301, US296, US292, US291, and US283Prague
P1994LWGelements_view needs its own sentinelPrague
P2002CWGDefaulted comparison specification cleanupsPrague
P2045LWGMissing Mandates for the standard libraryPrague
P2085CWGConsistent defaulted comparisonsPrague
P2091LWGIssues with range access CPOsPrague
P2101LWG'Models' subsumes 'satisfies' (Wording for US298 and US300)Prague
P2102LWGMake 'implicit expression variations' more explicit (Wording for US185)Prague
P2106LWGAlternative wording for GB315 and GB316Prague
P2116LWGRemove tuple-like protocol support from fixed-extent spanPragueComplete11.0

[ Note: "Nothing to do" means that no library changes were needed to implement this change -- end note]

The missing bits in P0600 are in [mem.res.class], [mem.poly.allocator.class], and [container.node.overview]

The missing bits in P0202 are in copy, copy_backwards, move, and move_backwards (and the ones that call them: copy_n, rotate_copy, merge, set_union, set_difference, and set_symmetric_difference). This is because the first four algorithms have specializations that call memmove which is not constexpr. See Bug 25165

Library Working group Issues Status

-->
Issue #Issue NameMeetingStatus
2070allocate_shared should use allocator_traits<A>::constructTorontoResolved by P0674R1
2444Inconsistent complexity for std::sort_heapToronto
2593Moved-from state of AllocatorsToronto
2597std::log misspecified for complex numbersToronto
2783stack::emplace() and queue::emplace() should return decltype(auto)TorontoComplete
2932Constraints on parallel algorithm implementations are underspecifiedToronto
2937Is equivalent("existing_thing", "not_existing_thing") an errorTorontoComplete
2940result_of specification also needs a little cleanupToronto
2942LWG 2873's resolution missed weak_ptr::owner_beforeTorontoComplete
2954Specialization of the convenience variable templates should be prohibitedTorontoComplete
2961Bad postcondition for set_default_resourceToronto
2966Incomplete resolution of US 74TorontoNothing to do
2974Diagnose out of bounds tuple_element/variant_alternativeTorontoComplete
2779[networking.ts] Relax requirements on buffer sequence iteratorsAlbuquerque
2870Default value of parameter theta of polar should be dependentAlbuquerqueComplete
2935What should create_directories do when p already exists but is not a directory?Albuquerque
2941[thread.req.timing] wording should apply to both member and namespace-level functionsAlbuquerqueNothing to do
2944LWG 2905 accidentally removed requirement that construction of the deleter doesn't throw an exceptionAlbuquerqueNothing to do
2945Order of template parameters in optional comparisonsAlbuquerqueComplete
2948unique_ptr does not define operator<< for stream outputAlbuquerqueComplete
2950std::byte operations are misspecifiedAlbuquerqueComplete
2952iterator_traits should work for pointers to cv TAlbuquerqueComplete
2953LWG 2853 should apply to deque::erase tooAlbuquerqueComplete
2958Moves improperly defined as deletedAlbuquerqueWe already do this
2964Apparently redundant requirement for dynamic_pointer_castAlbuquerque
2965Non-existing path::native_string() in filesystem_error::what() specificationAlbuquerqueNothing to do
2972What is is_trivially_destructible_v<int>?AlbuquerqueComplete
2976Dangling uses_allocator specialization for packaged_taskAlbuquerqueComplete
2977unordered_meow::merge() has incorrect Throws: clauseAlbuquerqueNothing to do
2978Hash support for pmr::string and friendsAlbuquerque
2979aligned_union should require complete object typesAlbuquerqueComplete
2980Cannot compare_exchange empty pointersAlbuquerque
2981Remove redundant deduction guides from standard libraryAlbuquerque
2982Making size_type consistent in associative container deduction guidesAlbuquerque
2988Clause 32 cleanup missed one typenameAlbuquerque
2993reference_wrapper conversion from T&&Albuquerque
2998Requirements on function objects passed to {forward_,}list-specific algorithmsAlbuquerqueNothing to do
3001weak_ptr::element_type needs remove_extent_tAlbuquerque
3024variant's copies must be deleted instead of disabled via SFINAEAlbuquerqueComplete
2164What are the semantics of vector.emplace(vector.begin(), vector.back())?JacksonvilleComplete
2243istream::putback problemJacksonvilleComplete
2816resize_file has impossible postconditionJacksonvilleNothing to do
2843Unclear behavior of std::pmr::memory_resource::do_allocate()JacksonvilleComplete
2849Why does !is_regular_file(from) cause copy_file to report a "file already exists" error?JacksonvilleNothing to do
2851std::filesystem enum classes are now underspecifiedJacksonvilleNothing to do
2946LWG 2758's resolution missed further correctionsJacksonvilleComplete
2969polymorphic_allocator::construct() shouldn't pass resource()JacksonvilleComplete
2975Missing case for pair construction in scoped and polymorphic allocatorsJacksonville
2989path's stream insertion operator lets you insert everything under the sunJacksonvilleCompleted
3000monotonic_memory_resource::do_is_equal uses dynamic_cast unnecessarilyJacksonville
3002[networking.ts] basic_socket_acceptor::is_open() isn't noexceptJacksonville
3004§[string.capacity] and §[vector.capacity] should specify time complexity for capacity()JacksonvilleNothing to do
3005Destruction order of arrays by make_shared/allocate_shared only recommended?Jacksonville
3007allocate_shared should rebind allocator to cv-unqualified value_type for constructionJacksonville
3009Including <string_view> doesn't provide std::size/empty/dataJacksonvilleComplete
3010[networking.ts] uses_executor says "if a type T::executor_type exists"Jacksonville
3013(recursive_)directory_iterator construction and traversal should not be noexceptJacksonvilleComplete
3014More noexcept issues with filesystem operationsJacksonvilleComplete
3015copy_options::unspecified underspecifiedJacksonvilleNothing to do
3017list splice functions should use addressofJacksonvilleComplete
3020[networking.ts] Remove spurious nested value_type buffer sequence requirementJacksonville
3026filesystem::weakly_canonical still defined in terms of canonical(p, base)JacksonvilleComplete
3030Who shall meet the requirements of try_lock?JacksonvilleNothing to do
3034P0767R1 breaks previously-standard-layout typesJacksonvilleComplete
3035std::allocator's constructors should be constexprJacksonvilleComplete
3039Unnecessary decay in thread and packaged_taskJacksonvilleComplete
3041Unnecessary decay in reference_wrapperJacksonvilleComplete
3042is_literal_type_v should be inlineJacksonvilleComplete
3043Bogus postcondition for filesystem_error constructorJacksonvilleComplete
3045atomic<floating-point> doesn't have value_type or difference_typeJacksonville
3048transform_reduce(exec, first1, last1, first2, init) discards execution policyJacksonville
3051Floating point classifications were inadvertently changed in P0175JacksonvilleNothing to do
3075basic_string needs deduction guides from basic_string_viewJacksonvilleComplete
2139What is a user-defined type?Rapperswil
2970Return type of std::visit misspecifiedRapperswil
3058Parallel adjacent_difference shouldn't require creating temporariesRapperswil
3062Unnecessary decay_t in is_execution_policy_v should be remove_cvref_tRapperswil
3067recursive_directory_iterator::pop must invalidateRapperswilNothing to do
3071[networking.ts] read_until still refers to "input sequence"RapperswilNothing to do
3074Non-member functions for valarray should only deduce from the valarrayRapperswil
3076basic_string CTAD ambiguityRapperswilComplete
3079LWG 2935 forgot to fix the existing_p overloads of create_directoryRapperswil
3080Floating point from_chars pattern specification breaks round-trippingRapperswil
3083What should ios::iword(-1) do?RapperswilNothing to do
3094[time.duration.io]p4 makes surprising claims about encodingRapperswil
3100Unnecessary and confusing "empty span" wordingRapperswilNothing to do
3102Clarify span iterator and const_iterator behaviorRapperswilComplete
3104Fixing duration divisionRapperswilComplete
2183Muddled allocator requirements for match_results constructorsSan DiegoComplete
2184Muddled allocator requirements for match_results assignmentsSan DiegoComplete
2412promise::set_value() and promise::get_future() should not raceSan Diego
2499operator>>(basic_istream&, CharT*) makes it hard to avoid buffer overflowsSan DiegoResolved by P0487R1
2682filesystem::copy() won't create a symlink to a directorySan DiegoNothing to do
2697[concurr.ts] Behavior of future/shared_future unwrapping constructor when given an invalid futureSan Diego
2797Trait precondition violationsSan DiegoResolved by 1285R0
2936Path comparison is defined in terms of the generic formatSan DiegoComplete
2943Problematic specification of the wide version of basic_filebuf::openSan DiegoNothing to do
2960[fund.ts.v3] nonesuch is insufficiently uselessSan DiegoComplete
2995basic_stringbuf default constructor forbids it from using SSO capacitySan Diego
2996Missing rvalue overloads for shared_ptr operationsSan Diego
3008make_shared (sub)object destruction semantics are not specifiedSan Diego
3022is_convertible<derived*, base*> may lead to ODRSan DiegoResolved by 1285R0
3025Map-like container deduction guides should use pair<Key, T>, not pair<const Key, T>San DiegoComplete
3031Algorithms and predicates with non-const reference argumentsSan Diego
3037polymorphic_allocator and incomplete typesSan Diego
3038polymorphic_allocator::allocate should not allow integer overflow to create vulnerabilitiesSan Diego
3054uninitialized_copy appears to not be able to meet its exception-safety guaranteeSan Diego
3065LWG 2989 missed that all path's other operators should be hidden friends as wellSan DiegoComplete
3096path::lexically_relative is confused by trailing slashesSan DiegoComplete
3116OUTERMOST_ALLOC_TRAITS needs remove_reference_tSan Diego
3122__cpp_lib_chrono_udls was accidentally droppedSan DiegoComplete
3127basic_osyncstream::rdbuf needs a const_castSan Diego
3128strstream::rdbuf needs a const_castSan DiegoNothing to do
3129regex_token_iterator constructor uses wrong pointer arithmeticSan Diego
3130§[input.output] needs many addressofSan Diego
3131addressof all the thingsSan Diego
3132Library needs to ban macros named expects or ensuresSan DiegoNothing to do
3134[fund.ts.v3] LFTSv3 contains extraneous [meta] variable templates that should have been deleted by P09961San DiegoResolved by P1210R0
3137Header for __cpp_lib_to_charsSan DiegoComplete
3145file_clock breaks ABI for C++17 implementationsSan DiegoComplete
3147Definitions of "likely" and "unlikely" are likely to cause problemsSan Diego
3148<concepts> should be freestandingSan Diego
3153Common and common_type have too little in commonSan Diego
3154Common and CommonReference have a common defectSan Diego
3012atomic<T> is unimplementable for non-is_trivially_copy_constructible TKona
3040basic_string_view::starts_with Effects are incorrectKonaComplete
3077(push|emplace)_back should invalidate the end iteratorKonaNothing to do
3087One final &x in §[list.ops]KonaNothing to do
3101span's Container constructors need another constraintKonaComplete
3112system_error and filesystem_error constructors taking a string may not be able to meet their postconditionsKona
3119Program-definedness of closure typesKonaNothing to do
3133Modernizing numeric type requirementsKona
3144span does not have a const_pointer typedefKonaComplete
3173Enable CTAD for ref-viewKona
3179subrange should always model RangeKona
3180Inconsistently named return type for ranges::minmax_elementKona
3182Specification of Same could be clearerKona
2899is_(nothrow_)move_constructible and tuple, optional and unique_ptrCologneComplete
3055path::operator+=(single-character) misspecifiedCologne
3158tuple(allocator_arg_t, const Alloc&) should be conditionally explicitCologne
3169ranges permutation generators discard useful informationCologne
3183Normative permission to specialize Ranges variable templatesCologne
3184Inconsistencies in bind_front wordingCologne
3185Uses-allocator construction functions missing constexpr and noexceptCologne
3186ranges removal, partition, and partial_sort_copy algorithms discard useful informationCologne
3187P0591R4 reverted DR 2586 fixes to scoped_allocator_adaptor::construct()Cologne
3191std::ranges::shuffle synopsis does not match algorithm definitionCologne
3196std::optional<T> is ill-formed is T is an arrayCologneComplete
3198Bad constraint on std::span::span()CologneComplete
3199istream >> bitset<0> failsCologne
3202P0318R1 was supposed to be revisedCologneComplete
3206year_month_day conversion to sys_days uses not-existing member functionCologneComplete
3208Boolean's expression requirements are ordered inconsistentlyCologneNothing to do
3209Expression in year::ok() returns clause is ill-formedCologneComplete
3231year_month_day_last::day specification does not cover !ok() valuesBelfastNothing to do
3225zoned_time converting constructor shall not be noexceptBelfast
3190std::allocator::allocate sometimes returns too little storageBelfast
3218Modifier for %d parse flag does not match POSIX and format specificationBelfast
3224zoned_time constructor from TimeZonePtr does not specify initialization of tp_Belfast
3230Format specifier %y/%Y is missing locale alternative versionsBelfast
3232Inconsistency in zoned_time deduction guidesBelfast
3222P0574R1 introduced preconditions on non-existent parametersBelfast
3221Result of year_month arithmetic with months is ambiguousBelfast
3235parse manipulator without abbreviation is not callableBelfast
3246What are the constraints on the template parameter of basic_format_arg?Belfast
3253basic_syncbuf::basic_syncbuf() should not be explicitBelfast
3245Unnecessary restriction on '%p' parse specifierBelfast
3244Constraints for Source in §[fs.path.req] insufficiently constraintyBelfast
3241chrono-spec grammar ambiguity in §[time.format]Belfast
3257Missing feature testing macro update from P0858Belfast
3256Feature testing macro for constexpr algorithmsBelfast
3273Specify weekday_indexed to range of [0, 7]Belfast
3070path::lexically_relative causes surprising results if a filename can also be a root-nameBelfast
3266to_chars(bool) should be deletedBelfast
3272%I%p should parse/format duration since midnightBelfast
3259The definition of constexpr iterators should be adjustedBelfast
3103Errors in taking subview of span should be ill-formed where possibleBelfast
3274Missing feature test macro for <span>Belfast
3276Class split_view::outer_iterator::value_type should inherit from view_interfaceBelfast
3277Pre-increment on prvalues is not a requirement of weakly_incrementableBelfast
3149DefaultConstructible should require default initializationBelfast
1203More useful rvalue stream insertionPrague
2859Definition of reachable in [ptr.launder] misses pointer arithmetic from pointer-interconvertible objectPrague
3018shared_ptr of function typePrague
3050Conversion specification problem in chrono::duration constructorPrague
3141CopyConstructible doesn't preserve source valuesPrague
3150UniformRandomBitGenerator should validate min and maxPrague
3175The CommonReference requirement of concept SwappableWith is not satisfied in the examplePrague
3194ConvertibleTo prose does not match codePrague
3200midpoint should not constrain T is completePrague
3201lerp should be marked as noexceptPragueComplete
3226zoned_time constructor from string_view should accept zoned_time<Duration2, TimeZonePtr2>Prague
3233Broken requirements for shared_ptr converting constructorsPrague
3237LWG 3038 and 3190 have inconsistent PRsPrague
3238Insufficiently-defined behavior of std::function deduction guidesPrague
3242std::format: missing rules for arg-id in width and precisionPrague
3243std::format and negative zeroesPrague
3247ranges::iter_move should perform ADL-only lookup of iter_movePrague
3248std::format #b, #B, #o, #x, and #X presentation types misformat negative numbersPrague
3250std::format: # (alternate form) for NaN and infPrague
3251Are std::format alignment specifiers applied to string arguments?Prague
3252Parse locale's aware modifiers for commands are not consistent with POSIX specPrague
3254Strike stop_token's operator!=Prague
3255span's array constructor is too strictPragueComplete
3260year_month* arithmetic rejects durations convertible to yearsPrague
3262Formatting of negative durations is not specifiedPrague
3264sized_range and ranges::size redundantly use disable_sized_rangePrague
3269Parse manipulators do not specify the result of the extraction from streamPrague
3270Parsing and formatting %j with durationsPrague
3280View converting constructors can cause constraint recursion and are unneededPrague
3281Conversion from pair-like types to subrange is a silent semantic promotionPrague
3282subrange converting constructor should disallow derived to base conversionsPrague
3284random_access_iterator semantic constraints accidentally promote difference type using unary negatePrague
3285The type of a customization point object shall satisfy semiregularPrague
3286ranges::size is not required to be valid after a call to ranges::begin on an input rangePrague
3291iota_view::iterator has the wrong iterator_categoryPrague
3292iota_view is under-constrainedPrague
3294zoned_time deduction guides misinterprets string/char*Prague
3296Inconsistent default argument for basic_regex<>::assignPrague
3299Pointers don't need customized iterator behaviorPrague
3300Non-array ssize overload is underconstrainedPrague
3301transform_view::iterator has incorrect iterator_categoryPrague
3302Range adaptor objects keys and values are unspecifiedPrague
3303Bad "constexpr" marker for destroy/destroy_nPrague
3304Allocate functions of std::polymorphic_allocator should require [[nodiscard]]Prague
3307std::allocator<void>().allocate(n)Prague
3310Replace SIZE_MAX with numeric_limits<size_t>::max()Prague
3313join_view::iterator::operator-- is incorrectly constrainedPrague
3314Is stream insertion behavior locale dependent when Period::type is micro?Prague
3315Correct Allocator Default BehaviorPrague
3316Correctly define epoch for utc_clock / utc_timepointPrague
3317Incorrect operator<< for floating-point durationsPrague
3318Clarify whether clocks can represent time before their epochPrague
3319Properly reference specification of IANA time zone databasePrague
3320span::cbegin/cend methods produce different results than std::[ranges::]cbegin/cendPragueComplete
3321uninitialized_construct_using_allocator should use construct_atPrague
3323has-tuple-element helper concept needs convertible_toPrague
3324Special-case std::strong/weak/partial_order for pointersPrague
3325Constrain return type of transformation function for transform_viewPrague
3326enable_view has false positivesPrague
3327Format alignment specifiers vs. text directionPrague
3328Clarify that std::string is not good for UTF-8Prague
3329totally_ordered_with both directly and indirectly requires common_reference_withPrague
3330Include <compare> from most library headersPrague
3331Define totally_ordered/_with in terms of partially-ordered-withPrague
3332Issue in §[time.format]Prague
3334basic_osyncstream move assignment and destruction calls basic_syncbuf::emit() twicePrague
3335Resolve C++20 NB comments US 273 and GB 274Prague
3338Rename default_constructible to default_initializablePrague
3340Formatting functions should throw on argument/format string mismatch in §[format.functions]Prague
3346pair and tuple copy and move constructor have backwards specificationPrague
3347std::pair<T, U> now requires T and U to be less-than-comparablePrague
3348__cpp_lib_unwrap_ref in wrong headerPrague
3349Missing __cpp_lib_constexpr_complex for P0415R1Prague
3350Simplify return type of lexicographical_compare_three_wayPrague
3351ranges::enable_safe_range should not be constrainedPrague
3352strong_equality isn't a thingPrague
3354has_strong_structural_equality has a meaningless definitionPrague
3355The memory algorithms should support move-only input iterators introduced by P1207Prague
3356__cpp_lib_nothrow_convertible should be __cpp_lib_is_nothrow_convertiblePrague
3358§[span.cons] is mistaken that to_address can throwPrague
3359<chrono> leap second support should allow for negative leap secondsPrague
3360three_way_comparable_with is inconsistent with similar conceptsPrague
3362Strike stop_source's operator!=Prague
3363drop_while_view should opt-out of sized_rangePrague
3364Initialize data members of ranges and their iteratorsPrague
3367Integer-class conversions should not throwPrague
3369span's deduction-guide for built-in arrays doesn't workPrague
3371visit_format_arg and make_format_args are not hidden friendsPrague
3372vformat_to should not try to deduce Out twicePrague
3373{to,from}_chars_result and format_to_n_result need the "we really mean what we say" wordingPrague
3374P0653 + P1006 should have made the other std::to_address overload constexprPrague
3375decay in viewable_range should be remove_cvrefPrague
3377elements_view::iterator befriends a specialization of itselfPrague
3379"safe" in several library names is misleadingPrague
3380common_type and comparison categoriesPrague
3381begin and data must agree for contiguous_rangePrague
3382NTTP for pair and arrayPrague
3383§[time.zone.leap.nonmembers] sys_seconds should be replaced with secondsPrague
3384transform_view::sentinel has an incorrect operator-Prague
3385common_iterator is not sufficiently constrained for non-copyable iteratorsPrague
3387§[range.reverse.view] reverse_view<V> unintentionally requires range<const V>Prague
3388view iterator types have ill-formed <=> operatorsPrague
3389A move-only iterator still does not have a counted_iteratorPrague
3390make_move_iterator() cannot be used to construct a move_iterator for a move-only iteratorPrague
3393Missing/incorrect feature test macro for coroutinesPrague
3395Definition for three-way comparison needs to be updated (US 152)Prague
3396Clarify point of reference for source_location::current() (DE 169)Prague
3397ranges::basic_istream_view::iterator should not provide iterator_categoryPrague
3398tuple_element_t is also wrong for const subrangePrague

Last Updated: 16-Feb-2020