mirror of
https://github.com/darlinghq/darling-libcxx.git
synced 2024-11-26 21:30:42 +00:00
Downgrading libcxx to llvmorg-13.0.1
It turns out that llvmorg-14.0.6 might be too new for dyld (the vector base class no longer exist in that release).
This commit is contained in:
parent
e3bbeb7fdc
commit
a574ade231
@ -1,4 +0,0 @@
|
||||
{
|
||||
"repository.callsign" : "CXX",
|
||||
"conduit_uri" : "https://reviews.llvm.org/"
|
||||
}
|
@ -10,4 +10,7 @@ PointerAlignment: Left
|
||||
# Disable formatting options which may break tests.
|
||||
SortIncludes: false
|
||||
ReflowComments: false
|
||||
|
||||
# libc++ has some long names so we need more than the 80 column limit imposed by LLVM style, for sensible formatting
|
||||
ColumnLimit: 120
|
||||
---
|
||||
|
6
.gitignore
vendored
6
.gitignore
vendored
@ -22,12 +22,6 @@ var/
|
||||
.installed.cfg
|
||||
*.egg
|
||||
|
||||
# PyInstaller
|
||||
# Usually these files are written by a python script from a template
|
||||
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
||||
*.manifest
|
||||
*.spec
|
||||
|
||||
# Installer logs
|
||||
pip-log.txt
|
||||
pip-delete-this-directory.txt
|
||||
|
@ -10,14 +10,11 @@ endif()
|
||||
#===============================================================================
|
||||
cmake_minimum_required(VERSION 3.13.4)
|
||||
|
||||
set(LLVM_COMMON_CMAKE_UTILS "${CMAKE_CURRENT_SOURCE_DIR}/../cmake")
|
||||
|
||||
# Add path for custom modules
|
||||
list(INSERT CMAKE_MODULE_PATH 0
|
||||
set(CMAKE_MODULE_PATH
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/cmake"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules"
|
||||
"${LLVM_COMMON_CMAKE_UTILS}"
|
||||
"${LLVM_COMMON_CMAKE_UTILS}/Modules"
|
||||
${CMAKE_MODULE_PATH}
|
||||
)
|
||||
|
||||
set(CMAKE_FOLDER "libc++")
|
||||
@ -27,32 +24,37 @@ set(LIBCXX_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
|
||||
set(LIBCXX_BINARY_INCLUDE_DIR "${LIBCXX_BINARY_DIR}/include/c++build")
|
||||
|
||||
if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR OR LIBCXX_STANDALONE_BUILD)
|
||||
message(WARNING "The Standalone build is deprecated in this release. Please use one of the ways "
|
||||
"described at https://libcxx.llvm.org/BuildingLibcxx.html for building libc++.")
|
||||
project(libcxx CXX C)
|
||||
|
||||
set(PACKAGE_NAME libcxx)
|
||||
set(PACKAGE_VERSION 14.0.6)
|
||||
set(PACKAGE_VERSION 13.0.1)
|
||||
set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}")
|
||||
set(PACKAGE_BUGREPORT "llvm-bugs@lists.llvm.org")
|
||||
|
||||
# In a standalone build, we don't have llvm to automatically generate the
|
||||
# llvm-lit script for us. So we need to provide an explicit directory that
|
||||
# the configurator should write the script into.
|
||||
set(LIBCXX_STANDALONE_BUILD TRUE)
|
||||
set(LIBCXX_STANDALONE_BUILD 1)
|
||||
set(LLVM_LIT_OUTPUT_DIR "${LIBCXX_BINARY_DIR}/bin")
|
||||
endif()
|
||||
|
||||
# Must go below project(..)
|
||||
include(GNUInstallDirs)
|
||||
|
||||
if (LIBCXX_STANDALONE_BUILD)
|
||||
# Find the LLVM sources and simulate LLVM CMake options.
|
||||
include(HandleOutOfTreeLLVM)
|
||||
endif()
|
||||
|
||||
if (LIBCXX_STANDALONE_BUILD)
|
||||
find_package(Python3 COMPONENTS Interpreter)
|
||||
if(NOT Python3_Interpreter_FOUND)
|
||||
message(SEND_ERROR "Python3 not found. Python3 is required")
|
||||
message(WARNING "Python3 not found, using python2 as a fallback")
|
||||
find_package(Python2 COMPONENTS Interpreter REQUIRED)
|
||||
if(Python2_VERSION VERSION_LESS 2.7)
|
||||
message(SEND_ERROR "Python 2.7 or newer is required")
|
||||
endif()
|
||||
|
||||
# Treat python2 as python3
|
||||
add_executable(Python3::Interpreter IMPORTED)
|
||||
set_target_properties(Python3::Interpreter PROPERTIES
|
||||
IMPORTED_LOCATION ${Python2_EXECUTABLE})
|
||||
set(Python3_EXECUTABLE ${Python2_EXECUTABLE})
|
||||
endif()
|
||||
endif()
|
||||
|
||||
@ -114,16 +116,6 @@ option(LIBCXX_ENABLE_LOCALIZATION
|
||||
the C locale API (e.g. embedded). When localization is not supported,
|
||||
several parts of the library will be disabled: <iostream>, <regex>, <locale>
|
||||
will be completely unusable, and other parts may be only partly available." ON)
|
||||
option(LIBCXX_ENABLE_UNICODE
|
||||
"Whether to include support for Unicode in the library. Disabling Unicode can
|
||||
be useful when porting to platforms that don't support UTF-8 encoding (e.g.
|
||||
embedded)." ON)
|
||||
option(LIBCXX_ENABLE_WIDE_CHARACTERS
|
||||
"Whether to include support for wide characters in the library. Disabling
|
||||
wide character support can be useful when porting to platforms that don't
|
||||
support the C functionality for wide characters. When wide characters are
|
||||
not supported, several parts of the library will be disabled, notably the
|
||||
wide character specializations of std::basic_string." ON)
|
||||
option(LIBCXX_ENABLE_VENDOR_AVAILABILITY_ANNOTATIONS
|
||||
"Whether to turn on vendor availability annotations on declarations that depend
|
||||
on definitions in a shared library. By default, we assume that we're not building
|
||||
@ -135,13 +127,9 @@ option(LIBCXX_ENABLE_INCOMPLETE_FEATURES
|
||||
"Whether to enable support for incomplete library features. Incomplete features
|
||||
are new library features under development. These features don't guarantee
|
||||
ABI stability nor the quality of completed library features. Vendors
|
||||
shipping the library may want to disable this option." OFF)
|
||||
set(LIBCXX_TEST_CONFIG "legacy.cfg.in" CACHE STRING
|
||||
"The path to the Lit testing configuration to use when running the tests.
|
||||
If a relative path is provided, it is assumed to be relative to '<monorepo>/libcxx/test/configs'.")
|
||||
if (NOT IS_ABSOLUTE "${LIBCXX_TEST_CONFIG}")
|
||||
set(LIBCXX_TEST_CONFIG "${CMAKE_CURRENT_SOURCE_DIR}/test/configs/${LIBCXX_TEST_CONFIG}")
|
||||
endif()
|
||||
shipping the library may want to disable this option." ON)
|
||||
set(LIBCXX_TEST_CONFIG "${CMAKE_CURRENT_SOURCE_DIR}/test/configs/legacy.cfg.in" CACHE STRING
|
||||
"The Lit testing configuration to use when running the tests.")
|
||||
set(LIBCXX_TEST_PARAMS "" CACHE STRING
|
||||
"A list of parameters to run the Lit test suite with.")
|
||||
|
||||
@ -202,7 +190,6 @@ endif()
|
||||
|
||||
option(LIBCXX_HIDE_FROM_ABI_PER_TU_BY_DEFAULT "Enable per TU ABI insulation by default. To be used by vendors." OFF)
|
||||
set(LIBCXX_ABI_DEFINES "" CACHE STRING "A semicolon separated list of ABI macros to define in the site config header.")
|
||||
option(LIBCXX_EXTRA_SITE_DEFINES "Extra defines to add into __config_site")
|
||||
option(LIBCXX_USE_COMPILER_RT "Use compiler-rt instead of libgcc" OFF)
|
||||
set(LIBCXX_LIBCPPABI_VERSION "2" CACHE STRING "Version of libc++abi's ABI to re-export from libc++ when re-exporting is enabled.
|
||||
Note that this is not related to the version of libc++'s ABI itself!")
|
||||
@ -268,20 +255,7 @@ option(LIBCXX_ENABLE_NEW_DELETE_DEFINITIONS
|
||||
option(LIBCXXABI_USE_LLVM_UNWINDER "Build and use the LLVM unwinder." OFF)
|
||||
|
||||
# Target options --------------------------------------------------------------
|
||||
option(LIBCXX_BUILD_32_BITS "Build 32 bit multilib libc++. This option is not supported anymore when building the runtimes. Please specify a full triple instead." ${LLVM_BUILD_32_BITS})
|
||||
if (LIBCXX_BUILD_32_BITS)
|
||||
message(FATAL_ERROR "LIBCXX_BUILD_32_BITS is not supported anymore when building the runtimes, please specify a full triple instead.")
|
||||
endif()
|
||||
|
||||
if(NOT CMAKE_SYSROOT AND LIBCXX_SYSROOT)
|
||||
message(WARNING "LIBCXX_SYSROOT is deprecated, please use CMAKE_SYSROOT instead")
|
||||
endif()
|
||||
if(NOT CMAKE_CXX_COMPILER_TARGET AND LIBCXX_TARGET_TRIPLE)
|
||||
message(WARNING "LIBCXX_TARGET_TRIPLE is deprecated, please use CMAKE_CXX_COMPILER_TARGET instead")
|
||||
endif()
|
||||
if(NOT CMAKE_CXX_COMPILER_EXTERNAL_TOOLCHAIN AND LIBCXX_GCC_TOOLCHAIN)
|
||||
message(WARNING "LIBCXX_GCC_TOOLCHAIN is deprecated, please use CMAKE_CXX_COMPILER_EXTERNAL_TOOLCHAIN instead")
|
||||
endif()
|
||||
option(LIBCXX_BUILD_32_BITS "Build 32 bit libc++." ${LLVM_BUILD_32_BITS})
|
||||
|
||||
if(CMAKE_CXX_COMPILER_TARGET)
|
||||
set(LIBCXX_DEFAULT_TARGET_TRIPLE "${CMAKE_CXX_COMPILER_TARGET}")
|
||||
@ -295,7 +269,11 @@ set(LIBCXX_GCC_TOOLCHAIN "${CMAKE_CXX_COMPILER_EXTERNAL_TOOLCHAIN}" CACHE STRING
|
||||
# Feature options -------------------------------------------------------------
|
||||
option(LIBCXX_ENABLE_EXCEPTIONS "Use exceptions." ON)
|
||||
option(LIBCXX_ENABLE_RTTI "Use run time type information." ON)
|
||||
option(LIBCXX_ENABLE_GLOBAL_FILESYSTEM_NAMESPACE "Build libc++ with support for the global filesystem namespace." ON)
|
||||
option(LIBCXX_ENABLE_STDIN "Build libc++ with support for stdin/std::cin." ON)
|
||||
option(LIBCXX_ENABLE_STDOUT "Build libc++ with support for stdout/std::cout." ON)
|
||||
option(LIBCXX_ENABLE_THREADS "Build libc++ with support for threads." ON)
|
||||
option(LIBCXX_ENABLE_THREAD_UNSAFE_C_FUNCTIONS "Build libc++ with support for thread-unsafe C functions" ON)
|
||||
option(LIBCXX_ENABLE_MONOTONIC_CLOCK
|
||||
"Build libc++ with support for a monotonic clock.
|
||||
This option may only be set to OFF when LIBCXX_ENABLE_THREADS=OFF." ON)
|
||||
@ -393,6 +371,16 @@ if (LLVM_USE_SANITIZER AND LIBCXX_GENERATE_COVERAGE)
|
||||
message(FATAL_ERROR "LLVM_USE_SANITIZER cannot be used with LIBCXX_GENERATE_COVERAGE")
|
||||
endif()
|
||||
|
||||
# Set LIBCXX_BUILD_32_BITS to (LIBCXX_BUILD_32_BITS OR LLVM_BUILD_32_BITS)
|
||||
# and check that we can build with 32 bits if requested.
|
||||
if (CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32)
|
||||
if (LIBCXX_BUILD_32_BITS AND NOT LLVM_BUILD_32_BITS) # Don't duplicate the output from LLVM
|
||||
message(STATUS "Building 32 bits executables and libraries.")
|
||||
endif()
|
||||
elseif(LIBCXX_BUILD_32_BITS)
|
||||
message(FATAL_ERROR "LIBCXX_BUILD_32_BITS=ON is not supported on this platform.")
|
||||
endif()
|
||||
|
||||
# Warn users that LIBCXX_ENABLE_STATIC_ABI_LIBRARY is an experimental option.
|
||||
if (LIBCXX_ENABLE_STATIC_ABI_LIBRARY)
|
||||
message(WARNING "LIBCXX_ENABLE_STATIC_ABI_LIBRARY is an experimental option")
|
||||
@ -426,35 +414,38 @@ endif ()
|
||||
|
||||
# TODO: Projects that depend on libc++ should use LIBCXX_GENERATED_INCLUDE_DIR
|
||||
# instead of hard-coding include/c++/v1.
|
||||
|
||||
set(LIBCXX_INSTALL_INCLUDE_DIR "${CMAKE_INSTALL_INCLUDEDIR}/c++/v1" CACHE PATH
|
||||
"Path where target-agnostic libc++ headers should be installed.")
|
||||
set(LIBCXX_INSTALL_RUNTIME_DIR "${CMAKE_INSTALL_BINDIR}" CACHE PATH
|
||||
"Path where built libc++ runtime libraries should be installed.")
|
||||
|
||||
if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE)
|
||||
set(LIBCXX_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}/${LLVM_DEFAULT_TARGET_TRIPLE})
|
||||
set(LIBCXX_GENERATED_INCLUDE_DIR "${LLVM_BINARY_DIR}/include/c++/v1")
|
||||
set(LIBCXX_GENERATED_INCLUDE_TARGET_DIR "${LLVM_BINARY_DIR}/include/${LLVM_DEFAULT_TARGET_TRIPLE}/c++/v1")
|
||||
set(LIBCXX_INSTALL_LIBRARY_DIR lib${LLVM_LIBDIR_SUFFIX}/${LLVM_DEFAULT_TARGET_TRIPLE} CACHE PATH
|
||||
"Path where built libc++ libraries should be installed.")
|
||||
set(LIBCXX_INSTALL_INCLUDE_TARGET_DIR "${CMAKE_INSTALL_INCLUDEDIR}/${LLVM_DEFAULT_TARGET_TRIPLE}/c++/v1" CACHE PATH
|
||||
set(LIBCXX_INSTALL_INCLUDE_DIR "include/c++/v1" CACHE PATH
|
||||
"Path where target-agnostic libc++ headers should be installed.")
|
||||
set(LIBCXX_INSTALL_INCLUDE_TARGET_DIR "include/${LLVM_DEFAULT_TARGET_TRIPLE}/c++/v1" CACHE PATH
|
||||
"Path where target-specific libc++ headers should be installed.")
|
||||
if(LIBCXX_LIBDIR_SUBDIR)
|
||||
string(APPEND LIBCXX_LIBRARY_DIR /${LIBCXX_LIBDIR_SUBDIR})
|
||||
string(APPEND LIBCXX_INSTALL_LIBRARY_DIR /${LIBCXX_LIBDIR_SUBDIR})
|
||||
endif()
|
||||
else()
|
||||
if(LLVM_LIBRARY_OUTPUT_INTDIR)
|
||||
elseif(LLVM_LIBRARY_OUTPUT_INTDIR)
|
||||
set(LIBCXX_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR})
|
||||
set(LIBCXX_GENERATED_INCLUDE_DIR "${LLVM_BINARY_DIR}/include/c++/v1")
|
||||
else()
|
||||
set(LIBCXX_LIBRARY_DIR ${CMAKE_BINARY_DIR}/lib${LIBCXX_LIBDIR_SUFFIX})
|
||||
set(LIBCXX_GENERATED_INCLUDE_DIR "${CMAKE_BINARY_DIR}/include/c++/v1")
|
||||
endif()
|
||||
set(LIBCXX_GENERATED_INCLUDE_TARGET_DIR "${LIBCXX_GENERATED_INCLUDE_DIR}")
|
||||
set(LIBCXX_INSTALL_LIBRARY_DIR lib${LIBCXX_LIBDIR_SUFFIX} CACHE PATH
|
||||
"Path where built libc++ libraries should be installed.")
|
||||
set(LIBCXX_INSTALL_INCLUDE_DIR "include/c++/v1" CACHE PATH
|
||||
"Path where target-agnostic libc++ headers should be installed.")
|
||||
set(LIBCXX_INSTALL_INCLUDE_TARGET_DIR "${LIBCXX_INSTALL_INCLUDE_DIR}" CACHE PATH
|
||||
"Path where target-specific libc++ headers should be installed.")
|
||||
else()
|
||||
set(LIBCXX_LIBRARY_DIR ${CMAKE_BINARY_DIR}/lib${LIBCXX_LIBDIR_SUFFIX})
|
||||
set(LIBCXX_GENERATED_INCLUDE_DIR "${CMAKE_BINARY_DIR}/include/c++/v1")
|
||||
set(LIBCXX_GENERATED_INCLUDE_TARGET_DIR "${LIBCXX_GENERATED_INCLUDE_DIR}")
|
||||
set(LIBCXX_INSTALL_LIBRARY_DIR lib${LIBCXX_LIBDIR_SUFFIX} CACHE PATH
|
||||
"Path where built libc++ libraries should be installed.")
|
||||
set(LIBCXX_INSTALL_INCLUDE_DIR "include/c++/v1" CACHE PATH
|
||||
"Path where target-agnostic libc++ headers should be installed.")
|
||||
set(LIBCXX_INSTALL_INCLUDE_TARGET_DIR "${LIBCXX_INSTALL_INCLUDE_DIR}" CACHE PATH
|
||||
"Path where target-specific libc++ headers should be installed.")
|
||||
endif()
|
||||
@ -482,9 +473,7 @@ include(HandleLibcxxFlags)
|
||||
# These flags get added to CMAKE_CXX_FLAGS and CMAKE_C_FLAGS so that
|
||||
# 'config-ix' use them during feature checks. It also adds them to both
|
||||
# 'LIBCXX_COMPILE_FLAGS' and 'LIBCXX_LINK_FLAGS'
|
||||
if(ZOS)
|
||||
add_target_flags_if_supported("-fzos-le-char-mode=ebcdic")
|
||||
endif()
|
||||
add_target_flags_if(LIBCXX_BUILD_32_BITS "-m32")
|
||||
if(LIBCXX_TARGET_TRIPLE)
|
||||
add_target_flags_if_supported("--target=${LIBCXX_TARGET_TRIPLE}")
|
||||
endif()
|
||||
@ -541,7 +530,7 @@ function(cxx_add_basic_build_flags target)
|
||||
# in the dylib. C++20 is needed to use char8_t.
|
||||
set_target_properties(${target} PROPERTIES
|
||||
CXX_STANDARD 20
|
||||
CXX_STANDARD_REQUIRED YES
|
||||
CXX_STANDARD_REQUIRED NO
|
||||
CXX_EXTENSIONS NO)
|
||||
|
||||
# When building the dylib, don't warn for unavailable aligned allocation
|
||||
@ -607,13 +596,13 @@ function(cxx_add_warning_flags target)
|
||||
endif()
|
||||
target_add_compile_flags_if_supported(${target} PRIVATE -Wextra -W -Wwrite-strings
|
||||
-Wno-unused-parameter -Wno-long-long
|
||||
-Werror=return-type -Wextra-semi -Wundef
|
||||
-Wformat-nonliteral)
|
||||
-Werror=return-type -Wextra-semi -Wundef)
|
||||
if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
|
||||
target_add_compile_flags_if_supported(${target} PRIVATE
|
||||
-Wno-user-defined-literals
|
||||
-Wno-covered-switch-default
|
||||
-Wno-suggest-override
|
||||
-Wno-ignored-attributes # FIXME: Caused by _LIBCPP_NODEBUG_TYPE not being supported on older clangs
|
||||
)
|
||||
if (LIBCXX_TARGETING_CLANG_CL)
|
||||
target_add_compile_flags_if_supported(${target} PRIVATE
|
||||
@ -776,13 +765,6 @@ function(cxx_link_system_libraries target)
|
||||
target_add_link_flags_if_supported(${target} PRIVATE "/nodefaultlib")
|
||||
endif()
|
||||
|
||||
if (LIBCXX_SUPPORTS_UNWINDLIB_NONE_FLAG AND LIBCXXABI_USE_LLVM_UNWINDER)
|
||||
# If we're linking directly against the libunwind that we're building
|
||||
# in the same invocation, don't try to link in the toolchain's
|
||||
# default libunwind (which may be missing still).
|
||||
target_add_link_flags_if_supported(${target} PRIVATE "--unwindlib=none")
|
||||
endif()
|
||||
|
||||
if (LIBCXX_HAS_SYSTEM_LIB)
|
||||
target_link_libraries(${target} PRIVATE System)
|
||||
endif()
|
||||
@ -885,8 +867,12 @@ config_define_if(LIBCXX_ABI_UNSTABLE _LIBCPP_ABI_UNSTABLE)
|
||||
config_define_if(LIBCXX_ABI_FORCE_ITANIUM _LIBCPP_ABI_FORCE_ITANIUM)
|
||||
config_define_if(LIBCXX_ABI_FORCE_MICROSOFT _LIBCPP_ABI_FORCE_MICROSOFT)
|
||||
config_define_if(LIBCXX_HIDE_FROM_ABI_PER_TU_BY_DEFAULT _LIBCPP_HIDE_FROM_ABI_PER_TU_BY_DEFAULT)
|
||||
config_define_if_not(LIBCXX_ENABLE_GLOBAL_FILESYSTEM_NAMESPACE _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE)
|
||||
config_define_if_not(LIBCXX_ENABLE_STDIN _LIBCPP_HAS_NO_STDIN)
|
||||
config_define_if_not(LIBCXX_ENABLE_STDOUT _LIBCPP_HAS_NO_STDOUT)
|
||||
config_define_if_not(LIBCXX_ENABLE_THREADS _LIBCPP_HAS_NO_THREADS)
|
||||
config_define_if_not(LIBCXX_ENABLE_MONOTONIC_CLOCK _LIBCPP_HAS_NO_MONOTONIC_CLOCK)
|
||||
config_define_if_not(LIBCXX_ENABLE_THREAD_UNSAFE_C_FUNCTIONS _LIBCPP_HAS_NO_THREAD_UNSAFE_C_FUNCTIONS)
|
||||
if (NOT LIBCXX_TYPEINFO_COMPARISON_IMPLEMENTATION STREQUAL "default")
|
||||
config_define("${LIBCXX_TYPEINFO_COMPARISON_IMPLEMENTATION}" _LIBCPP_TYPEINFO_COMPARISON_IMPLEMENTATION)
|
||||
endif()
|
||||
@ -900,8 +886,6 @@ config_define_if(LIBCXX_ENABLE_PARALLEL_ALGORITHMS _LIBCPP_HAS_PARALLEL_ALGORITH
|
||||
config_define_if_not(LIBCXX_ENABLE_FILESYSTEM _LIBCPP_HAS_NO_FILESYSTEM_LIBRARY)
|
||||
config_define_if_not(LIBCXX_ENABLE_RANDOM_DEVICE _LIBCPP_HAS_NO_RANDOM_DEVICE)
|
||||
config_define_if_not(LIBCXX_ENABLE_LOCALIZATION _LIBCPP_HAS_NO_LOCALIZATION)
|
||||
config_define_if_not(LIBCXX_ENABLE_UNICODE _LIBCPP_HAS_NO_UNICODE)
|
||||
config_define_if_not(LIBCXX_ENABLE_WIDE_CHARACTERS _LIBCPP_HAS_NO_WIDE_CHARACTERS)
|
||||
config_define_if_not(LIBCXX_ENABLE_VENDOR_AVAILABILITY_ANNOTATIONS _LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS)
|
||||
# Incomplete features get their own specific disabling flags. This makes it
|
||||
# easier to grep for target specific flags once the feature is complete.
|
||||
@ -920,17 +904,6 @@ if (LIBCXX_ABI_DEFINES)
|
||||
config_define(${abi_defines} _LIBCPP_ABI_DEFINES)
|
||||
endif()
|
||||
|
||||
if (LIBCXX_EXTRA_SITE_DEFINES)
|
||||
set(extra_site_defines)
|
||||
foreach (extra_site_define ${LIBCXX_EXTRA_SITE_DEFINES})
|
||||
# Allow defines such as DEFINE=VAL, transformed into "#define DEFINE VAL".
|
||||
string(REPLACE "=" " " extra_site_define "${extra_site_define}")
|
||||
list(APPEND extra_site_defines "#define ${extra_site_define}")
|
||||
endforeach()
|
||||
string(REPLACE ";" "\n" extra_site_defines "${extra_site_defines}")
|
||||
config_define(${extra_site_defines} _LIBCPP_EXTRA_SITE_DEFINES)
|
||||
endif()
|
||||
|
||||
# By default libc++ on Windows expects to use a shared library, which requires
|
||||
# the headers to use DLL import/export semantics. However when building a
|
||||
# static library only we modify the headers to disable DLL import/export.
|
||||
|
49
CREDITS.TXT
49
CREDITS.TXT
@ -12,13 +12,6 @@ N: Saleem Abdulrasool
|
||||
E: compnerd@compnerd.org
|
||||
D: Minor patches and Linux fixes.
|
||||
|
||||
N: Ulf Adams
|
||||
D: Invented the Ryu and Ryu Printf algorithms used in floating-point to_chars, and wrote the initial code.
|
||||
|
||||
N: Muiez Ahmed
|
||||
E: muiez@ibm.com
|
||||
D: z/OS port.
|
||||
|
||||
N: Dan Albert
|
||||
E: danalbert@google.com
|
||||
D: Android support and test runner improvements.
|
||||
@ -31,8 +24,9 @@ N: Holger Arnold
|
||||
E: holgerar@gmail.com
|
||||
D: Minor fix.
|
||||
|
||||
N: Jorg Brown
|
||||
D: Ported floating-point to_chars from MSVC to libc++.
|
||||
N: Ruben Van Boxem
|
||||
E: vanboxem dot ruben at gmail dot com
|
||||
D: Initial Windows patches.
|
||||
|
||||
N: David Chisnall
|
||||
E: theraven at theravensnest dot org
|
||||
@ -47,10 +41,6 @@ N: Jonathan B Coe
|
||||
E: jbcoe@me.com
|
||||
D: Implementation of propagate_const.
|
||||
|
||||
N: Matthew Dempsky
|
||||
E: matthew@dempsky.org
|
||||
D: Minor patches and bug fixes.
|
||||
|
||||
N: Christopher Di Bella
|
||||
E: cjdb@google.com
|
||||
E: cjdb.ns@gmail.com
|
||||
@ -68,6 +58,10 @@ N: Bill Fisher
|
||||
E: william.w.fisher@gmail.com
|
||||
D: Regex bug fixes.
|
||||
|
||||
N: Matthew Dempsky
|
||||
E: matthew@dempsky.org
|
||||
D: Minor patches and bug fixes.
|
||||
|
||||
N: Google Inc.
|
||||
D: Copyright owner and contributor of the CityHash algorithm
|
||||
|
||||
@ -87,14 +81,6 @@ N: Argyrios Kyrtzidis
|
||||
E: kyrtzidis@apple.com
|
||||
D: Bug fixes.
|
||||
|
||||
N: Stephan T. Lavavej
|
||||
E: stl@microsoft.com
|
||||
E: stl@nuwen.net
|
||||
D: Implemented floating-point to_chars.
|
||||
|
||||
N: Microsoft Corporation
|
||||
D: Contributed floating-point to_chars.
|
||||
|
||||
N: Bruce Mitchener, Jr.
|
||||
E: bruce.mitchener@gmail.com
|
||||
D: Emscripten-related changes.
|
||||
@ -127,10 +113,6 @@ N: Jon Roelofs
|
||||
E: jroelofS@jroelofs.com
|
||||
D: Remote testing, Newlib port, baremetal/single-threaded support.
|
||||
|
||||
N: Kent Ross
|
||||
E: k@mad.cash
|
||||
D: Patches for operator<=> support
|
||||
|
||||
N: Jonathan Sauer
|
||||
D: Minor patches, mostly related to constexpr
|
||||
|
||||
@ -149,10 +131,6 @@ N: Stephan Tolksdorf
|
||||
E: st@quanttec.com
|
||||
D: Minor <atomic> fix
|
||||
|
||||
N: Ruben Van Boxem
|
||||
E: vanboxem dot ruben at gmail dot com
|
||||
D: Initial Windows patches.
|
||||
|
||||
N: Michael van der Westhuizen
|
||||
E: r1mikey at gmail dot com
|
||||
|
||||
@ -163,11 +141,6 @@ N: Klaas de Vries
|
||||
E: klaas at klaasgaaf dot nl
|
||||
D: Minor bug fix.
|
||||
|
||||
N: Mark de Wever
|
||||
E: koraq at xs4all dot nl
|
||||
D: Format library support.
|
||||
D: Finalized the porting of MSVC's to_chars to libc++.
|
||||
|
||||
N: Zhang Xiongpang
|
||||
E: zhangxiongpang@gmail.com
|
||||
D: Minor patches and bug fixes.
|
||||
@ -176,11 +149,11 @@ N: Xing Xue
|
||||
E: xingxue@ca.ibm.com
|
||||
D: AIX port
|
||||
|
||||
N: Zhihao Yuan
|
||||
E: lichray@gmail.com
|
||||
D: Standard compatibility fixes.
|
||||
|
||||
N: Jeffrey Yasskin
|
||||
E: jyasskin@gmail.com
|
||||
E: jyasskin@google.com
|
||||
D: Linux fixes.
|
||||
|
||||
N: Zhihao Yuan
|
||||
E: lichray@gmail.com
|
||||
D: Standard compatibility fixes.
|
||||
|
52
TODO.TXT
52
TODO.TXT
@ -16,8 +16,60 @@ Test Suite Tasks
|
||||
* Improve the quality and portability of the locale test data.
|
||||
* Convert failure tests to use Clang Verify.
|
||||
|
||||
Filesystem Tasks
|
||||
================
|
||||
* P0492r2 - Implement National body comments for Filesystem
|
||||
* INCOMPLETE - US 25: has_filename() is equivalent to just !empty()
|
||||
* INCOMPLETE - US 31: Everything is defined in terms of one implicit host system
|
||||
* INCOMPLETE - US 32: Meaning of 27.10.2.1 unclear
|
||||
* INCOMPLETE - US 33: Definition of canonical path problematic
|
||||
* INCOMPLETE - US 34: Are there attributes of a file that are not an aspect of the file system?
|
||||
* INCOMPLETE - US 35: What synchronization is required to avoid a file system race?
|
||||
* INCOMPLETE - US 36: Symbolic links themselves are attached to a directory via (hard) links
|
||||
* INCOMPLETE - US 37: The term “redundant current directory (dot) elements” is not defined
|
||||
* INCOMPLETE - US 38: Duplicates §17.3.16
|
||||
* INCOMPLETE - US 39: Remove note: Dot and dot-dot are not directories
|
||||
* INCOMPLETE - US 40: Not all directories have a parent.
|
||||
* INCOMPLETE - US 41: The term “parent directory” for a (non-directory) file is unusual
|
||||
* INCOMPLETE - US 42: Pathname resolution does not always resolve a symlink
|
||||
* INCOMPLETE - US 43: Concerns about encoded character types
|
||||
* INCOMPLETE - US 44: Definition of path in terms of a string requires leaky abstraction
|
||||
* INCOMPLETE - US 45: Generic format portability compromised by unspecified root-name
|
||||
* INCOMPLETE - US 46: filename can be empty so productions for relative-path are redundant
|
||||
* INCOMPLETE - US 47: “.” and “..” already match the name production
|
||||
* INCOMPLETE - US 48: Multiple separators are often meaningful in a root-name
|
||||
* INCOMPLETE - US 49: What does “method of conversion method” mean?
|
||||
* INCOMPLETE - US 50: 27.10.8.1 ¶ 1.4 largely redundant with ¶ 1.3
|
||||
* INCOMPLETE - US 51: Failing to add / when appending empty string prevents useful apps
|
||||
* INCOMPLETE - US 52: remove_filename() postcondition is not by itself a definition
|
||||
* INCOMPLETE - US 53: remove_filename()'s name does not correspond to its behavior
|
||||
* INCOMPLETE - US 54: remove_filename() is broken
|
||||
* INCOMPLETE - US 55: replace_extension()'s use of path as parameter is inappropriate
|
||||
* INCOMPLETE - US 56: Remove replace_extension()'s conditional addition of period
|
||||
* INCOMPLETE - US 57: On Windows, absolute paths will sort in among relative paths
|
||||
* INCOMPLETE - US 58: parent_path() behavior for root paths is useless
|
||||
* INCOMPLETE - US 59: filename() returning path for single path components is bizarre
|
||||
* INCOMPLETE - US 60: path("/foo/").filename()==path(".") is surprising
|
||||
* INCOMPLETE - US 61: Leading dots in filename() should not begin an extension
|
||||
* INCOMPLETE - US 62: It is important that stem()+extension()==filename()
|
||||
* INCOMPLETE - US 63: lexically_normal() inconsistently treats trailing "/" but not "/.." as directory
|
||||
* INCOMPLETE - US 73, CA 2: root-name is effectively implementation defined
|
||||
* INCOMPLETE - US 74, CA 3: The term “pathname” is ambiguous in some contexts
|
||||
* INCOMPLETE - US 75, CA 4: Extra flag in path constructors is needed
|
||||
* INCOMPLETE - US 76, CA 5: root-name definition is over-specified.
|
||||
* INCOMPLETE - US 77, CA 6: operator/ and other appends not useful if arg has root-name
|
||||
* INCOMPLETE - US 78, CA 7: Member absolute() in 27.10.4.1 is overspecified for non-POSIX-like O/S
|
||||
* INCOMPLETE - US 79, CA 8: Some operation functions are overspecified for implementation-defined file types
|
||||
* INCOMPLETE - US 185: Fold error_code and non-error_code signatures into one signature
|
||||
* INCOMPLETE - FI 14: directory_entry comparisons are members
|
||||
* INCOMPLETE - Late 36: permissions() error_code overload should be noexcept
|
||||
* INCOMPLETE - Late 37: permissions() actions should be separate parameter
|
||||
* INCOMPLETE - Late 42: resize_file() Postcondition missing argument
|
||||
|
||||
Misc Tasks
|
||||
==========
|
||||
* Find all sequences of >2 underscores and eradicate them.
|
||||
* run clang-tidy on libc++
|
||||
* Document the "conditionally-supported" bits of libc++
|
||||
* Look at basic_string's move assignment operator, re LWG 2063 and POCMA
|
||||
* Put a static_assert in std::allocator to deny const/volatile types (LWG 2447)
|
||||
|
@ -1,14 +1,3 @@
|
||||
if (CMAKE_VERSION VERSION_LESS 3.17)
|
||||
message(WARNING "The libc++ benchmarks won't be available because the version of CMake is too old to support them.")
|
||||
return()
|
||||
endif()
|
||||
|
||||
if (LIBCXX_STANDALONE_BUILD)
|
||||
message(WARNING "The libc++ benchmarks are not available in a standalone build. Please migrate to an official build "
|
||||
"as documented in https://libcxx.llvm.org/BuildingLibcxx.html.")
|
||||
return()
|
||||
endif()
|
||||
|
||||
include(ExternalProject)
|
||||
include(CheckCXXCompilerFlag)
|
||||
|
||||
@ -41,7 +30,7 @@ ExternalProject_Add(google-benchmark-libcxx
|
||||
EXCLUDE_FROM_ALL ON
|
||||
DEPENDS cxx cxx-headers
|
||||
PREFIX benchmark-libcxx
|
||||
SOURCE_DIR ${LLVM_THIRD_PARTY_DIR}/benchmark
|
||||
SOURCE_DIR ${LIBCXX_SOURCE_DIR}/utils/google-benchmark
|
||||
INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/benchmark-libcxx
|
||||
CMAKE_CACHE_ARGS
|
||||
-DCMAKE_C_COMPILER:STRING=${CMAKE_C_COMPILER}
|
||||
@ -58,7 +47,7 @@ ExternalProject_Add(google-benchmark-libcxx
|
||||
set(BENCHMARK_NATIVE_TARGET_FLAGS)
|
||||
if (LIBCXX_BENCHMARK_NATIVE_GCC_TOOLCHAIN)
|
||||
set(BENCHMARK_NATIVE_TARGET_FLAGS
|
||||
--gcc-toolchain=${LIBCXX_BENCHMARK_NATIVE_GCC_TOOLCHAIN})
|
||||
-gcc-toolchain ${LIBCXX_BENCHMARK_NATIVE_GCC_TOOLCHAIN})
|
||||
endif()
|
||||
split_list(BENCHMARK_NATIVE_TARGET_FLAGS)
|
||||
|
||||
@ -66,7 +55,7 @@ if (LIBCXX_BENCHMARK_NATIVE_STDLIB)
|
||||
ExternalProject_Add(google-benchmark-native
|
||||
EXCLUDE_FROM_ALL ON
|
||||
PREFIX benchmark-native
|
||||
SOURCE_DIR ${LLVM_THIRD_PARTY_DIR}/benchmark
|
||||
SOURCE_DIR ${LIBCXX_SOURCE_DIR}/utils/google-benchmark
|
||||
INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/benchmark-native
|
||||
CMAKE_CACHE_ARGS
|
||||
-DCMAKE_C_COMPILER:STRING=${CMAKE_C_COMPILER}
|
||||
@ -86,42 +75,56 @@ set(BENCHMARK_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR})
|
||||
set(BENCHMARK_LIBCXX_INSTALL ${CMAKE_CURRENT_BINARY_DIR}/benchmark-libcxx)
|
||||
set(BENCHMARK_NATIVE_INSTALL ${CMAKE_CURRENT_BINARY_DIR}/benchmark-native)
|
||||
|
||||
add_library( cxx-benchmarks-flags INTERFACE)
|
||||
target_compile_features( cxx-benchmarks-flags INTERFACE cxx_std_20)
|
||||
target_compile_options( cxx-benchmarks-flags INTERFACE -O2 -fsized-deallocation -nostdinc++)
|
||||
target_include_directories(cxx-benchmarks-flags INTERFACE "${LIBCXX_GENERATED_INCLUDE_DIR}"
|
||||
INTERFACE "${BENCHMARK_LIBCXX_INSTALL}/include"
|
||||
INTERFACE "${LIBCXX_SOURCE_DIR}/test/support")
|
||||
|
||||
add_library( cxx-benchmarks-flags-native INTERFACE)
|
||||
target_link_libraries( cxx-benchmarks-flags-native INTERFACE cxx-benchmarks-flags)
|
||||
target_compile_options(cxx-benchmarks-flags-native INTERFACE ${BENCHMARK_NATIVE_TARGET_FLAGS})
|
||||
target_link_options( cxx-benchmarks-flags-native INTERFACE ${BENCHMARK_NATIVE_TARGET_FLAGS} "-L${BENCHMARK_NATIVE_INSTALL}/lib")
|
||||
set(BENCHMARK_TEST_COMPILE_FLAGS
|
||||
-O2
|
||||
-fsized-deallocation
|
||||
-I${BENCHMARK_LIBCXX_INSTALL}/include
|
||||
-I${LIBCXX_SOURCE_DIR}/test/support
|
||||
)
|
||||
set(BENCHMARK_TEST_LIBCXX_COMPILE_FLAGS
|
||||
${BENCHMARK_TEST_COMPILE_FLAGS}
|
||||
${SANITIZER_FLAGS}
|
||||
-Wno-user-defined-literals
|
||||
-Wno-suggest-override
|
||||
)
|
||||
|
||||
set(BENCHMARK_TEST_LIBCXX_LINK_FLAGS
|
||||
-nodefaultlibs
|
||||
-L${BENCHMARK_LIBCXX_INSTALL}/lib/
|
||||
${SANITIZER_FLAGS}
|
||||
)
|
||||
set(BENCHMARK_TEST_NATIVE_COMPILE_FLAGS
|
||||
${BENCHMARK_NATIVE_TARGET_FLAGS}
|
||||
${BENCHMARK_TEST_COMPILE_FLAGS}
|
||||
)
|
||||
set(BENCHMARK_TEST_NATIVE_LINK_FLAGS
|
||||
${BENCHMARK_NATIVE_TARGET_FLAGS}
|
||||
-L${BENCHMARK_NATIVE_INSTALL}/lib
|
||||
)
|
||||
split_list(BENCHMARK_TEST_COMPILE_FLAGS)
|
||||
split_list(BENCHMARK_TEST_LIBCXX_COMPILE_FLAGS)
|
||||
split_list(BENCHMARK_TEST_LIBCXX_LINK_FLAGS)
|
||||
split_list(BENCHMARK_TEST_NATIVE_COMPILE_FLAGS)
|
||||
split_list(BENCHMARK_TEST_NATIVE_LINK_FLAGS)
|
||||
|
||||
if (LIBCXX_BENCHMARK_NATIVE_STDLIB STREQUAL "libstdc++")
|
||||
find_library(LIBSTDCXX_FILESYSTEM_TEST stdc++fs
|
||||
PATHS ${LIBCXX_BENCHMARK_NATIVE_GCC_TOOLCHAIN}
|
||||
PATH_SUFFIXES lib lib64
|
||||
DOC "The libstdc++ filesystem library used by the benchmarks"
|
||||
)
|
||||
if (LIBSTDCXX_FILESYSTEM_TEST)
|
||||
target_link_libraries(cxx-benchmarks-flags-native INTERFACE -lstdc++fs)
|
||||
if (NOT "${LIBSTDCXX_FILESYSTEM_TEST}" STREQUAL "LIBSTDCXX_FILESYSTEM_TEST-NOTFOUND")
|
||||
set(LIBSTDCXX_FILESYSTEM_LIB "stdc++fs")
|
||||
endif()
|
||||
else()
|
||||
target_link_libraries(cxx-benchmarks-flags-native INTERFACE -lc++fs -lc++experimental)
|
||||
endif()
|
||||
|
||||
add_library( cxx-benchmarks-flags-libcxx INTERFACE)
|
||||
target_link_libraries( cxx-benchmarks-flags-libcxx INTERFACE cxx-benchmarks-flags)
|
||||
target_compile_options(cxx-benchmarks-flags-libcxx INTERFACE ${SANITIZER_FLAGS} -Wno-user-defined-literals -Wno-suggest-override)
|
||||
target_link_options( cxx-benchmarks-flags-libcxx INTERFACE -nodefaultlibs "-L${BENCHMARK_LIBCXX_INSTALL}/lib" ${SANITIZER_FLAGS})
|
||||
|
||||
set(libcxx_benchmark_targets)
|
||||
|
||||
function(add_benchmark_test name source_file)
|
||||
set(libcxx_target ${name}_libcxx)
|
||||
list(APPEND libcxx_benchmark_targets ${libcxx_target})
|
||||
add_executable(${libcxx_target} EXCLUDE_FROM_ALL ${source_file})
|
||||
target_link_libraries(${libcxx_target} PRIVATE cxx-benchmarks-flags-libcxx)
|
||||
add_dependencies(${libcxx_target} cxx google-benchmark-libcxx)
|
||||
add_dependencies(cxx-benchmarks ${libcxx_target})
|
||||
if (LIBCXX_ENABLE_SHARED)
|
||||
@ -140,15 +143,27 @@ function(add_benchmark_test name source_file)
|
||||
PROPERTIES
|
||||
OUTPUT_NAME "${name}.libcxx.out"
|
||||
RUNTIME_OUTPUT_DIRECTORY "${BENCHMARK_OUTPUT_DIR}"
|
||||
COMPILE_FLAGS "${BENCHMARK_TEST_LIBCXX_COMPILE_FLAGS}"
|
||||
LINK_FLAGS "${BENCHMARK_TEST_LIBCXX_LINK_FLAGS}"
|
||||
CXX_STANDARD 17
|
||||
CXX_STANDARD_REQUIRED YES
|
||||
CXX_EXTENSIONS NO)
|
||||
cxx_link_system_libraries(${libcxx_target})
|
||||
if (LIBCXX_BENCHMARK_NATIVE_STDLIB)
|
||||
if (LIBCXX_BENCHMARK_NATIVE_STDLIB STREQUAL "libstdc++" AND NOT DEFINED LIBSTDCXX_FILESYSTEM_LIB
|
||||
AND "${name}" STREQUAL "filesystem")
|
||||
return()
|
||||
endif()
|
||||
set(native_target ${name}_native)
|
||||
add_executable(${native_target} EXCLUDE_FROM_ALL ${source_file})
|
||||
target_link_libraries(${native_target} PRIVATE cxx-benchmarks-flags-native)
|
||||
add_dependencies(${native_target} google-benchmark-native
|
||||
google-benchmark-libcxx)
|
||||
target_link_libraries(${native_target} PRIVATE -lbenchmark)
|
||||
if (LIBCXX_BENCHMARK_NATIVE_STDLIB STREQUAL "libstdc++")
|
||||
target_link_libraries(${native_target} PRIVATE ${LIBSTDCXX_FILESYSTEM_LIB})
|
||||
elseif (LIBCXX_BENCHMARK_NATIVE_STDLIB STREQUAL "libc++")
|
||||
target_link_libraries(${native_target} PRIVATE -lc++fs -lc++experimental)
|
||||
endif()
|
||||
if (LIBCXX_HAS_PTHREAD_LIB)
|
||||
target_link_libraries(${native_target} PRIVATE -pthread)
|
||||
endif()
|
||||
@ -157,6 +172,11 @@ function(add_benchmark_test name source_file)
|
||||
PROPERTIES
|
||||
OUTPUT_NAME "${name}.native.out"
|
||||
RUNTIME_OUTPUT_DIRECTORY "${BENCHMARK_OUTPUT_DIR}"
|
||||
INCLUDE_DIRECTORIES ""
|
||||
COMPILE_FLAGS "${BENCHMARK_TEST_NATIVE_COMPILE_FLAGS}"
|
||||
LINK_FLAGS "${BENCHMARK_TEST_NATIVE_LINK_FLAGS}"
|
||||
CXX_STANDARD 17
|
||||
CXX_STANDARD_REQUIRED YES
|
||||
CXX_EXTENSIONS NO)
|
||||
endif()
|
||||
endfunction()
|
||||
@ -166,11 +186,6 @@ endfunction()
|
||||
# Register Benchmark tests
|
||||
#==============================================================================
|
||||
file(GLOB BENCHMARK_TESTS "*.bench.cpp")
|
||||
|
||||
if (NOT LIBCXX_ENABLE_INCOMPLETE_FEATURES)
|
||||
list(FILTER BENCHMARK_TESTS EXCLUDE REGEX "(format_to_n|format_to|format|formatted_size|formatter_float|std_format_spec_string_unicode).bench.cpp")
|
||||
endif()
|
||||
|
||||
foreach(test_path ${BENCHMARK_TESTS})
|
||||
get_filename_component(test_file "${test_path}" NAME)
|
||||
string(REPLACE ".bench.cpp" "" test_name "${test_file}")
|
||||
|
@ -36,9 +36,10 @@ inline char getRandomChar() {
|
||||
}
|
||||
|
||||
template <class IntT>
|
||||
inline IntT getRandomInteger(IntT Min, IntT Max) {
|
||||
std::uniform_int_distribution<unsigned long long> dist(Min, Max);
|
||||
return static_cast<IntT>(dist(getRandomEngine()));
|
||||
inline IntT getRandomInteger(IntT Min = 0,
|
||||
IntT Max = std::numeric_limits<IntT>::max()) {
|
||||
std::uniform_int_distribution<IntT> dist(Min, Max);
|
||||
return dist(getRandomEngine());
|
||||
}
|
||||
|
||||
inline std::string getRandomString(std::size_t Len) {
|
||||
@ -101,7 +102,7 @@ template <class IntT>
|
||||
std::vector<IntT> getRandomIntegerInputs(size_t N) {
|
||||
std::vector<IntT> inputs;
|
||||
for (size_t i=0; i < N; ++i) {
|
||||
inputs.push_back(getRandomInteger<IntT>(0, std::numeric_limits<IntT>::max()));
|
||||
inputs.push_back(getRandomInteger<IntT>());
|
||||
}
|
||||
return inputs;
|
||||
}
|
||||
|
@ -38,65 +38,18 @@ enum class Order {
|
||||
Descending,
|
||||
SingleElement,
|
||||
PipeOrgan,
|
||||
Heap,
|
||||
QuickSortAdversary,
|
||||
Heap
|
||||
};
|
||||
struct AllOrders : EnumValuesAsTuple<AllOrders, Order, 7> {
|
||||
struct AllOrders : EnumValuesAsTuple<AllOrders, Order, 6> {
|
||||
static constexpr const char* Names[] = {"Random", "Ascending",
|
||||
"Descending", "SingleElement",
|
||||
"PipeOrgan", "Heap",
|
||||
"QuickSortAdversary"};
|
||||
"PipeOrgan", "Heap"};
|
||||
};
|
||||
|
||||
// fillAdversarialQuickSortInput fills the input vector with N int-like values.
|
||||
// These values are arranged in such a way that they would invoke O(N^2)
|
||||
// behavior on any quick sort implementation that satisifies certain conditions.
|
||||
// Details are available in the following paper:
|
||||
// "A Killer Adversary for Quicksort", M. D. McIlroy, Software—Practice &
|
||||
// ExperienceVolume 29 Issue 4 April 10, 1999 pp 341–344.
|
||||
// https://dl.acm.org/doi/10.5555/311868.311871.
|
||||
template <class T>
|
||||
void fillAdversarialQuickSortInput(T& V, size_t N) {
|
||||
assert(N > 0);
|
||||
// If an element is equal to gas, it indicates that the value of the element
|
||||
// is still to be decided and may change over the course of time.
|
||||
const int gas = N - 1;
|
||||
V.resize(N);
|
||||
for (int i = 0; i < N; ++i) {
|
||||
V[i] = gas;
|
||||
}
|
||||
// Candidate for the pivot position.
|
||||
int candidate = 0;
|
||||
int nsolid = 0;
|
||||
// Populate all positions in the generated input to gas.
|
||||
std::vector<int> ascVals(V.size());
|
||||
// Fill up with ascending values from 0 to V.size()-1. These will act as
|
||||
// indices into V.
|
||||
std::iota(ascVals.begin(), ascVals.end(), 0);
|
||||
std::sort(ascVals.begin(), ascVals.end(), [&](int x, int y) {
|
||||
if (V[x] == gas && V[y] == gas) {
|
||||
// We are comparing two inputs whose value is still to be decided.
|
||||
if (x == candidate) {
|
||||
V[x] = nsolid++;
|
||||
} else {
|
||||
V[y] = nsolid++;
|
||||
}
|
||||
}
|
||||
if (V[x] == gas) {
|
||||
candidate = x;
|
||||
} else if (V[y] == gas) {
|
||||
candidate = y;
|
||||
}
|
||||
return V[x] < V[y];
|
||||
});
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
void fillValues(std::vector<T>& V, size_t N, Order O) {
|
||||
if (O == Order::SingleElement) {
|
||||
V.resize(N, 0);
|
||||
} else if (O == Order::QuickSortAdversary) {
|
||||
fillAdversarialQuickSortInput(V, N);
|
||||
} else {
|
||||
while (V.size() < N)
|
||||
V.push_back(V.size());
|
||||
@ -175,9 +128,6 @@ void sortValues(T& V, Order O) {
|
||||
case Order::Heap:
|
||||
std::make_heap(V.begin(), V.end());
|
||||
break;
|
||||
case Order::QuickSortAdversary:
|
||||
// Nothing to do
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -30,7 +30,7 @@ struct TestIntBase {
|
||||
static std::vector<IntT> generateInput(size_t size) {
|
||||
std::vector<IntT> Res(size);
|
||||
std::generate(Res.begin(), Res.end(),
|
||||
[] { return getRandomInteger<IntT>(0, std::numeric_limits<IntT>::max()); });
|
||||
[] { return getRandomInteger<IntT>(); });
|
||||
return Res;
|
||||
}
|
||||
};
|
||||
|
@ -97,6 +97,7 @@ static void BM_DeallocateOnly(benchmark::State& st) {
|
||||
const size_t alloc_size = st.range(0);
|
||||
const auto NumAllocs = st.max_iterations;
|
||||
|
||||
using PtrT = void*;
|
||||
std::vector<void*> Pointers(NumAllocs);
|
||||
for (auto& p : Pointers) {
|
||||
p = AllocWrapper::Allocate(alloc_size);
|
||||
|
@ -1,3 +1,4 @@
|
||||
// -*- C++ -*-
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
|
@ -83,7 +83,7 @@ void BM_PathIterateMultipleTimes(benchmark::State &st, GenInputs gen) {
|
||||
PP /= Part;
|
||||
benchmark::DoNotOptimize(PP.native().data());
|
||||
while (st.KeepRunning()) {
|
||||
for (auto const& E : PP) {
|
||||
for (auto &E : PP) {
|
||||
benchmark::DoNotOptimize(E.native().data());
|
||||
}
|
||||
benchmark::ClobberMemory();
|
||||
@ -104,7 +104,7 @@ void BM_PathIterateOnce(benchmark::State &st, GenInputs gen) {
|
||||
benchmark::DoNotOptimize(PP.native().data());
|
||||
while (st.KeepRunning()) {
|
||||
const path P = PP.native();
|
||||
for (auto const& E : P) {
|
||||
for (auto &E : P) {
|
||||
benchmark::DoNotOptimize(E.native().data());
|
||||
}
|
||||
benchmark::ClobberMemory();
|
||||
|
@ -1,36 +0,0 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
// 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
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include <format>
|
||||
|
||||
#include <string>
|
||||
|
||||
#include "benchmark/benchmark.h"
|
||||
#include "make_string.h"
|
||||
|
||||
#define CSTR(S) MAKE_CSTRING(CharT, S)
|
||||
|
||||
template <class CharT>
|
||||
static void BM_format_string(benchmark::State& state) {
|
||||
size_t size = state.range(0);
|
||||
std::basic_string<CharT> str(size, CharT('*'));
|
||||
|
||||
while (state.KeepRunningBatch(str.size()))
|
||||
benchmark::DoNotOptimize(std::format(CSTR("{}"), str));
|
||||
|
||||
state.SetBytesProcessed(state.iterations() * size * sizeof(CharT));
|
||||
}
|
||||
BENCHMARK_TEMPLATE(BM_format_string, char)->RangeMultiplier(2)->Range(1, 1 << 20);
|
||||
BENCHMARK_TEMPLATE(BM_format_string, wchar_t)->RangeMultiplier(2)->Range(1, 1 << 20);
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
benchmark::Initialize(&argc, argv);
|
||||
if (benchmark::ReportUnrecognizedArguments(argc, argv))
|
||||
return 1;
|
||||
|
||||
benchmark::RunSpecifiedBenchmarks();
|
||||
}
|
@ -1,107 +0,0 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
// 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
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include <format>
|
||||
|
||||
#include <iterator>
|
||||
#include <algorithm>
|
||||
#include <array>
|
||||
#include <list>
|
||||
#include <span>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "benchmark/benchmark.h"
|
||||
#include "make_string.h"
|
||||
|
||||
#define CSTR(S) MAKE_CSTRING(CharT, S)
|
||||
|
||||
/*** Back inserter ***/
|
||||
|
||||
template <class Container>
|
||||
static void BM_format_to_string_back_inserter(benchmark::State& state) {
|
||||
using CharT = typename Container::value_type;
|
||||
size_t size = state.range(0);
|
||||
auto str = std::basic_string<CharT>(size, CharT('*'));
|
||||
|
||||
for (auto _ : state) {
|
||||
Container output;
|
||||
benchmark::DoNotOptimize(std::format_to(std::back_inserter(output), CSTR("{}"), str));
|
||||
}
|
||||
state.SetBytesProcessed(state.iterations() * size * sizeof(CharT));
|
||||
}
|
||||
|
||||
/*** Begin ***/
|
||||
|
||||
template <class Container>
|
||||
static void BM_format_to_string_begin(benchmark::State& state) {
|
||||
using CharT = typename Container::value_type;
|
||||
size_t size = state.range(0);
|
||||
auto str = std::basic_string<CharT>(size, CharT('*'));
|
||||
|
||||
Container output(size, CharT('-'));
|
||||
for (auto _ : state)
|
||||
benchmark::DoNotOptimize(std::format_to(std::begin(output), CSTR("{}"), str));
|
||||
|
||||
state.SetBytesProcessed(state.iterations() * size * sizeof(CharT));
|
||||
}
|
||||
|
||||
/*** Pointer ***/
|
||||
|
||||
template <class CharT>
|
||||
static void BM_format_to_string_span(benchmark::State& state) {
|
||||
size_t size = state.range(0);
|
||||
auto str = std::basic_string<CharT>(size, CharT('*'));
|
||||
|
||||
auto buffer = std::basic_string<CharT>(size, CharT('-'));
|
||||
std::span<CharT> output{buffer};
|
||||
for (auto _ : state)
|
||||
benchmark::DoNotOptimize(std::format_to(std::begin(output), CSTR("{}"), str));
|
||||
|
||||
state.SetBytesProcessed(state.iterations() * size * sizeof(CharT));
|
||||
}
|
||||
|
||||
template <class CharT>
|
||||
static void BM_format_to_string_pointer(benchmark::State& state) {
|
||||
size_t size = state.range(0);
|
||||
auto str = std::basic_string<CharT>(size, CharT('*'));
|
||||
|
||||
auto buffer = std::basic_string<CharT>(size, CharT('-'));
|
||||
CharT* output = buffer.data();
|
||||
for (auto _ : state)
|
||||
benchmark::DoNotOptimize(std::format_to(output, CSTR("{}"), str));
|
||||
|
||||
state.SetBytesProcessed(state.iterations() * size * sizeof(CharT));
|
||||
}
|
||||
|
||||
/*** Main ***/
|
||||
|
||||
BENCHMARK_TEMPLATE(BM_format_to_string_back_inserter, std::string)->RangeMultiplier(2)->Range(1, 1 << 20);
|
||||
BENCHMARK_TEMPLATE(BM_format_to_string_back_inserter, std::vector<char>)->RangeMultiplier(2)->Range(1, 1 << 20);
|
||||
BENCHMARK_TEMPLATE(BM_format_to_string_back_inserter, std::list<char>)->RangeMultiplier(2)->Range(1, 1 << 20);
|
||||
BENCHMARK_TEMPLATE(BM_format_to_string_begin, std::string)->RangeMultiplier(2)->Range(1, 1 << 20);
|
||||
BENCHMARK_TEMPLATE(BM_format_to_string_begin, std::vector<char>)->RangeMultiplier(2)->Range(1, 1 << 20);
|
||||
BENCHMARK_TEMPLATE(BM_format_to_string_begin, std::list<char>)->RangeMultiplier(2)->Range(1, 1 << 20);
|
||||
BENCHMARK_TEMPLATE(BM_format_to_string_span, char)->RangeMultiplier(2)->Range(1, 1 << 20);
|
||||
BENCHMARK_TEMPLATE(BM_format_to_string_pointer, char)->RangeMultiplier(2)->Range(1, 1 << 20);
|
||||
|
||||
BENCHMARK_TEMPLATE(BM_format_to_string_back_inserter, std::wstring)->RangeMultiplier(2)->Range(1, 1 << 20);
|
||||
BENCHMARK_TEMPLATE(BM_format_to_string_back_inserter, std::vector<wchar_t>)->RangeMultiplier(2)->Range(1, 1 << 20);
|
||||
BENCHMARK_TEMPLATE(BM_format_to_string_back_inserter, std::list<wchar_t>)->RangeMultiplier(2)->Range(1, 1 << 20);
|
||||
BENCHMARK_TEMPLATE(BM_format_to_string_begin, std::wstring)->RangeMultiplier(2)->Range(1, 1 << 20);
|
||||
BENCHMARK_TEMPLATE(BM_format_to_string_begin, std::vector<wchar_t>)->RangeMultiplier(2)->Range(1, 1 << 20);
|
||||
BENCHMARK_TEMPLATE(BM_format_to_string_begin, std::list<wchar_t>)->RangeMultiplier(2)->Range(1, 1 << 20);
|
||||
BENCHMARK_TEMPLATE(BM_format_to_string_span, wchar_t)->RangeMultiplier(2)->Range(1, 1 << 20);
|
||||
BENCHMARK_TEMPLATE(BM_format_to_string_pointer, wchar_t)->RangeMultiplier(2)->Range(1, 1 << 20);
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
benchmark::Initialize(&argc, argv);
|
||||
if (benchmark::ReportUnrecognizedArguments(argc, argv))
|
||||
return 1;
|
||||
|
||||
benchmark::RunSpecifiedBenchmarks();
|
||||
}
|
@ -1,107 +0,0 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
// 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
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include <format>
|
||||
|
||||
#include <iterator>
|
||||
#include <algorithm>
|
||||
#include <array>
|
||||
#include <list>
|
||||
#include <span>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "benchmark/benchmark.h"
|
||||
#include "make_string.h"
|
||||
|
||||
#define CSTR(S) MAKE_CSTRING(CharT, S)
|
||||
|
||||
/*** Back inserter ***/
|
||||
|
||||
template <class Container>
|
||||
static void BM_format_to_n_string_back_inserter(benchmark::State& state) {
|
||||
using CharT = typename Container::value_type;
|
||||
size_t size = state.range(0);
|
||||
auto str = std::basic_string<CharT>(2 * size, CharT('*'));
|
||||
|
||||
for (auto _ : state) {
|
||||
Container output;
|
||||
benchmark::DoNotOptimize(std::format_to_n(std::back_inserter(output), size, CSTR("{}"), str));
|
||||
}
|
||||
state.SetBytesProcessed(state.iterations() * size * sizeof(CharT));
|
||||
}
|
||||
|
||||
/*** Begin ***/
|
||||
|
||||
template <class Container>
|
||||
static void BM_format_to_n_string_begin(benchmark::State& state) {
|
||||
using CharT = typename Container::value_type;
|
||||
size_t size = state.range(0);
|
||||
auto str = std::basic_string<CharT>(2 * size, CharT('*'));
|
||||
|
||||
Container output(size, CharT('-'));
|
||||
for (auto _ : state)
|
||||
benchmark::DoNotOptimize(std::format_to_n(std::begin(output), size, CSTR("{}"), str));
|
||||
|
||||
state.SetBytesProcessed(state.iterations() * size * sizeof(CharT));
|
||||
}
|
||||
|
||||
/*** Pointer ***/
|
||||
|
||||
template <class CharT>
|
||||
static void BM_format_to_n_string_span(benchmark::State& state) {
|
||||
size_t size = state.range(0);
|
||||
auto str = std::basic_string<CharT>(2 * size, CharT('*'));
|
||||
|
||||
auto buffer = std::basic_string<CharT>(size, CharT('-'));
|
||||
std::span<CharT> output{buffer};
|
||||
for (auto _ : state)
|
||||
benchmark::DoNotOptimize(std::format_to_n(std::begin(output), size, CSTR("{}"), str));
|
||||
|
||||
state.SetBytesProcessed(state.iterations() * size * sizeof(CharT));
|
||||
}
|
||||
|
||||
template <class CharT>
|
||||
static void BM_format_to_n_string_pointer(benchmark::State& state) {
|
||||
size_t size = state.range(0);
|
||||
auto str = std::basic_string<CharT>(2 * size, CharT('*'));
|
||||
|
||||
auto buffer = std::basic_string<CharT>(size, CharT('-'));
|
||||
CharT* output = buffer.data();
|
||||
for (auto _ : state)
|
||||
benchmark::DoNotOptimize(std::format_to_n(output, size, CSTR("{}"), str));
|
||||
|
||||
state.SetBytesProcessed(state.iterations() * size * sizeof(CharT));
|
||||
}
|
||||
|
||||
/*** Main ***/
|
||||
|
||||
BENCHMARK_TEMPLATE(BM_format_to_n_string_back_inserter, std::string)->RangeMultiplier(2)->Range(1, 1 << 20);
|
||||
BENCHMARK_TEMPLATE(BM_format_to_n_string_back_inserter, std::vector<char>)->RangeMultiplier(2)->Range(1, 1 << 20);
|
||||
BENCHMARK_TEMPLATE(BM_format_to_n_string_back_inserter, std::list<char>)->RangeMultiplier(2)->Range(1, 1 << 20);
|
||||
BENCHMARK_TEMPLATE(BM_format_to_n_string_begin, std::string)->RangeMultiplier(2)->Range(1, 1 << 20);
|
||||
BENCHMARK_TEMPLATE(BM_format_to_n_string_begin, std::vector<char>)->RangeMultiplier(2)->Range(1, 1 << 20);
|
||||
BENCHMARK_TEMPLATE(BM_format_to_n_string_begin, std::list<char>)->RangeMultiplier(2)->Range(1, 1 << 20);
|
||||
BENCHMARK_TEMPLATE(BM_format_to_n_string_span, char)->RangeMultiplier(2)->Range(1, 1 << 20);
|
||||
BENCHMARK_TEMPLATE(BM_format_to_n_string_pointer, char)->RangeMultiplier(2)->Range(1, 1 << 20);
|
||||
|
||||
BENCHMARK_TEMPLATE(BM_format_to_n_string_back_inserter, std::wstring)->RangeMultiplier(2)->Range(1, 1 << 20);
|
||||
BENCHMARK_TEMPLATE(BM_format_to_n_string_back_inserter, std::vector<wchar_t>)->RangeMultiplier(2)->Range(1, 1 << 20);
|
||||
BENCHMARK_TEMPLATE(BM_format_to_n_string_back_inserter, std::list<wchar_t>)->RangeMultiplier(2)->Range(1, 1 << 20);
|
||||
BENCHMARK_TEMPLATE(BM_format_to_n_string_begin, std::wstring)->RangeMultiplier(2)->Range(1, 1 << 20);
|
||||
BENCHMARK_TEMPLATE(BM_format_to_n_string_begin, std::vector<wchar_t>)->RangeMultiplier(2)->Range(1, 1 << 20);
|
||||
BENCHMARK_TEMPLATE(BM_format_to_n_string_begin, std::list<wchar_t>)->RangeMultiplier(2)->Range(1, 1 << 20);
|
||||
BENCHMARK_TEMPLATE(BM_format_to_n_string_span, wchar_t)->RangeMultiplier(2)->Range(1, 1 << 20);
|
||||
BENCHMARK_TEMPLATE(BM_format_to_n_string_pointer, wchar_t)->RangeMultiplier(2)->Range(1, 1 << 20);
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
benchmark::Initialize(&argc, argv);
|
||||
if (benchmark::ReportUnrecognizedArguments(argc, argv))
|
||||
return 1;
|
||||
|
||||
benchmark::RunSpecifiedBenchmarks();
|
||||
}
|
@ -1,36 +0,0 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
// 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
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include <format>
|
||||
|
||||
#include <string>
|
||||
|
||||
#include "benchmark/benchmark.h"
|
||||
#include "make_string.h"
|
||||
|
||||
#define CSTR(S) MAKE_CSTRING(CharT, S)
|
||||
|
||||
template <class CharT>
|
||||
static void BM_formatted_size_string(benchmark::State& state) {
|
||||
size_t size = state.range(0);
|
||||
std::basic_string<CharT> str(size, CharT('*'));
|
||||
|
||||
while (state.KeepRunningBatch(str.size()))
|
||||
benchmark::DoNotOptimize(std::formatted_size(CSTR("{}"), str));
|
||||
|
||||
state.SetBytesProcessed(state.iterations() * size * sizeof(CharT));
|
||||
}
|
||||
BENCHMARK_TEMPLATE(BM_formatted_size_string, char)->RangeMultiplier(2)->Range(1, 1 << 20);
|
||||
BENCHMARK_TEMPLATE(BM_formatted_size_string, wchar_t)->RangeMultiplier(2)->Range(1, 1 << 20);
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
benchmark::Initialize(&argc, argv);
|
||||
if (benchmark::ReportUnrecognizedArguments(argc, argv))
|
||||
return 1;
|
||||
|
||||
benchmark::RunSpecifiedBenchmarks();
|
||||
}
|
@ -1,241 +0,0 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
// 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
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include <format>
|
||||
|
||||
#include <array>
|
||||
#include <limits>
|
||||
#include <random>
|
||||
#include <string>
|
||||
|
||||
#include "CartesianBenchmarks.h"
|
||||
#include "benchmark/benchmark.h"
|
||||
|
||||
// *** Localization ***
|
||||
enum class LocalizationE { False, True };
|
||||
struct AllLocalizations : EnumValuesAsTuple<AllLocalizations, LocalizationE, 2> {
|
||||
static constexpr const char* Names[] = {"LocFalse", "LocTrue"};
|
||||
};
|
||||
|
||||
template <LocalizationE E>
|
||||
struct Localization {};
|
||||
|
||||
template <>
|
||||
struct Localization<LocalizationE::False> {
|
||||
static constexpr const char* fmt = "";
|
||||
};
|
||||
|
||||
template <>
|
||||
struct Localization<LocalizationE::True> {
|
||||
static constexpr const char* fmt = "L";
|
||||
};
|
||||
|
||||
// *** Types ***
|
||||
enum class TypeE { Float, Double, LongDouble };
|
||||
// TODO FMT Set to 3 after to_chars has long double suport.
|
||||
struct AllTypes : EnumValuesAsTuple<AllTypes, TypeE, 2> {
|
||||
static constexpr const char* Names[] = {"Float", "Double", "LongDouble"};
|
||||
};
|
||||
|
||||
template <TypeE E>
|
||||
struct Type {};
|
||||
|
||||
template <>
|
||||
struct Type<TypeE::Float> {
|
||||
using type = float;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct Type<TypeE::Double> {
|
||||
using type = double;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct Type<TypeE::LongDouble> {
|
||||
using type = long double;
|
||||
};
|
||||
|
||||
// *** Values ***
|
||||
enum class ValueE { Inf, Random };
|
||||
struct AllValues : EnumValuesAsTuple<AllValues, ValueE, 2> {
|
||||
static constexpr const char* Names[] = {"Inf", "Random"};
|
||||
};
|
||||
|
||||
template <ValueE E>
|
||||
struct Value {};
|
||||
|
||||
template <>
|
||||
struct Value<ValueE::Inf> {
|
||||
template <class F>
|
||||
static std::array<F, 1000> make_data() {
|
||||
std::array<F, 1000> result;
|
||||
std::fill(result.begin(), result.end(), -std::numeric_limits<F>::infinity());
|
||||
return result;
|
||||
}
|
||||
};
|
||||
|
||||
template <>
|
||||
struct Value<ValueE::Random> {
|
||||
template <class F>
|
||||
static std::array<F, 1000> make_data() {
|
||||
std::random_device seed;
|
||||
std::mt19937 generator(seed());
|
||||
std::uniform_int_distribution<std::conditional_t<sizeof(F) == sizeof(uint32_t), uint32_t, uint64_t>> distribution;
|
||||
|
||||
std::array<F, 1000> result;
|
||||
std::generate(result.begin(), result.end(), [&] {
|
||||
while (true) {
|
||||
auto result = std::bit_cast<F>(distribution(generator));
|
||||
if (std::isfinite(result))
|
||||
return result;
|
||||
}
|
||||
});
|
||||
return result;
|
||||
}
|
||||
};
|
||||
|
||||
// *** Display Type ***
|
||||
enum class DisplayTypeE {
|
||||
Default,
|
||||
Hex,
|
||||
Scientific,
|
||||
Fixed,
|
||||
General,
|
||||
};
|
||||
struct AllDisplayTypes : EnumValuesAsTuple<AllDisplayTypes, DisplayTypeE, 5> {
|
||||
static constexpr const char* Names[] = {"DisplayDefault", "DisplayHex", "DisplayScientific", "DisplayFixed",
|
||||
"DisplayGeneral"};
|
||||
};
|
||||
|
||||
template <DisplayTypeE E>
|
||||
struct DisplayType {};
|
||||
|
||||
template <>
|
||||
struct DisplayType<DisplayTypeE::Default> {
|
||||
static constexpr const char* fmt = "";
|
||||
};
|
||||
|
||||
template <>
|
||||
struct DisplayType<DisplayTypeE::Hex> {
|
||||
static constexpr const char* fmt = "a";
|
||||
};
|
||||
|
||||
template <>
|
||||
struct DisplayType<DisplayTypeE::Scientific> {
|
||||
static constexpr const char* fmt = "e";
|
||||
};
|
||||
|
||||
template <>
|
||||
struct DisplayType<DisplayTypeE::Fixed> {
|
||||
static constexpr const char* fmt = "f";
|
||||
};
|
||||
|
||||
template <>
|
||||
struct DisplayType<DisplayTypeE::General> {
|
||||
static constexpr const char* fmt = "g";
|
||||
};
|
||||
|
||||
// *** Alignment ***
|
||||
enum class AlignmentE { None, Left, Center, Right, ZeroPadding };
|
||||
struct AllAlignments : EnumValuesAsTuple<AllAlignments, AlignmentE, 5> {
|
||||
static constexpr const char* Names[] = {"AlignNone", "AlignmentLeft", "AlignmentCenter", "AlignmentRight",
|
||||
"ZeroPadding"};
|
||||
};
|
||||
|
||||
template <AlignmentE E>
|
||||
struct Alignment {};
|
||||
|
||||
template <>
|
||||
struct Alignment<AlignmentE::None> {
|
||||
static constexpr const char* fmt = "";
|
||||
};
|
||||
|
||||
template <>
|
||||
struct Alignment<AlignmentE::Left> {
|
||||
// Width > PrecisionE::Huge
|
||||
static constexpr const char* fmt = "0<17500";
|
||||
};
|
||||
|
||||
template <>
|
||||
struct Alignment<AlignmentE::Center> {
|
||||
// Width > PrecisionE::Huge
|
||||
static constexpr const char* fmt = "0^17500";
|
||||
};
|
||||
|
||||
template <>
|
||||
struct Alignment<AlignmentE::Right> {
|
||||
// Width > PrecisionE::Huge
|
||||
static constexpr const char* fmt = "0>17500";
|
||||
};
|
||||
|
||||
template <>
|
||||
struct Alignment<AlignmentE::ZeroPadding> {
|
||||
// Width > PrecisionE::Huge
|
||||
static constexpr const char* fmt = "017500";
|
||||
};
|
||||
|
||||
enum class PrecisionE { None, Zero, Small, Huge };
|
||||
struct AllPrecisions : EnumValuesAsTuple<AllPrecisions, PrecisionE, 4> {
|
||||
static constexpr const char* Names[] = {"PrecNone", "PrecZero", "PrecSmall", "PrecHuge"};
|
||||
};
|
||||
|
||||
template <PrecisionE E>
|
||||
struct Precision {};
|
||||
|
||||
template <>
|
||||
struct Precision<PrecisionE::None> {
|
||||
static constexpr const char* fmt = "";
|
||||
};
|
||||
|
||||
template <>
|
||||
struct Precision<PrecisionE::Zero> {
|
||||
static constexpr const char* fmt = ".0";
|
||||
};
|
||||
|
||||
template <>
|
||||
struct Precision<PrecisionE::Small> {
|
||||
static constexpr const char* fmt = ".10";
|
||||
};
|
||||
|
||||
template <>
|
||||
struct Precision<PrecisionE::Huge> {
|
||||
// The maximum precision for a minimal sub normal long double is ±0x1p-16494.
|
||||
// This value is always larger than that value forcing the trailing zero path
|
||||
// to be executed.
|
||||
static constexpr const char* fmt = ".17000";
|
||||
};
|
||||
|
||||
template <class L, class DT, class T, class V, class A, class P>
|
||||
struct FloatingPoint {
|
||||
using F = typename Type<T::value>::type;
|
||||
|
||||
void run(benchmark::State& state) const {
|
||||
std::array<F, 1000> data{Value<V::value>::template make_data<F>()};
|
||||
std::array<char, 20'000> output;
|
||||
std::string fmt{std::string("{:") + Alignment<A::value>::fmt + Precision<P::value>::fmt +
|
||||
Localization<L::value>::fmt + DisplayType<DT::value>::fmt + "}"};
|
||||
|
||||
while (state.KeepRunningBatch(1000))
|
||||
for (F value : data)
|
||||
benchmark::DoNotOptimize(std::format_to(output.begin(), fmt, value));
|
||||
}
|
||||
|
||||
std::string name() const {
|
||||
return "FloatingPoint" + L::name() + DT::name() + T::name() + V::name() + A::name() + P::name();
|
||||
}
|
||||
};
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
benchmark::Initialize(&argc, argv);
|
||||
if (benchmark::ReportUnrecognizedArguments(argc, argv))
|
||||
return 1;
|
||||
|
||||
makeCartesianProductBenchmark<FloatingPoint, AllLocalizations, AllDisplayTypes, AllTypes, AllValues, AllAlignments,
|
||||
AllPrecisions>();
|
||||
|
||||
benchmark::RunSpecifiedBenchmarks();
|
||||
}
|
@ -1,196 +0,0 @@
|
||||
// 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_HAS_NO_UNICODE
|
||||
|
||||
#include <array>
|
||||
#include <format>
|
||||
|
||||
#include "benchmark/benchmark.h"
|
||||
|
||||
#include "test_macros.h"
|
||||
|
||||
template <class CharT, size_t N>
|
||||
class tester {
|
||||
static constexpr size_t size_ = N - 1;
|
||||
std::array<CharT, 100 * size_> data_;
|
||||
|
||||
public:
|
||||
explicit constexpr tester(const CharT (&input)[N]) {
|
||||
auto it = data_.begin();
|
||||
for (int i = 0; i < 100; ++i)
|
||||
it = std::copy_n(input, size_, it);
|
||||
}
|
||||
|
||||
constexpr size_t size() const noexcept { return data_.size(); }
|
||||
constexpr const CharT* begin() const noexcept { return data_.begin(); }
|
||||
constexpr const CharT* end() const noexcept { return data_.end(); }
|
||||
|
||||
void test(benchmark::State& state) const {
|
||||
for (auto _ : state)
|
||||
benchmark::DoNotOptimize(std::__format_spec::__get_string_alignment(
|
||||
begin(), end(), 1'000'000, 1'000'000));
|
||||
state.SetItemsProcessed(state.iterations() * size());
|
||||
}
|
||||
};
|
||||
|
||||
#define TEST(u8) \
|
||||
if constexpr (std::same_as<CharT, char>) { \
|
||||
constexpr auto p = tester{u8}; \
|
||||
p.test(state); \
|
||||
} else if constexpr (std::same_as<CharT, char16_t>) { \
|
||||
constexpr auto p = tester{TEST_CONCAT(u, u8)}; \
|
||||
p.test(state); \
|
||||
} else { \
|
||||
constexpr auto p = tester{TEST_CONCAT(U, u8)}; \
|
||||
p.test(state); \
|
||||
}
|
||||
|
||||
template <class CharT>
|
||||
static void BM_EstimateLengthNoMultiByte(benchmark::State& state) {
|
||||
TEST("The quick brown fox jumps over the lazy dog");
|
||||
}
|
||||
|
||||
template <class CharT>
|
||||
static void BM_EstimateLengthTwoByteDE(benchmark::State& state) {
|
||||
static_assert(sizeof("Victor jagt zwölf Boxkämpfer quer über den großen Sylter Deich") == 67);
|
||||
|
||||
// https://en.wikipedia.org/wiki/Pangram
|
||||
TEST("Victor jagt zwölf Boxkämpfer quer über den großen Sylter Deich");
|
||||
}
|
||||
|
||||
template <class CharT>
|
||||
static void BM_EstimateLengthTwoBytePL(benchmark::State& state) {
|
||||
static_assert(sizeof("Stróż pchnął kość w quiz gędźb vel fax myjń") == 53);
|
||||
|
||||
// https://en.wikipedia.org/wiki/Pangram
|
||||
TEST("Stróż pchnął kość w quiz gędźb vel fax myjń");
|
||||
}
|
||||
|
||||
// All values below are 1100, which is is the first multi column sequence.
|
||||
template <class CharT>
|
||||
static void BM_EstimateLengthThreeByteSingleColumnLow(benchmark::State& state) {
|
||||
static_assert(sizeof("\u0800\u0801\u0802\u0803\u0804\u0805\u0806\u0807"
|
||||
"\u0808\u0809\u080a\u080b\u080c\u080d\u080e\u080f") ==
|
||||
49);
|
||||
|
||||
TEST("\u0800\u0801\u0802\u0803\u0804\u0805\u0806\u0807"
|
||||
"\u0808\u0809\u080a\u080b\u080c\u080d\u080e\u080f");
|
||||
}
|
||||
|
||||
template <class CharT>
|
||||
static void
|
||||
BM_EstimateLengthThreeByteSingleColumnHigh(benchmark::State& state) {
|
||||
static_assert(sizeof("\u1800\u1801\u1802\u1803\u1804\u1805\u1806\u1807"
|
||||
"\u1808\u1809\u180a\u180b\u180c\u180d\u180e\u180f") ==
|
||||
49);
|
||||
|
||||
TEST("\u1800\u1801\u1802\u1803\u1804\u1805\u1806\u1807"
|
||||
"\u1808\u1809\u180a\u180b\u180c\u180d\u180e\u180f");
|
||||
}
|
||||
|
||||
template <class CharT>
|
||||
static void BM_EstimateLengthThreeByteDoubleColumn(benchmark::State& state) {
|
||||
static_assert(sizeof("\u1100\u0801\u0802\u0803\u0804\u0805\u0806\u0807"
|
||||
"\u1108\u0809\u080a\u080b\u080c\u080d\u080e\u080f") ==
|
||||
49);
|
||||
|
||||
TEST("\u1100\u0801\u0802\u0803\u0804\u0805\u0806\u0807"
|
||||
"\u1108\u0809\u080a\u080b\u080c\u080d\u080e\u080f");
|
||||
}
|
||||
|
||||
template <class CharT>
|
||||
static void BM_EstimateLengthThreeByte(benchmark::State& state) {
|
||||
static_assert(sizeof("\u1400\u1501\ubbbb\uff00\u0800\u4099\uabcd\u4000"
|
||||
"\u8ead\ubeef\u1111\u4987\u4321\uffff\u357a\ud50e") ==
|
||||
49);
|
||||
|
||||
TEST("\u1400\u1501\ubbbb\uff00\u0800\u4099\uabcd\u4000"
|
||||
"\u8ead\ubeef\u1111\u4987\u4321\uffff\u357a\ud50e");
|
||||
}
|
||||
|
||||
template <class CharT>
|
||||
static void BM_EstimateLengthFourByteSingleColumn(benchmark::State& state) {
|
||||
static_assert(sizeof("\U00010000\U00010001\U00010002\U00010003"
|
||||
"\U00010004\U00010005\U00010006\U00010007"
|
||||
"\U00010008\U00010009\U0001000a\U0001000b"
|
||||
"\U0001000c\U0001000d\U0001000e\U0001000f") == 65);
|
||||
|
||||
TEST("\U00010000\U00010001\U00010002\U00010003"
|
||||
"\U00010004\U00010005\U00010006\U00010007"
|
||||
"\U00010008\U00010009\U0001000a\U0001000b"
|
||||
"\U0001000c\U0001000d\U0001000e\U0001000f");
|
||||
}
|
||||
|
||||
template <class CharT>
|
||||
static void BM_EstimateLengthFourByteDoubleColumn(benchmark::State& state) {
|
||||
static_assert(sizeof("\U00020000\U00020002\U00020002\U00020003"
|
||||
"\U00020004\U00020005\U00020006\U00020007"
|
||||
"\U00020008\U00020009\U0002000a\U0002000b"
|
||||
"\U0002000c\U0002000d\U0002000e\U0002000f") == 65);
|
||||
|
||||
TEST("\U00020000\U00020002\U00020002\U00020003"
|
||||
"\U00020004\U00020005\U00020006\U00020007"
|
||||
"\U00020008\U00020009\U0002000a\U0002000b"
|
||||
"\U0002000c\U0002000d\U0002000e\U0002000f");
|
||||
}
|
||||
|
||||
template <class CharT>
|
||||
static void BM_EstimateLengthFourByte(benchmark::State& state) {
|
||||
static_assert(sizeof("\U00010000\U00010001\U00010002\U00010003"
|
||||
"\U00020004\U00020005\U00020006\U00020007"
|
||||
"\U00010008\U00010009\U0001000a\U0001000b"
|
||||
"\U0002000c\U0002000d\U0002000e\U0002000f") == 65);
|
||||
|
||||
TEST("\U00010000\U00010001\U00010002\U00010003"
|
||||
"\U00020004\U00020005\U00020006\U00020007"
|
||||
"\U00010008\U00010009\U0001000a\U0001000b"
|
||||
"\U0002000c\U0002000d\U0002000e\U0002000f");
|
||||
}
|
||||
|
||||
BENCHMARK_TEMPLATE(BM_EstimateLengthNoMultiByte, char);
|
||||
BENCHMARK_TEMPLATE(BM_EstimateLengthTwoByteDE, char);
|
||||
BENCHMARK_TEMPLATE(BM_EstimateLengthTwoBytePL, char);
|
||||
BENCHMARK_TEMPLATE(BM_EstimateLengthThreeByteSingleColumnLow, char);
|
||||
BENCHMARK_TEMPLATE(BM_EstimateLengthThreeByteSingleColumnHigh, char);
|
||||
BENCHMARK_TEMPLATE(BM_EstimateLengthThreeByteDoubleColumn, char);
|
||||
BENCHMARK_TEMPLATE(BM_EstimateLengthThreeByte, char);
|
||||
BENCHMARK_TEMPLATE(BM_EstimateLengthFourByteSingleColumn, char);
|
||||
BENCHMARK_TEMPLATE(BM_EstimateLengthFourByteDoubleColumn, char);
|
||||
BENCHMARK_TEMPLATE(BM_EstimateLengthFourByte, char);
|
||||
|
||||
BENCHMARK_TEMPLATE(BM_EstimateLengthNoMultiByte, char16_t);
|
||||
BENCHMARK_TEMPLATE(BM_EstimateLengthTwoByteDE, char16_t);
|
||||
BENCHMARK_TEMPLATE(BM_EstimateLengthTwoBytePL, char16_t);
|
||||
BENCHMARK_TEMPLATE(BM_EstimateLengthThreeByteSingleColumnLow, char16_t);
|
||||
BENCHMARK_TEMPLATE(BM_EstimateLengthThreeByteSingleColumnHigh, char16_t);
|
||||
BENCHMARK_TEMPLATE(BM_EstimateLengthThreeByteDoubleColumn, char16_t);
|
||||
BENCHMARK_TEMPLATE(BM_EstimateLengthThreeByte, char16_t);
|
||||
BENCHMARK_TEMPLATE(BM_EstimateLengthFourByteSingleColumn, char16_t);
|
||||
BENCHMARK_TEMPLATE(BM_EstimateLengthFourByteDoubleColumn, char16_t);
|
||||
BENCHMARK_TEMPLATE(BM_EstimateLengthFourByte, char16_t);
|
||||
|
||||
BENCHMARK_TEMPLATE(BM_EstimateLengthNoMultiByte, char32_t);
|
||||
BENCHMARK_TEMPLATE(BM_EstimateLengthTwoByteDE, char32_t);
|
||||
BENCHMARK_TEMPLATE(BM_EstimateLengthTwoBytePL, char32_t);
|
||||
BENCHMARK_TEMPLATE(BM_EstimateLengthThreeByteSingleColumnLow, char32_t);
|
||||
BENCHMARK_TEMPLATE(BM_EstimateLengthThreeByteSingleColumnHigh, char32_t);
|
||||
BENCHMARK_TEMPLATE(BM_EstimateLengthThreeByteDoubleColumn, char32_t);
|
||||
BENCHMARK_TEMPLATE(BM_EstimateLengthThreeByte, char32_t);
|
||||
BENCHMARK_TEMPLATE(BM_EstimateLengthFourByteSingleColumn, char32_t);
|
||||
BENCHMARK_TEMPLATE(BM_EstimateLengthFourByteDoubleColumn, char32_t);
|
||||
BENCHMARK_TEMPLATE(BM_EstimateLengthFourByte, char32_t);
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
benchmark::Initialize(&argc, argv);
|
||||
if (benchmark::ReportUnrecognizedArguments(argc, argv))
|
||||
return 1;
|
||||
|
||||
benchmark::RunSpecifiedBenchmarks();
|
||||
}
|
||||
#else
|
||||
int main(int, char**) { return 0; }
|
||||
#endif
|
@ -31,7 +31,7 @@ function(define_linker_script target)
|
||||
set(link_libraries)
|
||||
if (interface_libs)
|
||||
foreach(lib IN LISTS interface_libs)
|
||||
if ("${lib}" MATCHES "cxx-headers|ParallelSTL")
|
||||
if ("${lib}" STREQUAL "cxx-headers")
|
||||
continue()
|
||||
endif()
|
||||
# If ${lib} is not a target, we use a dummy target which we know will
|
||||
|
64
cmake/Modules/HandleCompilerRT.cmake
Normal file
64
cmake/Modules/HandleCompilerRT.cmake
Normal file
@ -0,0 +1,64 @@
|
||||
function(find_compiler_rt_library name dest)
|
||||
if (NOT DEFINED LIBCXX_COMPILE_FLAGS)
|
||||
message(FATAL_ERROR "LIBCXX_COMPILE_FLAGS must be defined when using this function")
|
||||
endif()
|
||||
set(dest "" PARENT_SCOPE)
|
||||
set(CLANG_COMMAND ${CMAKE_CXX_COMPILER} ${LIBCXX_COMPILE_FLAGS}
|
||||
"--rtlib=compiler-rt" "--print-libgcc-file-name")
|
||||
if (CMAKE_CXX_COMPILER_ID MATCHES Clang AND CMAKE_CXX_COMPILER_TARGET)
|
||||
list(APPEND CLANG_COMMAND "--target=${CMAKE_CXX_COMPILER_TARGET}")
|
||||
endif()
|
||||
get_property(LIBCXX_CXX_FLAGS CACHE CMAKE_CXX_FLAGS PROPERTY VALUE)
|
||||
string(REPLACE " " ";" LIBCXX_CXX_FLAGS "${LIBCXX_CXX_FLAGS}")
|
||||
list(APPEND CLANG_COMMAND ${LIBCXX_CXX_FLAGS})
|
||||
execute_process(
|
||||
COMMAND ${CLANG_COMMAND}
|
||||
RESULT_VARIABLE HAD_ERROR
|
||||
OUTPUT_VARIABLE LIBRARY_FILE
|
||||
)
|
||||
string(STRIP "${LIBRARY_FILE}" LIBRARY_FILE)
|
||||
file(TO_CMAKE_PATH "${LIBRARY_FILE}" LIBRARY_FILE)
|
||||
string(REPLACE "builtins" "${name}" LIBRARY_FILE "${LIBRARY_FILE}")
|
||||
if (NOT HAD_ERROR AND EXISTS "${LIBRARY_FILE}")
|
||||
message(STATUS "Found compiler-rt library: ${LIBRARY_FILE}")
|
||||
set(${dest} "${LIBRARY_FILE}" PARENT_SCOPE)
|
||||
else()
|
||||
message(STATUS "Failed to find compiler-rt library")
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
function(find_compiler_rt_dir dest)
|
||||
if (NOT DEFINED LIBCXX_COMPILE_FLAGS)
|
||||
message(FATAL_ERROR "LIBCXX_COMPILE_FLAGS must be defined when using this function")
|
||||
endif()
|
||||
set(dest "" PARENT_SCOPE)
|
||||
if (APPLE)
|
||||
set(CLANG_COMMAND ${CMAKE_CXX_COMPILER} ${LIBCXX_COMPILE_FLAGS}
|
||||
"-print-file-name=lib")
|
||||
execute_process(
|
||||
COMMAND ${CLANG_COMMAND}
|
||||
RESULT_VARIABLE HAD_ERROR
|
||||
OUTPUT_VARIABLE LIBRARY_DIR
|
||||
)
|
||||
string(STRIP "${LIBRARY_DIR}" LIBRARY_DIR)
|
||||
file(TO_CMAKE_PATH "${LIBRARY_DIR}" LIBRARY_DIR)
|
||||
set(LIBRARY_DIR "${LIBRARY_DIR}/darwin")
|
||||
else()
|
||||
set(CLANG_COMMAND ${CMAKE_CXX_COMPILER} ${LIBCXX_COMPILE_FLAGS}
|
||||
"--rtlib=compiler-rt" "--print-libgcc-file-name")
|
||||
execute_process(
|
||||
COMMAND ${CLANG_COMMAND}
|
||||
RESULT_VARIABLE HAD_ERROR
|
||||
OUTPUT_VARIABLE LIBRARY_FILE
|
||||
)
|
||||
string(STRIP "${LIBRARY_FILE}" LIBRARY_FILE)
|
||||
file(TO_CMAKE_PATH "${LIBRARY_FILE}" LIBRARY_FILE)
|
||||
get_filename_component(LIBRARY_DIR "${LIBRARY_FILE}" DIRECTORY)
|
||||
endif()
|
||||
if (NOT HAD_ERROR AND EXISTS "${LIBRARY_DIR}")
|
||||
message(STATUS "Found compiler-rt directory: ${LIBRARY_DIR}")
|
||||
set(${dest} "${LIBRARY_DIR}" PARENT_SCOPE)
|
||||
else()
|
||||
message(STATUS "Failed to find compiler-rt directory")
|
||||
endif()
|
||||
endfunction()
|
@ -1,9 +1,8 @@
|
||||
|
||||
#===============================================================================
|
||||
# Add an ABI library if appropriate
|
||||
#===============================================================================
|
||||
|
||||
include(GNUInstallDirs)
|
||||
|
||||
#
|
||||
# _setup_abi: Set up the build to use an ABI library
|
||||
#
|
||||
@ -64,7 +63,7 @@ macro(setup_abi_lib abidefines abishared abistatic abifiles abidirs)
|
||||
|
||||
if (LIBCXX_INSTALL_HEADERS)
|
||||
install(FILES "${LIBCXX_BINARY_INCLUDE_DIR}/${fpath}"
|
||||
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/c++/v1/${dstdir}"
|
||||
DESTINATION include/c++/v1/${dstdir}
|
||||
COMPONENT cxx-headers
|
||||
PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
|
||||
)
|
||||
@ -118,10 +117,6 @@ elseif ("${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "libcxxabi")
|
||||
setup_abi_lib(
|
||||
"-DLIBCXX_BUILDING_LIBCXXABI"
|
||||
"${shared}" "${static}" "cxxabi.h;__cxxabi_config.h" "")
|
||||
elseif ("${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "system-libcxxabi")
|
||||
setup_abi_lib(
|
||||
"-DLIBCXX_BUILDING_LIBCXXABI"
|
||||
"c++abi" "c++abi" "cxxabi.h;__cxxabi_config.h" "")
|
||||
elseif ("${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "libcxxrt")
|
||||
if(NOT LIBCXX_CXX_ABI_INCLUDE_PATHS)
|
||||
set(LIBCXX_CXX_ABI_INCLUDE_PATHS "/usr/include/c++/v1")
|
||||
|
78
cmake/Modules/HandleOutOfTreeLLVM.cmake
Normal file
78
cmake/Modules/HandleOutOfTreeLLVM.cmake
Normal file
@ -0,0 +1,78 @@
|
||||
if (NOT DEFINED LLVM_PATH)
|
||||
set(LLVM_PATH ${CMAKE_CURRENT_LIST_DIR}/../../../llvm CACHE PATH "" FORCE)
|
||||
endif()
|
||||
|
||||
if(NOT IS_DIRECTORY ${LLVM_PATH})
|
||||
message(FATAL_ERROR
|
||||
"The provided LLVM_PATH (${LLVM_PATH}) is not a valid directory. Note that "
|
||||
"building libc++ outside of the monorepo is not supported anymore. Please "
|
||||
"use a Standalone build against the monorepo, a Runtimes build or a classic "
|
||||
"monorepo build.")
|
||||
endif()
|
||||
|
||||
set(LLVM_INCLUDE_DIR ${LLVM_PATH}/include CACHE PATH "Path to llvm/include")
|
||||
set(LLVM_PATH ${LLVM_PATH} CACHE PATH "Path to LLVM source tree")
|
||||
set(LLVM_MAIN_SRC_DIR ${LLVM_PATH})
|
||||
set(LLVM_CMAKE_PATH "${LLVM_PATH}/cmake/modules")
|
||||
|
||||
if (EXISTS "${LLVM_CMAKE_PATH}")
|
||||
list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_PATH}")
|
||||
elseif (EXISTS "${LLVM_MAIN_SRC_DIR}/cmake/modules")
|
||||
list(APPEND CMAKE_MODULE_PATH "${LLVM_MAIN_SRC_DIR}/cmake/modules")
|
||||
else()
|
||||
message(FATAL_ERROR "Neither ${LLVM_CMAKE_PATH} nor ${LLVM_MAIN_SRC_DIR}/cmake/modules found. "
|
||||
"This is not a supported configuration.")
|
||||
endif()
|
||||
|
||||
message(STATUS "Configuring for standalone build.")
|
||||
|
||||
# By default, we target the host, but this can be overridden at CMake invocation time.
|
||||
include(GetHostTriple)
|
||||
get_host_triple(LLVM_INFERRED_HOST_TRIPLE)
|
||||
set(LLVM_HOST_TRIPLE "${LLVM_INFERRED_HOST_TRIPLE}" CACHE STRING "Host on which LLVM binaries will run")
|
||||
set(LLVM_DEFAULT_TARGET_TRIPLE "${LLVM_HOST_TRIPLE}" CACHE STRING "Target triple used by default.")
|
||||
|
||||
# Add LLVM Functions --------------------------------------------------------
|
||||
if (WIN32)
|
||||
set(LLVM_ON_UNIX 0)
|
||||
set(LLVM_ON_WIN32 1)
|
||||
else()
|
||||
set(LLVM_ON_UNIX 1)
|
||||
set(LLVM_ON_WIN32 0)
|
||||
endif()
|
||||
|
||||
include(AddLLVM OPTIONAL)
|
||||
|
||||
# LLVM Options --------------------------------------------------------------
|
||||
if (NOT DEFINED LLVM_INCLUDE_TESTS)
|
||||
set(LLVM_INCLUDE_TESTS ON)
|
||||
endif()
|
||||
if (NOT DEFINED LLVM_INCLUDE_DOCS)
|
||||
set(LLVM_INCLUDE_DOCS ON)
|
||||
endif()
|
||||
if (NOT DEFINED LLVM_ENABLE_SPHINX)
|
||||
set(LLVM_ENABLE_SPHINX OFF)
|
||||
endif()
|
||||
|
||||
if (LLVM_INCLUDE_TESTS)
|
||||
# Required LIT Configuration ------------------------------------------------
|
||||
# Define the default arguments to use with 'lit', and an option for the user
|
||||
# to override.
|
||||
set(LLVM_DEFAULT_EXTERNAL_LIT "${LLVM_MAIN_SRC_DIR}/utils/lit/lit.py")
|
||||
set(LIT_ARGS_DEFAULT "-sv --show-xfail --show-unsupported")
|
||||
if (MSVC OR XCODE)
|
||||
set(LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --no-progress-bar")
|
||||
endif()
|
||||
set(LLVM_LIT_ARGS "${LIT_ARGS_DEFAULT}" CACHE STRING "Default options for lit")
|
||||
endif()
|
||||
|
||||
# Required doc configuration
|
||||
if (LLVM_ENABLE_SPHINX)
|
||||
find_package(Sphinx REQUIRED)
|
||||
endif()
|
||||
|
||||
if (LLVM_ON_UNIX AND NOT APPLE)
|
||||
set(LLVM_HAVE_LINK_VERSION_SCRIPT 1)
|
||||
else()
|
||||
set(LLVM_HAVE_LINK_VERSION_SCRIPT 0)
|
||||
endif()
|
@ -1,16 +0,0 @@
|
||||
set(CMAKE_BUILD_TYPE Release CACHE STRING "")
|
||||
set(CMAKE_BUILD_WITH_INSTALL_RPATH ON CACHE BOOL "")
|
||||
set(CMAKE_C_FLAGS "-D__LIBC_NO_CPP_MATH_OVERLOADS__" CACHE STRING "")
|
||||
set(CMAKE_CXX_FLAGS "-D__LIBC_NO_CPP_MATH_OVERLOADS__" CACHE STRING "")
|
||||
set(CMAKE_SHARED_LINKER_FLAGS "-Wl,-G -Wl,-bcdtors:all:-2147483548:s" CACHE STRING "")
|
||||
|
||||
set(LIBCXX_USE_COMPILER_RT ON CACHE BOOL "")
|
||||
set(LIBCXX_ENABLE_ASSERTIONS OFF CACHE BOOL "")
|
||||
set(LIBCXX_ABI_VERSION "1" CACHE STRING "")
|
||||
set(LIBCXX_ENABLE_ABI_LINKER_SCRIPT OFF CACHE BOOL "")
|
||||
set(LIBCXX_ENABLE_EXPERIMENTAL_LIBRARY OFF CACHE BOOL "")
|
||||
set(LIBCXX_ENABLE_SHARED ON CACHE BOOL "")
|
||||
set(LIBCXX_ENABLE_STATIC OFF CACHE BOOL "")
|
||||
set(LIBCXXABI_ENABLE_SHARED ON CACHE BOOL "")
|
||||
set(LIBCXXABI_ENABLE_STATIC OFF CACHE BOOL "")
|
||||
set(LIBCXX_CXX_ABI libcxxabi CACHE STRING "")
|
@ -18,6 +18,3 @@ set(LIBCXXABI_HERMETIC_STATIC_LIBRARY ON CACHE BOOL "")
|
||||
|
||||
set(LIBCXXABI_ENABLE_ASSERTIONS OFF CACHE BOOL "")
|
||||
set(LIBCXXABI_ENABLE_FORGIVING_DYNAMIC_CAST ON CACHE BOOL "")
|
||||
|
||||
set(LIBCXX_TEST_PARAMS "stdlib=apple-libc++" CACHE STRING "")
|
||||
set(LIBCXXABI_TEST_PARAMS "${LIBCXX_TEST_PARAMS}" CACHE STRING "")
|
||||
|
@ -1,4 +1,4 @@
|
||||
set(LIBCXXABI_USE_LLVM_UNWINDER ON CACHE BOOL "")
|
||||
set(LIBCXX_TARGET_TRIPLE "armv7l-linux-gnueabihf" CACHE STRING "")
|
||||
set(LIBCXX_TARGET_TRIPLE "armv7-linux-gnueabihf" CACHE STRING "")
|
||||
set(CMAKE_CXX_FLAGS "-marm" CACHE STRING "")
|
||||
set(CMAKE_C_FLAGS "-marm" CACHE STRING "")
|
||||
|
@ -1,5 +1,5 @@
|
||||
set(LIBCXXABI_USE_LLVM_UNWINDER ON CACHE BOOL "")
|
||||
set(LIBCXX_TARGET_TRIPLE "armv7l-linux-gnueabihf" CACHE STRING "")
|
||||
set(LIBCXX_TARGET_TRIPLE "armv7-linux-gnueabihf" CACHE STRING "")
|
||||
set(CMAKE_CXX_FLAGS "-mthumb" CACHE STRING "")
|
||||
set(CMAKE_C_FLAGS "-mthumb" CACHE STRING "")
|
||||
set(LIBCXX_ENABLE_EXCEPTIONS OFF CACHE BOOL "")
|
||||
|
@ -1,4 +1,4 @@
|
||||
set(LIBCXXABI_USE_LLVM_UNWINDER ON CACHE BOOL "")
|
||||
set(LIBCXX_TARGET_TRIPLE "armv8l-linux-gnueabihf" CACHE STRING "")
|
||||
set(LIBCXX_TARGET_TRIPLE "armv8-linux-gnueabihf" CACHE STRING "")
|
||||
set(CMAKE_CXX_FLAGS "-marm" CACHE STRING "")
|
||||
set(CMAKE_C_FLAGS "-marm" CACHE STRING "")
|
||||
|
@ -1,5 +1,5 @@
|
||||
set(LIBCXXABI_USE_LLVM_UNWINDER ON CACHE BOOL "")
|
||||
set(LIBCXX_TARGET_TRIPLE "armv8l-linux-gnueabihf" CACHE STRING "")
|
||||
set(LIBCXX_TARGET_TRIPLE "armv8-linux-gnueabihf" CACHE STRING "")
|
||||
set(CMAKE_CXX_FLAGS "-mthumb" CACHE STRING "")
|
||||
set(CMAKE_C_FLAGS "-mthumb" CACHE STRING "")
|
||||
set(LIBCXX_ENABLE_EXCEPTIONS OFF CACHE BOOL "")
|
||||
|
1
cmake/caches/Generic-32bits.cmake
Normal file
1
cmake/caches/Generic-32bits.cmake
Normal file
@ -0,0 +1 @@
|
||||
set(LLVM_BUILD_32_BITS ON CACHE BOOL "")
|
@ -1,3 +1 @@
|
||||
set(LLVM_USE_SANITIZER "Address" CACHE STRING "")
|
||||
# This is a temporary (hopefully) workaround for an ASan issue (see https://llvm.org/D119410).
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mllvm -asan-use-private-alias=1" CACHE INTERNAL "")
|
||||
|
@ -1,2 +1,2 @@
|
||||
set(LIBCXX_TEST_PARAMS "debug_level=1" CACHE STRING "")
|
||||
set(LIBCXX_TEST_PARAMS "debug_level=1" "additional_features=LIBCXX-DEBUG-FIXME" CACHE STRING "")
|
||||
set(LIBCXXABI_TEST_PARAMS "${LIBCXX_TEST_PARAMS}" CACHE STRING "")
|
||||
|
@ -1,2 +0,0 @@
|
||||
set(LIBCXX_ENABLE_EXPERIMENTAL_LIBRARY OFF CACHE BOOL "")
|
||||
set(LIBCXX_ENABLE_INCOMPLETE_FEATURES OFF CACHE BOOL "")
|
@ -1 +0,0 @@
|
||||
set(LIBCXX_ENABLE_UNICODE OFF CACHE BOOL "")
|
@ -1 +0,0 @@
|
||||
set(LIBCXX_ENABLE_WIDE_CHARACTERS OFF CACHE BOOL "")
|
@ -1,18 +0,0 @@
|
||||
set(LIBCXX_ENABLE_EXPERIMENTAL_LIBRARY OFF CACHE BOOL "")
|
||||
set(LIBCXX_HAS_WIN32_THREAD_API ON CACHE BOOL "")
|
||||
|
||||
set(LIBCXX_CXX_ABI libcxxabi CACHE STRING "")
|
||||
set(LIBCXXABI_USE_LLVM_UNWINDER ON CACHE BOOL "")
|
||||
|
||||
set(LIBCXXABI_ENABLE_SHARED OFF CACHE BOOL "")
|
||||
set(LIBCXX_ENABLE_STATIC_ABI_LIBRARY ON CACHE BOOL "")
|
||||
|
||||
set(LIBCXX_USE_COMPILER_RT ON CACHE BOOL "")
|
||||
set(LIBCXXABI_USE_COMPILER_RT ON CACHE BOOL "")
|
||||
set(LIBUNWIND_USE_COMPILER_RT ON CACHE BOOL "")
|
||||
|
||||
set(LIBCXX_TARGET_INFO "libcxx.test.target_info.MingwLocalTI" CACHE STRING "")
|
||||
|
||||
# Without this flag, 'long double' (which is 80 bit on x86 mingw, but
|
||||
# 64 bit in MSVC) isn't handled correctly in printf.
|
||||
set(LIBCXX_EXTRA_SITE_DEFINES "__USE_MINGW_ANSI_STDIO=1" CACHE STRING "")
|
@ -1,22 +1,9 @@
|
||||
include(CMakePushCheckState)
|
||||
include(CheckLibraryExists)
|
||||
include(LLVMCheckCompilerLinkerFlag)
|
||||
include(CheckCCompilerFlag)
|
||||
include(CheckCXXCompilerFlag)
|
||||
include(CheckCSourceCompiles)
|
||||
|
||||
# The compiler driver may be implicitly trying to link against libunwind.
|
||||
# This is normally ok (libcxx relies on an unwinder), but if libunwind is
|
||||
# built in the same cmake invocation as libcxx and we've got
|
||||
# LIBCXXABI_USE_LLVM_UNWINDER set, we'd be linking against the just-built
|
||||
# libunwind (and the compiler implicit -lunwind wouldn't succeed as the newly
|
||||
# built libunwind isn't installed yet). For those cases, it'd be good to
|
||||
# link with --uwnindlib=none. Check if that option works.
|
||||
llvm_check_compiler_linker_flag(C "--unwindlib=none" LIBCXX_SUPPORTS_UNWINDLIB_NONE_FLAG)
|
||||
if (LIBCXX_SUPPORTS_UNWINDLIB_NONE_FLAG)
|
||||
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} --unwindlib=none")
|
||||
endif()
|
||||
|
||||
if(WIN32 AND NOT MINGW)
|
||||
# NOTE(compnerd) this is technically a lie, there is msvcrt, but for now, lets
|
||||
# let the default linking take care of that.
|
||||
@ -61,9 +48,8 @@ if (LIBCXX_SUPPORTS_NOSTDLIBXX_FLAG OR LIBCXX_SUPPORTS_NODEFAULTLIBS_FLAG)
|
||||
list(APPEND CMAKE_REQUIRED_LIBRARIES c)
|
||||
endif ()
|
||||
if (LIBCXX_USE_COMPILER_RT)
|
||||
include(HandleCompilerRT)
|
||||
find_compiler_rt_library(builtins LIBCXX_BUILTINS_LIBRARY
|
||||
FLAGS ${LIBCXX_COMPILE_FLAGS})
|
||||
list(APPEND CMAKE_REQUIRED_FLAGS -rtlib=compiler-rt)
|
||||
find_compiler_rt_library(builtins LIBCXX_BUILTINS_LIBRARY)
|
||||
list(APPEND CMAKE_REQUIRED_LIBRARIES "${LIBCXX_BUILTINS_LIBRARY}")
|
||||
elseif (LIBCXX_HAS_GCC_LIB)
|
||||
list(APPEND CMAKE_REQUIRED_LIBRARIES gcc)
|
||||
@ -87,7 +73,7 @@ if (LIBCXX_SUPPORTS_NOSTDLIBXX_FLAG OR LIBCXX_SUPPORTS_NODEFAULTLIBS_FLAG)
|
||||
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -fno-sanitize=all")
|
||||
endif ()
|
||||
if (CMAKE_C_FLAGS MATCHES -fsanitize-coverage OR CMAKE_CXX_FLAGS MATCHES -fsanitize-coverage)
|
||||
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -fsanitize-coverage=0")
|
||||
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -fno-sanitize-coverage=edge,trace-cmp,indirect-calls,8bit-counters")
|
||||
endif ()
|
||||
endif ()
|
||||
|
||||
|
@ -34,7 +34,9 @@ An example of a job definition is:
|
||||
queue: "libcxx-builders"
|
||||
os: "linux"
|
||||
retry:
|
||||
[...]
|
||||
automatic:
|
||||
- exit_status: -1 # Agent was lost
|
||||
limit: 2
|
||||
|
||||
If you create your own agents, put them in the ``libcxx-builders`` queue and
|
||||
use agent tags to allow targetting your agents from the Buildkite pipeline
|
||||
|
@ -25,58 +25,50 @@ libc++ :ref:`here <using-libcxx>`.
|
||||
The default build
|
||||
=================
|
||||
|
||||
The default way of building libc++, libc++abi and libunwind is to root the CMake
|
||||
invocation at ``<monorepo>/runtimes``. While those projects are under the LLVM
|
||||
umbrella, they are different in nature from other build tools, so it makes sense
|
||||
to treat them as a separate set of entities. The default build can be achieved
|
||||
with the following CMake invocation:
|
||||
By default, libc++ and libc++abi are built as sub-projects of the LLVM project.
|
||||
This can be achieved with the usual CMake invocation:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ git clone https://github.com/llvm/llvm-project.git
|
||||
$ cd llvm-project
|
||||
$ mkdir build
|
||||
$ cmake -G Ninja -S runtimes -B build -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi;libunwind" # Configure
|
||||
$ ninja -C build cxx cxxabi unwind # Build
|
||||
$ ninja -C build check-cxx check-cxxabi check-unwind # Test
|
||||
$ ninja -C build install-cxx install-cxxabi install-unwind # Install
|
||||
$ cmake -G Ninja -S llvm -B build -DLLVM_ENABLE_PROJECTS="libcxx;libcxxabi" # Configure
|
||||
$ ninja -C build cxx cxxabi # Build
|
||||
$ ninja -C build check-cxx check-cxxabi # Test
|
||||
$ ninja -C build install-cxx install-cxxabi # Install
|
||||
|
||||
.. note::
|
||||
See :ref:`CMake Options` below for more configuration options.
|
||||
|
||||
After building the various ``install-XXX`` targets, shared libraries for libc++, libc++abi and
|
||||
libunwind should now be present in ``<CMAKE_INSTALL_PREFIX>/lib``, and headers in
|
||||
``<CMAKE_INSTALL_PREFIX>/include/c++/v1``. See :ref:`using an alternate libc++ installation
|
||||
<alternate libcxx>` for information on how to use this libc++ over the default one.
|
||||
After building the ``install-cxx`` and ``install-cxxabi`` targets, shared libraries
|
||||
for libc++ and libc++abi should now be present in ``<CMAKE_INSTALL_PREFIX>/lib``, and
|
||||
headers in ``<CMAKE_INSTALL_PREFIX>/include/c++/v1``. See :ref:`using an alternate
|
||||
libc++ installation <alternate libcxx>` for information on how to use this libc++ over
|
||||
the default one.
|
||||
|
||||
In the default configuration, the runtimes will be built using the compiler available by default
|
||||
on your system. Of course, you can change what compiler is being used with the usual CMake
|
||||
variables. If you wish to build the runtimes from a just-built Clang, the bootstrapping build
|
||||
explained below makes this task easy.
|
||||
In the default configuration, libc++ and libc++abi will be built using the compiler available
|
||||
by default on your system. It is also possible to bootstrap Clang and build libc++ with it.
|
||||
|
||||
|
||||
Bootstrapping build
|
||||
===================
|
||||
|
||||
It is possible to build Clang and then build the runtimes using that just-built compiler in a
|
||||
single CMake invocation. This is usually the correct way to build the runtimes when putting together
|
||||
a toolchain, or when the system compiler is not adequate to build them (too old, unsupported, etc.).
|
||||
To do this, use the following CMake invocation, and in particular notice how we're now rooting the
|
||||
CMake invocation at ``<monorepo>/llvm``:
|
||||
It is also possible to build Clang and then build libc++ and libc++abi using that
|
||||
just-built compiler. This is the correct way to build libc++ when putting together
|
||||
a toolchain, or when the system compiler is not adequate to build libc++ (too old,
|
||||
unsupported, etc.). This type of build is also commonly called a "Runtimes build":
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ mkdir build
|
||||
$ cmake -G Ninja -S llvm -B build -DLLVM_ENABLE_PROJECTS="clang" \ # Configure
|
||||
-DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi;libunwind" \
|
||||
-DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi" \
|
||||
-DLLVM_RUNTIME_TARGETS="<target-triple>"
|
||||
$ ninja -C build runtimes # Build
|
||||
$ ninja -C build check-runtimes # Test
|
||||
$ ninja -C build install-runtimes # Install
|
||||
|
||||
.. note::
|
||||
This type of build is also commonly called a "Runtimes build", but we would like to move
|
||||
away from that terminology, which is too confusing.
|
||||
|
||||
Support for Windows
|
||||
===================
|
||||
@ -218,6 +210,12 @@ libc++ specific options
|
||||
|
||||
Build libc++ with assertions enabled.
|
||||
|
||||
.. option:: LIBCXX_BUILD_32_BITS:BOOL
|
||||
|
||||
**Default**: ``OFF``
|
||||
|
||||
Build libc++ as a 32 bit library. Also see `LLVM_BUILD_32_BITS`.
|
||||
|
||||
.. option:: LIBCXX_ENABLE_SHARED:BOOL
|
||||
|
||||
**Default**: ``ON``
|
||||
@ -253,15 +251,6 @@ libc++ specific options
|
||||
This option can be used to enable or disable the filesystem components on
|
||||
platforms that may not support them. For example on Windows when using MSVC.
|
||||
|
||||
.. option:: LIBCXX_ENABLE_WIDE_CHARACTERS:BOOL
|
||||
|
||||
**Default**: ``ON``
|
||||
|
||||
This option can be used to disable support for ``wchar_t`` in the library. It also
|
||||
allows the library to work on top of a C Standard Library that does not provide
|
||||
support for ``wchar_t``. This is especially useful in embedded settings where
|
||||
C Standard Libraries don't always provide all the usual bells and whistles.
|
||||
|
||||
.. option:: LIBCXX_ENABLE_INCOMPLETE_FEATURES:BOOL
|
||||
|
||||
**Default**: ``ON``
|
||||
@ -318,7 +307,7 @@ ABI Library Specific Options
|
||||
|
||||
.. option:: LIBCXX_CXX_ABI:STRING
|
||||
|
||||
**Values**: ``none``, ``libcxxabi``, ``system-libcxxabi``, ``libcxxrt``, ``libstdc++``, ``libsupc++``.
|
||||
**Values**: ``none``, ``libcxxabi``, ``libcxxrt``, ``libstdc++``, ``libsupc++``.
|
||||
|
||||
Select the ABI library to build libc++ against.
|
||||
|
||||
@ -523,8 +512,8 @@ We can now run CMake:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ cmake -G Ninja -S runtimes -B build \
|
||||
-DLLVM_ENABLE_RUNTIMES="libcxx" \
|
||||
$ cmake -G Ninja -S llvm -B build \
|
||||
-DLLVM_ENABLE_PROJECTS="libcxx" \
|
||||
-DLIBCXX_CXX_ABI=libstdc++ \
|
||||
-DLIBCXX_CXX_ABI_INCLUDE_PATHS="/usr/include/c++/4.7/;/usr/include/c++/4.7/x86_64-linux-gnu/"
|
||||
$ ninja -C build install-cxx
|
||||
@ -549,8 +538,8 @@ We can now run CMake like:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ cmake -G Ninja -S runtimes -B build \
|
||||
-DLLVM_ENABLE_RUNTIMES="libcxx" \
|
||||
$ cmake -G Ninja -S llvm -B build \
|
||||
-DLLVM_ENABLE_PROJECTS="libcxx" \
|
||||
-DLIBCXX_CXX_ABI=libcxxrt \
|
||||
-DLIBCXX_CXX_ABI_INCLUDE_PATHS=path/to/libcxxrt-sources/src
|
||||
$ ninja -C build install-cxx
|
||||
|
@ -12,9 +12,6 @@ For libc++, please make sure you follow `these instructions <https://www.llvm.or
|
||||
for submitting a code review from the command-line using ``arc``, since we have some
|
||||
automation (e.g. CI) that depends on the review being submitted that way.
|
||||
|
||||
If you plan on contributing to libc++, it can be useful to join the ``#libcxx`` channel
|
||||
on `LLVM's Discord server <https://discord.gg/jzUbyP26tQ>`__.
|
||||
|
||||
Looking for pre-existing reviews
|
||||
================================
|
||||
|
||||
@ -45,22 +42,6 @@ sure you don't forget anything:
|
||||
- Did you add the relevant feature test macro(s) for your feature? Did you update the ``generate_feature_test_macro_components.py`` script with it?
|
||||
- Did you run the ``libcxx-generate-files`` target and verify its output?
|
||||
|
||||
The review process
|
||||
==================
|
||||
|
||||
After uploading your patch, you should see that the "libc++" review group is automatically
|
||||
added as a reviewer for your patch. Once the group is marked as having approved your patch,
|
||||
you can commit it. However, if you get an approval very quickly for a significant patch,
|
||||
please try to wait a couple of business days before committing to give the opportunity for
|
||||
other reviewers to chime in. If you need someone else to commit the patch for you, please
|
||||
mention it and provide your ``Name <email@domain>`` for us to attribute the commit properly.
|
||||
|
||||
Note that the rule for accepting as the "libc++" review group is to wait for two members
|
||||
of the group to have approved the patch, excluding the patch author. This is not a hard
|
||||
rule -- for very simple patches, use your judgement. The `"libc++" review group <https://reviews.llvm.org/project/members/64/>`__
|
||||
consists of frequent libc++ contributors with a good understanding of the project's
|
||||
guidelines -- if you would like to be added to it, please reach out on Discord.
|
||||
|
||||
Post-release check list
|
||||
=======================
|
||||
|
||||
@ -85,97 +66,3 @@ abilist for the platform, e.g.:
|
||||
|
||||
* C++20 for the Linux platform.
|
||||
* MacOS C++20 for the Apple platform.
|
||||
|
||||
Working on large features
|
||||
=========================
|
||||
|
||||
Libc++ makes no guarantees about the implementation status or the ABI stability
|
||||
of features that have not yet been ratified in the C++ Standard. After the C++
|
||||
Standard is ratified libc++ promises a conforming and ABI-stable
|
||||
implementation. When working on a large new feature in the ratified version of
|
||||
the C++ Standard that can't be finished before the next release branch is
|
||||
created, we can't honor this promise. Another reason for not being able to
|
||||
promise ABI stability happens when the C++ Standard committee retroactively
|
||||
accepts ABI breaking papers as defect reports against the ratified C++
|
||||
Standard.
|
||||
|
||||
When working on these features it should be possible for libc++ vendors to
|
||||
disable these incomplete features, so they can promise ABI stability to their
|
||||
customers. This is done by the CMake option
|
||||
``LIBCXX_ENABLE_INCOMPLETE_FEATURES``. When start working on a large feature
|
||||
the following steps are required to guard the new library with the CMake
|
||||
option.
|
||||
|
||||
* ``libcxx/CMakeLists.txt``: Add
|
||||
|
||||
.. code-block:: cmake
|
||||
|
||||
config_define_if_not(LIBCXX_ENABLE_INCOMPLETE_FEATURES _LIBCPP_HAS_NO_INCOMPLETE_FOO)
|
||||
|
||||
* ``libcxx/include/__config_site.in``: Add
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
#cmakedefine _LIBCPP_HAS_NO_INCOMPLETE_FOO
|
||||
|
||||
* ``libcxx/include/foo``: The contents of the file should be guarded in an
|
||||
``ifdef`` and always include ``<version>``
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
#ifndef _LIBCPP_FOO
|
||||
#define _LIBCPP_FOO
|
||||
|
||||
// Make sure all feature-test macros are available.
|
||||
#include <version>
|
||||
// Enable the contents of the header only when libc++ was built with LIBCXX_ENABLE_INCOMPLETE_FEATURES.
|
||||
#if !defined(_LIBCPP_HAS_NO_INCOMPLETE_FOO)
|
||||
|
||||
...
|
||||
|
||||
#endif // !defined(_LIBCPP_HAS_NO_INCOMPLETE_FO0)
|
||||
#endif // _LIBCPP_FOO
|
||||
|
||||
* ``libcxx/src/CMakeLists.txt``: When the library has a file ``foo.cpp`` it
|
||||
should only be added when ``LIBCXX_ENABLE_INCOMPLETE_FEATURES`` is enabled
|
||||
|
||||
.. code-block:: cmake
|
||||
|
||||
if(LIBCXX_ENABLE_INCOMPLETE_FEATURES)
|
||||
list(APPEND LIBCXX_SOURCES
|
||||
foo.cpp
|
||||
)
|
||||
endif()
|
||||
|
||||
* ``libcxx/utils/generate_feature_test_macro_components.py``: Add to
|
||||
``lit_markup``
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
"foo": ["UNSUPPORTED: libcpp-has-no-incomplete-foo"],
|
||||
|
||||
* ``libcxx/utils/generate_header_inclusion_tests.py``: Add to ``lit_markup``
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
"foo": ["UNSUPPORTED: libcpp-has-no-incomplete-foo"],
|
||||
|
||||
* ``libcxx/utils/generate_header_tests.py``: Add to ``header_markup``
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
"foo": ["ifndef _LIBCPP_HAS_NO_INCOMPLETE_FOO"],
|
||||
|
||||
* ``libcxx/utils/libcxx/test/features.py``: Add to ``macros``
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
'_LIBCPP_HAS_NO_INCOMPLETE_FOO': 'libcpp-has-no-incomplete-foo',
|
||||
|
||||
* All tests that include ``<foo>`` should contain
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
// UNSUPPORTED: libcpp-has-no-incomplete-foo
|
||||
|
||||
Once the library is complete these changes and guards should be removed.
|
||||
|
@ -65,12 +65,16 @@ configuration all together. An example "__config" header generated when
|
||||
#ifndef _LIBCPP_CONFIG_SITE
|
||||
#define _LIBCPP_CONFIG_SITE
|
||||
|
||||
/* #undef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE */
|
||||
/* #undef _LIBCPP_HAS_NO_STDIN */
|
||||
/* #undef _LIBCPP_HAS_NO_STDOUT */
|
||||
#define _LIBCPP_HAS_NO_THREADS
|
||||
/* #undef _LIBCPP_HAS_NO_MONOTONIC_CLOCK */
|
||||
/* #undef _LIBCPP_HAS_NO_THREAD_UNSAFE_C_FUNCTIONS */
|
||||
|
||||
#endif
|
||||
// -*- C++ -*-
|
||||
//===----------------------------------------------------------------------===//
|
||||
//===--------------------------- __config ---------------------------------===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
|
@ -58,15 +58,6 @@ The following containers and classes support iterator debugging:
|
||||
The remaining containers do not currently support iterator debugging.
|
||||
Patches welcome.
|
||||
|
||||
Randomizing Unspecified Behavior (``_LIBCPP_DEBUG == 1``)
|
||||
---------------------------------------------------------
|
||||
This also enables the randomization of unspecified behavior, for
|
||||
example, for equal elements in ``std::sort`` or randomizing both parts of
|
||||
the partition after ``std::nth_element`` call. This effort helps you to migrate
|
||||
to potential future faster versions of these algorithms and deflake your tests
|
||||
which depend on such behavior. To fix the seed, use
|
||||
``_LIBCPP_DEBUG_RANDOMIZE_UNSPECIFIED_STABILITY_SEED=seed`` definition.
|
||||
|
||||
Handling Assertion Failures
|
||||
===========================
|
||||
When a debug assertion fails the assertion handler is called via the
|
||||
|
@ -36,7 +36,7 @@ Design
|
||||
======
|
||||
|
||||
* Annotate the two definitions of ``std::unique_ptr`` with ``clang::trivial_abi`` attribute.
|
||||
* Put the attribute behind a flag because this change has potential compilation and runtime breakages.
|
||||
* Put the attribuate behind a flag because this change has potential compilation and runtime breakages.
|
||||
|
||||
|
||||
This comes with some side effects:
|
||||
|
@ -1,86 +0,0 @@
|
||||
==================================
|
||||
Unspecified Behavior Randomization
|
||||
==================================
|
||||
|
||||
Background
|
||||
==========
|
||||
|
||||
Consider the follow snippet which steadily happens in tests:
|
||||
|
||||
|
||||
.. code-block:: cpp
|
||||
|
||||
std::vector<std::pair<int, int>> v(SomeData());
|
||||
std::sort(v.begin(), v.end(), [](const auto& lhs, const auto& rhs) {
|
||||
return lhs.first < rhs.first;
|
||||
});
|
||||
|
||||
Under this assumption all elements in the vector whose first elements are equal
|
||||
do not guarantee any order. Unfortunately, this prevents libcxx introducing
|
||||
other implementatiosn because tests might silently fail and the users might
|
||||
heavily depend on the stability of implementations.
|
||||
|
||||
Goal
|
||||
===================
|
||||
|
||||
Provide functionality for randomizing the unspecified behavior so that the users
|
||||
can test and migrate their components and libcxx can introduce new sorting
|
||||
algorithms and optimizations to the containers.
|
||||
|
||||
For example, as of LLVM version 13, libcxx sorting algorithm takes
|
||||
`O(n^2) worst case <https://llvm.org/PR20837>`_ but according
|
||||
to the standard its worst case should be `O(n log n)`. This effort helps users
|
||||
to gradually fix their tests while updating to new faster algorithms.
|
||||
|
||||
Design
|
||||
======
|
||||
|
||||
* Introduce new macro `_LIBCPP_DEBUG_RANDOMIZE_UNSPECIFIED_STABILITY` which should
|
||||
be a part of the libcxx config.
|
||||
* This macro randomizes the unspecified behavior of algorithms and containers.
|
||||
For example, for sorting algorithm the input range is shuffled and then
|
||||
sorted.
|
||||
* This macro is off by default because users should enable it only for testing
|
||||
purposes and/or migrations if they happen to libcxx.
|
||||
* This feature is only available for C++11 and further because of
|
||||
`std::shuffle` availability.
|
||||
* We may use `ASLR <https://en.wikipedia.org/wiki/Address_space_layout_randomization>`_ or
|
||||
static `std::random_device` for seeding the random number generator. This
|
||||
guarantees the same stability guarantee within a run but not through different
|
||||
runs, for example, for tests become flaky and eventually be seen as broken.
|
||||
For platforms which do not support ASLR, the seed is fixed during build.
|
||||
* The users can fix the seed of the random number generator by providing
|
||||
`_LIBCPP_RANDOMIZE_UNSPECIFIED_STABILITY_SEED=seed` definition.
|
||||
|
||||
This comes with some side effects if any of the flags is on:
|
||||
|
||||
* Computation penalty, we think users are OK with that if they use this feature.
|
||||
* Non reproducible results if they don't use the fixed seed.
|
||||
|
||||
|
||||
Impact
|
||||
------------------
|
||||
|
||||
Google has measured couple of thousands of tests to be dependent on the
|
||||
stability of sorting and selection algorithms. As we also plan on updating
|
||||
(or least, providing under flag more) sorting algorithms, this effort helps
|
||||
doing it gradually and sustainably. This is also bad for users to depend on the
|
||||
unspecified behavior in their tests, this effort helps to turn this flag in
|
||||
debug mode.
|
||||
|
||||
Potential breakages
|
||||
-------------------
|
||||
|
||||
None if the flag is off. If the flag is on, it may lead to some non-reproducible
|
||||
results, for example, for caching.
|
||||
|
||||
Currently supported randomization
|
||||
---------------------------------
|
||||
|
||||
* `std::sort`, there is no guarantee on the order of equal elements
|
||||
* `std::partial_sort`, there is no guarantee on the order of equal elements and
|
||||
on the order of the remaining part
|
||||
* `std::nth_element`, there is no guarantee on the order from both sides of the
|
||||
partition
|
||||
|
||||
Patches welcome.
|
@ -190,7 +190,7 @@ Status
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_bind_front`` ``201907L``
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_bit_cast`` ``201806L``
|
||||
``__cpp_lib_bit_cast`` *unimplemented*
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_bitops`` *unimplemented*
|
||||
------------------------------------------------- -----------------
|
||||
@ -224,7 +224,7 @@ Status
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_constexpr_vector`` *unimplemented*
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_coroutine`` ``201902L``
|
||||
``__cpp_lib_coroutine`` *unimplemented*
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_destroying_delete`` ``201806L``
|
||||
------------------------------------------------- -----------------
|
||||
@ -290,46 +290,18 @@ Status
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_to_array`` ``201907L``
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_type_identity`` ``201806L``
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_unwrap_ref`` ``201811L``
|
||||
------------------------------------------------- -----------------
|
||||
**C++ 2b**
|
||||
-------------------------------------------------------------------
|
||||
``__cpp_lib_adaptor_iterator_pair_constructor`` ``202106L``
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_allocate_at_least`` *unimplemented*
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_associative_heterogeneous_erasure`` *unimplemented*
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_byteswap`` ``202110L``
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_constexpr_typeinfo`` *unimplemented*
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_invoke_r`` *unimplemented*
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_is_scoped_enum`` ``202011L``
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_monadic_optional`` ``202110L``
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_move_only_function`` *unimplemented*
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_out_ptr`` *unimplemented*
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_ranges_starts_ends_with`` *unimplemented*
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_ranges_zip`` *unimplemented*
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_spanstream`` *unimplemented*
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_stacktrace`` *unimplemented*
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_stdatomic_h`` *unimplemented*
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_string_contains`` ``202011L``
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_string_resize_and_overwrite`` ``202110L``
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_to_underlying`` ``202102L``
|
||||
================================================= =================
|
||||
|
||||
|
@ -1,8 +1,6 @@
|
||||
.. raw:: html
|
||||
|
||||
<style type="text/css">
|
||||
td { text-align: left; }
|
||||
.notstarted { opacity: 60%; }
|
||||
.nothingtodo {
|
||||
background-color: #99FF99;
|
||||
font-style: italic;
|
||||
@ -11,41 +9,23 @@
|
||||
background-color: #FFFF99;
|
||||
font-style: italic;
|
||||
}
|
||||
.inreview { background-color: #FFFF99; }
|
||||
.partial {
|
||||
background-color: #2CCCFF;
|
||||
font-style: italic;
|
||||
}
|
||||
.complete { background-color: #99FF99; }
|
||||
.chrono { background-color: #D8BFD8; }
|
||||
.format { background-color: #FFE4B5; }
|
||||
.ranges { background-color: #7FFFD4; }
|
||||
.spaceship { background-color: #B0E0E6; }
|
||||
</style>
|
||||
|
||||
.. role:: notstarted
|
||||
.. role:: nothingtodo
|
||||
.. role:: inprogress
|
||||
.. role:: inreview
|
||||
.. role:: partial
|
||||
.. role:: complete
|
||||
|
||||
.. |Not Started| replace:: :notstarted:`Not Started`
|
||||
|
||||
.. |Nothing To Do| replace:: :nothingtodo:`Nothing To Do`
|
||||
.. |In Progress| replace:: :inprogress:`In Progress`
|
||||
.. |Review| replace:: :inreview:`Review`
|
||||
.. |Partial| replace:: :partial:`Partial`
|
||||
.. |Complete| replace:: :complete:`Complete`
|
||||
|
||||
.. role:: chrono
|
||||
.. role:: format
|
||||
.. role:: ranges
|
||||
.. role:: spaceship
|
||||
|
||||
.. |chrono| replace:: :chrono:`chrono`
|
||||
.. |format| replace:: :format:`format`
|
||||
.. |ranges| replace:: :ranges:`ranges`
|
||||
.. |spaceship| replace:: :spaceship:`spaceship`
|
||||
|
||||
.. |sect| unicode:: U+00A7
|
||||
.. |hellip| unicode:: U+2026
|
||||
|
37
docs/Makefile.sphinx
Normal file
37
docs/Makefile.sphinx
Normal file
@ -0,0 +1,37 @@
|
||||
# Makefile for Sphinx documentation
|
||||
#
|
||||
# FIXME: This hack is only in place to allow the libcxx.llvm.org/docs builder
|
||||
# to work with libcxx. This should be removed when that builder supports
|
||||
# out-of-tree builds.
|
||||
|
||||
# You can set these variables from the command line.
|
||||
SPHINXOPTS = -n -W -v
|
||||
SPHINXBUILD = sphinx-build
|
||||
PAPER =
|
||||
BUILDDIR = _build
|
||||
|
||||
# Internal variables.
|
||||
PAPEROPT_a4 = -D latex_paper_size=a4
|
||||
PAPEROPT_letter = -D latex_paper_size=letter
|
||||
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
|
||||
# the i18n builder cannot share the environment and doctrees with the others
|
||||
I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
|
||||
|
||||
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext default
|
||||
|
||||
default: html
|
||||
|
||||
help:
|
||||
@echo "Please use \`make <target>' where <target> is one of"
|
||||
@echo " html to make standalone HTML files"
|
||||
|
||||
clean:
|
||||
-rm -rf $(BUILDDIR)/*
|
||||
|
||||
html:
|
||||
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
|
||||
@echo
|
||||
@# FIXME: Remove this `cp` once HTML->Sphinx transition is completed.
|
||||
@# Kind of a hack, but HTML-formatted docs are on the way out anyway.
|
||||
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
|
||||
|
@ -1,5 +1,5 @@
|
||||
=========================================
|
||||
Libc++ 14.0.0 (In-Progress) Release Notes
|
||||
Libc++ 13.0.0 Release Notes
|
||||
=========================================
|
||||
|
||||
.. contents::
|
||||
@ -8,17 +8,11 @@ Libc++ 14.0.0 (In-Progress) Release Notes
|
||||
|
||||
Written by the `Libc++ Team <https://libcxx.llvm.org>`_
|
||||
|
||||
.. warning::
|
||||
|
||||
These are in-progress notes for the upcoming libc++ 14 release.
|
||||
Release notes for previous releases can be found on
|
||||
`the Download Page <https://releases.llvm.org/download.html>`_.
|
||||
|
||||
Introduction
|
||||
============
|
||||
|
||||
This document contains the release notes for the libc++ C++ Standard Library,
|
||||
part of the LLVM Compiler Infrastructure, release 14.0.0. Here we describe the
|
||||
part of the LLVM Compiler Infrastructure, release 13.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 <https://llvm.org/docs/ReleaseNotes.html>`_. All LLVM releases may
|
||||
@ -32,214 +26,79 @@ 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 <https://llvm.org/releases/>`_.
|
||||
|
||||
What's New in Libc++ 14.0.0?
|
||||
What's New in Libc++ 13.0.0?
|
||||
============================
|
||||
|
||||
- Support for older compilers has been removed. Several additional platforms
|
||||
are now officially supported. :ref:`platform_and_compiler_support` contains
|
||||
the complete overview of platforms and compilers supported by libc++.
|
||||
- The large headers ``<algorithm>``, ``<iterator>``, and ``<utility>`` have
|
||||
been split in more granular headers. This reduces the size of included code
|
||||
when using libc++. This may lead to missing includes after upgrading to
|
||||
libc++13.
|
||||
|
||||
New Features
|
||||
------------
|
||||
|
||||
- There's support for the C++20 header ``<format>``. Some parts are still
|
||||
missing, most notably the compile-time format string validation. Some
|
||||
functions are known to be inefficient, both in memory usage and performance.
|
||||
The implementation isn't API- or ABI-stable and therefore considered
|
||||
experimental. (Some not-yet-implemented papers require an API-break.)
|
||||
As a result, it is disabled by default, however vendors can enable the
|
||||
header by using ``-DLIBCXX_ENABLE_INCOMPLETE_FEATURES=ON`` when
|
||||
configuring their build.
|
||||
- ``std::filesystem`` is now feature complete for the Windows platform using
|
||||
MinGW. MSVC isn't supported since it lacks 128-bit integer support.
|
||||
- The implementation of the C++20 concepts library has been completed.
|
||||
- Several C++20 ``constexpr`` papers have been completed:
|
||||
|
||||
- More parts of ``<ranges>`` have been implemented. Since we still expect to make
|
||||
some API and ABI breaking changes, those are disabled by default. However,
|
||||
vendors that wish to enable ``<ranges>`` in their distribution may do so
|
||||
by defining ``-DLIBCXX_ENABLE_INCOMPLETE_FEATURES=ON`` when configuring
|
||||
their build.
|
||||
|
||||
- There's a new CMake option ``LIBCXX_ENABLE_UNICODE`` to disable Unicode
|
||||
support in the ``<format>`` header. This only affects the estimation of the
|
||||
output width of the format functions.
|
||||
|
||||
- Support for building libc++ on top of a C Standard Library that does not support ``wchar_t`` was
|
||||
added. This is useful for building libc++ in an embedded setting, and it adds itself to the various
|
||||
freestanding-friendly options provided by libc++.
|
||||
|
||||
- Defining ``_LIBCPP_DEBUG`` to ``1`` enables the randomization of unspecified
|
||||
behavior in standard algorithms (e.g. the ordering of equal elements in ``std::sort``, or
|
||||
the ordering of both sides of the partition in ``std::nth_element``).
|
||||
|
||||
- Floating-point support for ``std::to_chars`` support has been added.
|
||||
Thanks to Stephan T. Lavavej and Microsoft for providing their implementation
|
||||
to libc++.
|
||||
|
||||
- The C++20 ``<coroutine>`` implementation has been completed.
|
||||
- `P0879R0 <https://wg21.link/P0879R0>`_ ``constexpr`` for ``std::swap()``
|
||||
and swap related functions
|
||||
- `P1032R1 <https://wg21.link/P1032R1>`_ Misc ``constexpr`` bits
|
||||
- `P0883 <https://wg21.link/P0883>`_ Fixing Atomic Initialization
|
||||
|
||||
- More C++20 features have been implemented. :doc:`Status/Cxx20` has the full
|
||||
overview of libc++'s C++20 implementation status.
|
||||
- More C++2b features have been implemented. :doc:`Status/Cxx2b` has the
|
||||
full overview of libc++'s C++2b implementation status.
|
||||
- The CMake option ``LIBCXX_ENABLE_INCOMPLETE_FEATURES`` has been added. This
|
||||
option allows libc++ vendors to disable headers that aren't production
|
||||
quality yet. Currently, turning the option off disables the headers
|
||||
``<format>`` and ``<ranges>``.
|
||||
- The documentation conversion from html to restructured text has been
|
||||
completed.
|
||||
|
||||
- More C++2b features have been implemented. :doc:`Status/Cxx2b` has the full
|
||||
overview of libc++'s C++2b implementation status.
|
||||
API and ABI Changes
|
||||
-------------------
|
||||
|
||||
- 16-bit ``wchar_t`` handling added for ``codecvt_utf8``, ``codecvt_utf16`` and
|
||||
``codecvt_utf8_utf16``.
|
||||
- There has been several changes in the tuple constructors provided by libc++.
|
||||
Those changes were made as part of an effort to regularize libc++'s tuple
|
||||
implementation, which contained several subtle bugs due to these extensions.
|
||||
If you notice a build breakage when initializing a tuple, make sure you
|
||||
properly initialize all the tuple elements - this is probably the culprit.
|
||||
|
||||
API Changes
|
||||
-----------
|
||||
In particular, the extension allowing tuples to be constructed from fewer
|
||||
elements than the number of elements in the tuple (in which case the remaining
|
||||
elements would be default-constructed) has been removed. See https://godbolt.org/z/sqozjd.
|
||||
|
||||
- The functions ``std::atomic<T*>::fetch_(add|sub)`` and
|
||||
``std::atomic_fetch_(add|sub)`` no longer accept a function pointer. While
|
||||
this is technically an API break, the invalid syntax isn't supported by
|
||||
libstdc++ and MSVC STL. See https://godbolt.org/z/49fvzz98d.
|
||||
Also, the extension allowing a tuple to be constructed from an array has been
|
||||
removed. See https://godbolt.org/z/5esqbW.
|
||||
|
||||
- The call of the functions ``std::atomic_(add|sub)(std::atomic<T*>*, ...)``
|
||||
with the explicit template argument ``T`` are now ill-formed. While this is
|
||||
technically an API break, the invalid syntax isn't supported by libstdc++ and
|
||||
MSVC STL. See https://godbolt.org/z/v9959re3v.
|
||||
- The ``std::pointer_safety`` utility and related functions are not available
|
||||
in C++03 anymore. Furthermore, in other standard modes, it has changed from
|
||||
a struct to a scoped enumeration, which is an ABI break. Finally, the
|
||||
``std::get_pointer_safety`` function was previously in the dylib, but it
|
||||
is now defined as inline in the headers.
|
||||
|
||||
Due to this change it's now possible to call these functions with the
|
||||
explicit template argument ``T*``. This allows using the same syntax on the
|
||||
major Standard library implementations.
|
||||
See https://godbolt.org/z/oEfzPhTTb.
|
||||
While this is technically both an API and an ABI break, we do not expect
|
||||
``std::pointer_safety`` to have been used at all in real code, since we
|
||||
never implemented the underlying support for garbage collection.
|
||||
|
||||
Calls to these functions where the template argument was deduced by the
|
||||
compiler are unaffected by this change.
|
||||
- The `LIBCXXABI_ENABLE_PIC` CMake option was removed. If you are building your
|
||||
own libc++abi from source and were using `LIBCXXABI_ENABLE_PIC`, please use
|
||||
`CMAKE_POSITION_INDEPENDENT_CODE=ON` instead.
|
||||
|
||||
- The functions ``std::allocator<T>::allocate`` and
|
||||
``std::experimental::pmr::polymorphic_allocator<T>::allocate`` now throw
|
||||
an exception of type ``std::bad_array_new_length`` when the requested size
|
||||
exceeds the maximum supported size, as required by the C++ standard.
|
||||
Previously the type ``std::length_error`` was used.
|
||||
- When the header <variant> is included, it will no longer include <array> transitively.
|
||||
|
||||
- Removed the nonstandard methods ``std::chrono::file_clock::to_time_t`` and
|
||||
``std::chrono::file_clock::from_time_t``; neither libstdc++ nor MSVC STL
|
||||
had such methods. Instead, in C++20, you can use ``std::chrono::file_clock::from_sys``
|
||||
and ``std::chrono::file_clock::to_sys``, which are specified in the Standard.
|
||||
If you are not using C++20, you should move to it.
|
||||
- The ``std::result_of`` and ``std::is_literal_type`` type traits have been removed in
|
||||
C++20 mode.
|
||||
|
||||
- The declarations of functions ``declare_reachable``, ``undeclare_reachable``, ``declare_no_pointers``,
|
||||
``undeclare_no_pointers``, and ``get_pointer_safety`` have been removed not only from C++2b but
|
||||
from all modes. Their symbols are still provided by the dynamic library for the benefit of
|
||||
existing compiled code. All of these functions have always behaved as no-ops.
|
||||
|
||||
- ``std::filesystem::path::iterator``, which (in our implementation) stashes
|
||||
a ``path`` value inside itself similar to ``istream_iterator``, now sets its
|
||||
``reference`` type to ``path`` and its ``iterator_category`` to ``input_iterator_tag``,
|
||||
so that it is a conforming input iterator in C++17 and a conforming
|
||||
``std::bidirectional_iterator`` in C++20. Before this release, it had set its
|
||||
``reference`` type to ``const path&`` and its ``iterator_category`` to
|
||||
``bidirectional_iterator_tag``, making it a non-conforming bidirectional iterator.
|
||||
After this change, ``for`` loops of the form ``for (auto& c : path)`` must be rewritten
|
||||
as either ``for (auto&& c : path)`` or ``for (const auto& c : path)``.
|
||||
``std::reverse_iterator<path::iterator>`` is no longer rejected.
|
||||
|
||||
- Removed the nonstandard default constructor from ``std::chrono::month_weekday``.
|
||||
You must now explicitly initialize with a ``chrono::month`` and
|
||||
``chrono::weekday_indexed`` instead of "meh, whenever".
|
||||
|
||||
- C++20 requires that ``std::basic_string::reserve(n)`` never reduce the capacity
|
||||
of the string. (For that, use ``shrink_to_fit()``.) Prior to this release, libc++'s
|
||||
``std::basic_string::reserve(n)`` could reduce capacity in C++17 and before, but
|
||||
not in C++20 and later. This caused ODR violations when mixing code compiled under
|
||||
different Standard modes. After this change, libc++'s ``std::basic_string::reserve(n)``
|
||||
never reduces capacity, even in C++17 and before.
|
||||
C++20 deprecates the zero-argument overload of ``std::basic_string::reserve()``,
|
||||
but specifically permits it to reduce capacity. To avoid breaking existing code
|
||||
assuming that ``std::basic_string::reserve()`` will shrink, libc++ maintains
|
||||
the behavior to shrink, even though that makes ``std::basic_string::reserve()`` not
|
||||
a synonym for ``std::basic_string::reserve(0)`` in any Standard mode anymore.
|
||||
|
||||
- The ``<experimental/coroutine>`` header is deprecated, as is any
|
||||
use of coroutines without C++20. Use C++20's ``<coroutine>`` header
|
||||
instead. The ``<experimental/coroutine>`` header will be removed
|
||||
in LLVM 16.
|
||||
|
||||
- ``_VSTD`` is now an alias for ``std`` instead of ``std::_LIBCPP_ABI_NAMESPACE``.
|
||||
This is technically not a functional change, except for folks that might have been
|
||||
using ``_VSTD`` in creative ways (which has never been officially supported).
|
||||
|
||||
ABI Changes
|
||||
-----------
|
||||
|
||||
- The C++17 variable templates ``is_error_code_enum_v`` and
|
||||
``is_error_condition_enum_v`` are now of type ``bool`` instead of ``size_t``.
|
||||
|
||||
- The C++03 emulation type for ``std::nullptr_t`` has been removed in favor of
|
||||
using ``decltype(nullptr)`` in all standard modes. This is an ABI break for
|
||||
anyone compiling in C++03 mode and who has ``std::nullptr_t`` as part of their
|
||||
ABI. However, previously, these users' ABI would be incompatible with any other
|
||||
binary or static archive compiled with C++11 or later. If you start seeing linker
|
||||
errors involving ``std::nullptr_t`` against previously compiled binaries, this may
|
||||
be the cause. You can define the ``_LIBCPP_ABI_USE_CXX03_NULLPTR_EMULATION`` macro
|
||||
to return to the previous behavior. That macro will be removed in LLVM 15. Please
|
||||
comment `on D109459 <https://reviews.llvm.org/D109459>`_ if you are broken by this change
|
||||
and need to define the macro.
|
||||
|
||||
- On Apple platforms, ``std::random_device`` is now implemented on top of ``arc4random()``
|
||||
instead of reading from ``/dev/urandom``. Any implementation-defined token used when
|
||||
constructing a ``std::random_device`` will now be ignored instead of interpreted as a
|
||||
file to read entropy from.
|
||||
|
||||
- ``std::lognormal_distribution::param_type`` used to store a data member of type
|
||||
``std::normal_distribution``; now this member is stored in the ``lognormal_distribution``
|
||||
class itself, and the ``param_type`` stores only the mean and standard deviation,
|
||||
as required by the Standard. This changes ``sizeof(std::lognormal_distribution::param_type)``.
|
||||
You can define the ``_LIBCPP_ABI_OLD_LOGNORMAL_DISTRIBUTION`` macro to return to the
|
||||
previous behavior. That macro will be removed in LLVM 15. Please comment
|
||||
`on PR52906 <https://llvm.org/PR52906>`_ if you are broken by this change and need to
|
||||
define the macro.
|
||||
|
||||
Build System Changes
|
||||
--------------------
|
||||
|
||||
- Building the libc++ shared or static library requires a C++ 20 capable compiler.
|
||||
Consider using a Bootstrapping build to build libc++ with a fresh Clang if you
|
||||
can't use the system compiler to build libc++ anymore.
|
||||
|
||||
- Historically, there have been numerous ways of building libc++, libc++abi, and libunwind.
|
||||
This has led to at least 5 different ways to build the runtimes, which was impossible to
|
||||
maintain with a good level of support. Starting with this release, libc++, libc++abi, and
|
||||
libunwind support exactly two ways of being built, which should cater to all use-cases.
|
||||
Furthermore, these builds are as lightweight as possible and will work consistently even
|
||||
when targeting embedded platforms, which used not to be the case. :doc:`BuildingLibcxx`
|
||||
describes those two ways of building. Please migrate over to the appropriate build
|
||||
instructions as soon as possible.
|
||||
|
||||
All other ways to build are deprecated and will not be supported in the next release.
|
||||
We understand that making these changes can be daunting. For that reason, here's a
|
||||
summary of how to migrate from the two most common ways to build:
|
||||
|
||||
- If you were rooting your CMake invocation at ``<monorepo>/llvm`` and passing ``-DLLVM_ENABLE_PROJECTS=<...>``
|
||||
(which was the previously advertised way to build the runtimes), please simply root your CMake invocation at
|
||||
``<monorepo>/runtimes`` and pass ``-DLLVM_ENABLE_RUNTIMES=<...>``.
|
||||
|
||||
- If you were doing multiple CMake invocations, e.g. one rooted at ``<monorepo>/libcxx`` and one rooted
|
||||
at ``<monorepo>/libcxxabi`` (this used to be called a "Standalone build"), please move them to a
|
||||
single invocation like so:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ cmake -S <monorepo>/libcxx -B libcxx-build <LIBCXX-OPTIONS>
|
||||
$ cmake -S <monorepo>/libcxxabi -B libcxxabi-build <LIBCXXABI-OPTIONS>
|
||||
|
||||
should become
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ cmake -S <monorepo>/runtimes -B build -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi" <LIBCXX-OPTIONS> <LIBCXXABI-OPTIONS>
|
||||
|
||||
- Support for building the runtimes using the GCC 32 bit multilib flag (``-m32``) has been removed. Support
|
||||
for this had been flaky for a while, and we didn't know of anyone depending on this. Instead, please perform
|
||||
a normal cross-compilation of the runtimes using the appropriate target, such as passing the following to
|
||||
your bootstrapping build:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
-DLLVM_RUNTIME_TARGETS=i386-unknown-linux
|
||||
|
||||
- Libc++, libc++abi, and libunwind will not be built with ``-fPIC`` by default anymore.
|
||||
If you want to build those runtimes with position-independent code, please specify
|
||||
``-DCMAKE_POSITION_INDEPENDENT_CODE=ON`` explicitly when configuring the build, or
|
||||
``-DRUNTIMES_<target-name>_CMAKE_POSITION_INDEPENDENT_CODE=ON`` if using the
|
||||
bootstrapping build.
|
||||
|
||||
- The ``{LIBCXX,LIBCXXABI,LIBUNWIND}_TARGET_TRIPLE``, ``{LIBCXX,LIBCXXABI,LIBUNWIND}_SYSROOT`` and
|
||||
``{LIBCXX,LIBCXXABI,LIBUNWIND}_GCC_TOOLCHAIN`` CMake variables are deprecated. Instead, please use
|
||||
the ``CMAKE_CXX_COMPILER_TARGET``, ``CMAKE_SYSROOT`` and ``CMAKE_CXX_COMPILER_EXTERNAL_TOOLCHAIN``
|
||||
variables provided by CMake.
|
||||
- The C++20 type ``std::counted_semaphore<N>`` is now based on ``std::atomic``
|
||||
on all platforms, and does not use "native" semaphores such as pthreads
|
||||
``sem_t`` even on platforms that would support them. This changes the layout
|
||||
of ``counted_semaphore<N>`` notably on Linux, so it is an ABI break on that
|
||||
platform. This change is needed to conform to the Standard, which requires
|
||||
``counted_semaphore``'s constructor to be constexpr.
|
||||
|
@ -48,3 +48,5 @@ Library Working Group Issues Status
|
||||
:file: Cxx14Issues.csv
|
||||
:header-rows: 1
|
||||
:widths: auto
|
||||
|
||||
Last Updated: 25-Mar-2014
|
||||
|
@ -40,7 +40,7 @@ Paper Status
|
||||
|
||||
.. note::
|
||||
|
||||
.. [#note-P0067] P0067: ``std::(to|from)_chars`` for integrals has been available since version 7.0. ``std::to_chars`` for ``float`` and ``double`` since version 14.0 ``std::to_chars`` for ``long double`` uses the implementation for ``double``.
|
||||
.. [#note-P0433] P0433: So far, only the ``<string>``, sequence containers, container adaptors and ``<regex>`` portions of P0433 have been implemented.
|
||||
.. [#note-P0607] P0607: The parts of P0607 that are not done are the ``<regex>`` bits.
|
||||
|
||||
|
||||
@ -53,3 +53,5 @@ Library Working Group Issues Status
|
||||
:file: Cxx17Issues.csv
|
||||
:header-rows: 1
|
||||
:widths: auto
|
||||
|
||||
Last Updated: 17-Nov-2020
|
||||
|
@ -114,7 +114,7 @@
|
||||
"`2557 <https://wg21.link/LWG2557>`__","Logical operator traits are broken in the zero-argument case","Jacksonville","|Complete|",""
|
||||
"`2558 <https://wg21.link/LWG2558>`__","[fund.ts.v2] Logical operator traits are broken in the zero-argument case","Jacksonville","|Complete|",""
|
||||
"`2559 <https://wg21.link/LWG2559>`__","Error in LWG 2234's resolution","Jacksonville","|Complete|",""
|
||||
"`2560 <https://wg21.link/LWG2560>`__","``is_constructible``\ underspecified when applied to a function type","Jacksonville","|Complete|",""
|
||||
"`2560 <https://wg21.link/LWG2560>`__","``is_constructible``\ underspecified when applied to a function type","Jacksonville","Broken in 3.6; See r261653.",""
|
||||
"`2565 <https://wg21.link/LWG2565>`__","``std::function``\ 's move constructor should guarantee nothrow for ``reference_wrapper``\ s and function pointers","Jacksonville","|Complete|",""
|
||||
"`2566 <https://wg21.link/LWG2566>`__","Requirements on the first template parameter of container adaptors","Jacksonville","|Complete|",""
|
||||
"`2571 <https://wg21.link/LWG2571>`__","|sect|\ [map.modifiers]/2 imposes nonsensical requirement on ``insert(InputIterator, InputIterator)``\ ","Jacksonville","|Complete|",""
|
||||
|
|
@ -71,7 +71,7 @@
|
||||
"`P0394r4 <https://wg21.link/P0394r4>`__","LWG","Hotel Parallelifornia: terminate() for Parallel Algorithms Exception Handling","Oulu","",""
|
||||
"","","","","",""
|
||||
"`P0003R5 <https://wg21.link/P0003R5>`__","LWG","Removing Deprecated Exception Specifications from C++17","Issaquah","|Complete|","5.0"
|
||||
"`P0067R5 <https://wg21.link/P0067R5>`__","LWG","Elementary string conversions, revision 5","Issaquah","|Partial| [#note-P0067]",""
|
||||
"`P0067R5 <https://wg21.link/P0067R5>`__","LWG","Elementary string conversions, revision 5","Issaquah","|Partial|",""
|
||||
"`P0403R1 <https://wg21.link/P0403R1>`__","LWG","Literal suffixes for ``basic_string_view``\ ","Issaquah","|Complete|","4.0"
|
||||
"`P0414R2 <https://wg21.link/P0414R2>`__","LWG","Merging shared_ptr changes from Library Fundamentals to C++17","Issaquah","|Complete|","11.0"
|
||||
"`P0418R2 <https://wg21.link/P0418R2>`__","LWG","Fail or succeed: there is no atomic lattice","Issaquah","",""
|
||||
@ -94,14 +94,14 @@
|
||||
"`P0298R3 <https://wg21.link/P0298R3>`__","CWG","A byte type definition","Kona","|Complete|","5.0"
|
||||
"`P0317R1 <https://wg21.link/P0317R1>`__","LWG","Directory Entry Caching for Filesystem","Kona","|Complete|","7.0"
|
||||
"`P0430R2 <https://wg21.link/P0430R2>`__","LWG","File system library on non-POSIX-like operating systems","Kona","|Complete|","7.0"
|
||||
"`P0433R2 <https://wg21.link/P0433R2>`__","LWG","Toward a resolution of US7 and US14: Integrating template deduction for class templates into the standard library","Kona","|Complete|","14.0"
|
||||
"`P0433R2 <https://wg21.link/P0433R2>`__","LWG","Toward a resolution of US7 and US14: Integrating template deduction for class templates into the standard library","Kona","|In Progress| [#note-P0433]_","7.0"
|
||||
"`P0452R1 <https://wg21.link/P0452R1>`__","LWG","Unifying <numeric> Parallel Algorithms","Kona","",""
|
||||
"`P0467R2 <https://wg21.link/P0467R2>`__","LWG","Iterator Concerns for Parallel Algorithms","Kona","",""
|
||||
"`P0492R2 <https://wg21.link/P0492R2>`__","LWG","Proposed Resolution of C++17 National Body Comments for Filesystems","Kona","|Complete|","7.0"
|
||||
"`P0518R1 <https://wg21.link/P0518R1>`__","LWG","Allowing copies as arguments to function objects given to parallel algorithms in response to CH11","Kona","",""
|
||||
"`P0523R1 <https://wg21.link/P0523R1>`__","LWG","Wording for CH 10: Complexity of parallel algorithms","Kona","",""
|
||||
"`P0548R1 <https://wg21.link/P0548R1>`__","LWG","common_type and duration","Kona","|Complete|","5.0"
|
||||
"`P0558R1 <https://wg21.link/P0558R1>`__","LWG","Resolving atomic<T> named base class inconsistencies","Kona","|Complete|",""
|
||||
"`P0558R1 <https://wg21.link/P0558R1>`__","LWG","Resolving atomic<T> named base class inconsistencies","Kona","",""
|
||||
"`P0574R1 <https://wg21.link/P0574R1>`__","LWG","Algorithm Complexity Constraints and Parallel Overloads","Kona","",""
|
||||
"`P0599R1 <https://wg21.link/P0599R1>`__","LWG","noexcept for hash functions","Kona","|Complete|","5.0"
|
||||
"`P0604R0 <https://wg21.link/P0604R0>`__","LWG","Resolving GB 55, US 84, US 85, US 86","Kona","|Complete|",""
|
||||
|
|
@ -40,8 +40,7 @@ Paper Status
|
||||
|
||||
.. note::
|
||||
|
||||
.. [#note-P0600] P0600: The missing bits in P0600 are in |sect|\ [mem.res.class] and |sect|\ [mem.poly.allocator.class].
|
||||
.. [#note-P0645] P0645: The paper is implemented but still marked as an incomplete feature. Not yet implemented LWG-issues will cause API and ABI breakage.
|
||||
.. [#note-P0600] P0600: The missing bits in P0600 are in |sect|\ [mem.res.class], |sect|\ [mem.poly.allocator.class], and |sect|\ [container.node.overview].
|
||||
.. [#note-P0966] P0966: It was previously erroneously marked as complete in version 8.0. See `bug 45368 <https://llvm.org/PR45368>`__.
|
||||
.. [#note-P0619] P0619: Only sections D.8, D.9, D.10 and D.13 are implemented. Sections D.4, D.7, D.11, D.12, and D.14 remain undone.
|
||||
.. [#note-P0883] P0883: shared_ptr and floating-point changes weren't applied as they themselves aren't implemented yet.
|
||||
@ -56,3 +55,5 @@ Library Working Group Issues Status
|
||||
:file: Cxx20Issues.csv
|
||||
:header-rows: 1
|
||||
:widths: auto
|
||||
|
||||
Last Updated: 24-May-2021
|
||||
|
@ -1,4 +1,4 @@
|
||||
"Issue #","Issue Name","Meeting","Status","First released version","Labels"
|
||||
"Issue #","Issue Name","Meeting","Status","First released version"
|
||||
"`2070 <https://wg21.link/LWG2070>`__","``allocate_shared``\ should use ``allocator_traits<A>::construct``\ ","Toronto","Resolved by `P0674R1 <https://wg21.link/P0674R1>`__",""
|
||||
"`2444 <https://wg21.link/LWG2444>`__","Inconsistent complexity for ``std::sort_heap``\ ","Toronto","",""
|
||||
"`2593 <https://wg21.link/LWG2593>`__","Moved-from state of Allocators","Toronto","",""
|
||||
@ -23,7 +23,7 @@
|
||||
"`2950 <https://wg21.link/LWG2950>`__","std::byte operations are misspecified","Albuquerque","|Complete|",""
|
||||
"`2952 <https://wg21.link/LWG2952>`__","iterator_traits should work for pointers to cv T","Albuquerque","|Complete|",""
|
||||
"`2953 <https://wg21.link/LWG2953>`__","LWG 2853 should apply to deque::erase too","Albuquerque","|Complete|",""
|
||||
"`2958 <https://wg21.link/LWG2958>`__","Moves improperly defined as deleted","Albuquerque","|Complete|",""
|
||||
"`2958 <https://wg21.link/LWG2958>`__","Moves improperly defined as deleted","Albuquerque","*We already do this*",""
|
||||
"`2964 <https://wg21.link/LWG2964>`__","Apparently redundant requirement for dynamic_pointer_cast","Albuquerque","",""
|
||||
"`2965 <https://wg21.link/LWG2965>`__","Non-existing path::native_string() in filesystem_error::what() specification","Albuquerque","|Nothing To Do|",""
|
||||
"`2972 <https://wg21.link/LWG2972>`__","What is ``is_trivially_destructible_v<int>``\ ?","Albuquerque","|Complete|",""
|
||||
@ -32,12 +32,12 @@
|
||||
"`2978 <https://wg21.link/LWG2978>`__","Hash support for pmr::string and friends","Albuquerque","",""
|
||||
"`2979 <https://wg21.link/LWG2979>`__","aligned_union should require complete object types","Albuquerque","|Complete|",""
|
||||
"`2980 <https://wg21.link/LWG2980>`__","Cannot compare_exchange empty pointers","Albuquerque","",""
|
||||
"`2981 <https://wg21.link/LWG2981>`__","Remove redundant deduction guides from standard library","Albuquerque","|Nothing To Do|",""
|
||||
"`2981 <https://wg21.link/LWG2981>`__","Remove redundant deduction guides from standard library","Albuquerque","",""
|
||||
"`2982 <https://wg21.link/LWG2982>`__","Making size_type consistent in associative container deduction guides","Albuquerque","",""
|
||||
"`2988 <https://wg21.link/LWG2988>`__","Clause 32 cleanup missed one typename","Albuquerque","|Complete|","13.0"
|
||||
"`2988 <https://wg21.link/LWG2988>`__","Clause 32 cleanup missed one typename","Albuquerque","",""
|
||||
"`2993 <https://wg21.link/LWG2993>`__","reference_wrapper<T> conversion from T&&","Albuquerque","|Complete|","13.0"
|
||||
"`2998 <https://wg21.link/LWG2998>`__","Requirements on function objects passed to {``forward_``,}list-specific algorithms","Albuquerque","|Nothing To Do|",""
|
||||
"`3001 <https://wg21.link/LWG3001>`__","weak_ptr::element_type needs remove_extent_t","Albuquerque","|Complete|","14.0"
|
||||
"`3001 <https://wg21.link/LWG3001>`__","weak_ptr::element_type needs remove_extent_t","Albuquerque","",""
|
||||
"`3024 <https://wg21.link/LWG3024>`__","variant's copies must be deleted instead of disabled via SFINAE","Albuquerque","|Complete|",""
|
||||
"","","","",""
|
||||
"`2164 <https://wg21.link/LWG2164>`__","What are the semantics of ``vector.emplace(vector.begin(), vector.back())``\ ?","Jacksonville","|Complete|",""
|
||||
@ -70,7 +70,7 @@
|
||||
"`3041 <https://wg21.link/LWG3041>`__","Unnecessary ``decay``\ in ``reference_wrapper``\ ","Jacksonville","|Complete|",""
|
||||
"`3042 <https://wg21.link/LWG3042>`__","``is_literal_type_v``\ should be inline","Jacksonville","|Complete|",""
|
||||
"`3043 <https://wg21.link/LWG3043>`__","Bogus postcondition for ``filesystem_error``\ constructor","Jacksonville","|Complete|",""
|
||||
"`3045 <https://wg21.link/LWG3045>`__","``atomic<floating-point>``\ doesn't have ``value_type``\ or ``difference_type``\ ","Jacksonville","",""
|
||||
"`3045 <https://wg21.link/LWG3045>`__","``atomic<*floating-point*>``\ doesn't have ``value_type``\ or ``difference_type``\ ","Jacksonville","",""
|
||||
"`3048 <https://wg21.link/LWG3048>`__","``transform_reduce(exec, first1, last1, first2, init)``\ discards execution policy","Jacksonville","",""
|
||||
"`3051 <https://wg21.link/LWG3051>`__","Floating point classifications were inadvertently changed in P0175","Jacksonville","|Nothing To Do|",""
|
||||
"`3075 <https://wg21.link/LWG3075>`__","``basic_string``\ needs deduction guides from ``basic_string_view``\ ","Jacksonville","|Complete|",""
|
||||
@ -108,14 +108,14 @@
|
||||
"`3025 <https://wg21.link/LWG3025>`__","Map-like container deduction guides should use ``pair<Key, T>``\ , not ``pair<const Key, T>``\ ","San Diego","|Complete|",""
|
||||
"`3031 <https://wg21.link/LWG3031>`__","Algorithms and predicates with non-const reference arguments","San Diego","",""
|
||||
"`3037 <https://wg21.link/LWG3037>`__","``polymorphic_allocator``\ and incomplete types","San Diego","",""
|
||||
"`3038 <https://wg21.link/LWG3038>`__","``polymorphic_allocator::allocate``\ should not allow integer overflow to create vulnerabilities","San Diego","|Complete|","14.0"
|
||||
"`3038 <https://wg21.link/LWG3038>`__","``polymorphic_allocator::allocate``\ should not allow integer overflow to create vulnerabilities","San Diego","",""
|
||||
"`3054 <https://wg21.link/LWG3054>`__","``uninitialized_copy``\ appears to not be able to meet its exception-safety guarantee","San Diego","",""
|
||||
"`3065 <https://wg21.link/LWG3065>`__","LWG 2989 missed that all ``path``\ 's other operators should be hidden friends as well","San Diego","|Complete|",""
|
||||
"`3096 <https://wg21.link/LWG3096>`__","``path::lexically_relative``\ is confused by trailing slashes","San Diego","|Complete|",""
|
||||
"`3116 <https://wg21.link/LWG3116>`__","``OUTERMOST_ALLOC_TRAITS``\ needs ``remove_reference_t``\ ","San Diego","",""
|
||||
"`3116 <https://wg21.link/LWG3116>`__","``*OUTERMOST_ALLOC_TRAITS*``\ needs ``remove_reference_t``\ ","San Diego","",""
|
||||
"`3122 <https://wg21.link/LWG3122>`__","``__cpp_lib_chrono_udls``\ was accidentally dropped","San Diego","|Complete|",""
|
||||
"`3127 <https://wg21.link/LWG3127>`__","``basic_osyncstream::rdbuf``\ needs a ``const_cast``\ ","San Diego","",""
|
||||
"`3128 <https://wg21.link/LWG3128>`__","``strstream::rdbuf``\ needs a ``const_cast``\ ","San Diego","|Nothing To Do|",""
|
||||
"`3127 <https://wg21.link/LWG3127>`__","``basic_osyncstream::rdbuf``\ needs a ````const_cast````\ ","San Diego","",""
|
||||
"`3128 <https://wg21.link/LWG3128>`__","``strstream::rdbuf``\ needs a ````const_cast````\ ","San Diego","|Nothing To Do|",""
|
||||
"`3129 <https://wg21.link/LWG3129>`__","``regex_token_iterator``\ constructor uses wrong pointer arithmetic","San Diego","",""
|
||||
"`3130 <https://wg21.link/LWG3130>`__","|sect|\ [input.output] needs many ``addressof``\ ","San Diego","",""
|
||||
"`3131 <https://wg21.link/LWG3131>`__","``addressof``\ all the things","San Diego","",""
|
||||
@ -125,7 +125,7 @@
|
||||
"`3145 <https://wg21.link/LWG3145>`__","``file_clock``\ breaks ABI for C++17 implementations","San Diego","|Complete|",""
|
||||
"`3147 <https://wg21.link/LWG3147>`__","Definitions of ""likely"" and ""unlikely"" are likely to cause problems","San Diego","",""
|
||||
"`3148 <https://wg21.link/LWG3148>`__","``<concepts>``\ should be freestanding","San Diego","",""
|
||||
"`3153 <https://wg21.link/LWG3153>`__","``Common``\ and ``common_type``\ have too little in common","San Diego","|Complete|","13.0"
|
||||
"`3153 <https://wg21.link/LWG3153>`__","``Common``\ and ``common_type``\ have too little in common","San Diego","",""
|
||||
"`3154 <https://wg21.link/LWG3154>`__","``Common``\ and ``CommonReference``\ have a common defect","San Diego","",""
|
||||
"","","","",""
|
||||
"`3012 <https://wg21.link/LWG3012>`__","``atomic<T>``\ is unimplementable for non-``is_trivially_copy_constructible T``\ ","Kona","",""
|
||||
@ -136,22 +136,22 @@
|
||||
"`3112 <https://wg21.link/LWG3112>`__","``system_error``\ and ``filesystem_error``\ constructors taking a ``string``\ may not be able to meet their postconditions","Kona","",""
|
||||
"`3119 <https://wg21.link/LWG3119>`__","Program-definedness of closure types","Kona","|Nothing To Do|",""
|
||||
"`3133 <https://wg21.link/LWG3133>`__","Modernizing numeric type requirements","Kona","",""
|
||||
"`3144 <https://wg21.link/LWG3144>`__","``span``\ does not have a ``const_pointer``\ typedef","Kona","|Complete|",""
|
||||
"`3173 <https://wg21.link/LWG3173>`__","Enable CTAD for ``ref-view``\ ","Kona","","","|ranges|"
|
||||
"`3179 <https://wg21.link/LWG3179>`__","``subrange``\ should always model ``Range``\ ","Kona","","","|ranges|"
|
||||
"`3180 <https://wg21.link/LWG3180>`__","Inconsistently named return type for ``ranges::minmax_element``\ ","Kona","","","|ranges|"
|
||||
"`3144 <https://wg21.link/LWG3144>`__","``span``\ does not have a ````const_pointer````\ typedef","Kona","|Complete|",""
|
||||
"`3173 <https://wg21.link/LWG3173>`__","Enable CTAD for *``ref-view``*\ ","Kona","",""
|
||||
"`3179 <https://wg21.link/LWG3179>`__","``subrange``\ should always model ``Range``\ ","Kona","",""
|
||||
"`3180 <https://wg21.link/LWG3180>`__","Inconsistently named return type for ``ranges::minmax_element``\ ","Kona","",""
|
||||
"`3182 <https://wg21.link/LWG3182>`__","Specification of ``Same``\ could be clearer","Kona","",""
|
||||
"","","","",""
|
||||
"`2899 <https://wg21.link/LWG2899>`__","``is_(nothrow_)move_constructible``\ and ``tuple``\ , ``optional``\ and ``unique_ptr``\ ","Cologne","",""
|
||||
"`3055 <https://wg21.link/LWG3055>`__","``path::operator+=(*single-character*)``\ misspecified","Cologne","|Complete|","7.0"
|
||||
"`3158 <https://wg21.link/LWG3158>`__","``tuple(allocator_arg_t, const Alloc&)``\ should be conditionally explicit","Cologne","|Complete|","10.0"
|
||||
"`3169 <https://wg21.link/LWG3169>`__","``ranges``\ permutation generators discard useful information","Cologne","","","|ranges|"
|
||||
"`3183 <https://wg21.link/LWG3183>`__","Normative permission to specialize Ranges variable templates","Cologne","","","|ranges|"
|
||||
"`3158 <https://wg21.link/LWG3158>`__","``tuple(allocator_arg_t, const Alloc&)``\ should be conditionally explicit","Cologne","",""
|
||||
"`3169 <https://wg21.link/LWG3169>`__","``ranges``\ permutation generators discard useful information","Cologne","",""
|
||||
"`3183 <https://wg21.link/LWG3183>`__","Normative permission to specialize Ranges variable templates","Cologne","",""
|
||||
"`3184 <https://wg21.link/LWG3184>`__","Inconsistencies in ``bind_front``\ wording","Cologne","|Complete|","13.0"
|
||||
"`3185 <https://wg21.link/LWG3185>`__","Uses-allocator construction functions missing ``constexpr``\ and ``noexcept``\ ","Cologne","",""
|
||||
"`3186 <https://wg21.link/LWG3186>`__","``ranges``\ removal, partition, and ``partial_sort_copy``\ algorithms discard useful information","Cologne","","","|ranges|"
|
||||
"`3186 <https://wg21.link/LWG3186>`__","``ranges``\ removal, partition, and ``partial_sort_copy``\ algorithms discard useful information","Cologne","",""
|
||||
"`3187 <https://wg21.link/LWG3187>`__","`P0591R4 <https://wg21.link/p0591r4>`__ reverted DR 2586 fixes to ``scoped_allocator_adaptor::construct()``\ ","Cologne","",""
|
||||
"`3191 <https://wg21.link/LWG3191>`__","``std::ranges::shuffle``\ synopsis does not match algorithm definition","Cologne","","","|ranges|"
|
||||
"`3191 <https://wg21.link/LWG3191>`__","``std::ranges::shuffle``\ synopsis does not match algorithm definition","Cologne","",""
|
||||
"`3196 <https://wg21.link/LWG3196>`__","``std::optional<T>``\ is ill-formed is ``T``\ is an array","Cologne","|Complete|",""
|
||||
"`3198 <https://wg21.link/LWG3198>`__","Bad constraint on ``std::span::span()``\ ","Cologne","|Complete|",""
|
||||
"`3199 <https://wg21.link/LWG3199>`__","``istream >> bitset<0>``\ fails","Cologne","",""
|
||||
@ -161,140 +161,140 @@
|
||||
"`3209 <https://wg21.link/LWG3209>`__","Expression in ``year::ok()``\ returns clause is ill-formed","Cologne","|Complete|",""
|
||||
"","","","",""
|
||||
"`3231 <https://wg21.link/LWG3231>`__","``year_month_day_last::day``\ specification does not cover ``!ok()``\ values","Belfast","|Nothing To Do|",""
|
||||
"`3225 <https://wg21.link/LWG3225>`__","``zoned_time``\ converting constructor shall not be ``noexcept``\ ","Belfast","","","|chrono|"
|
||||
"`3190 <https://wg21.link/LWG3190>`__","``std::allocator::allocate``\ sometimes returns too little storage","Belfast","|Complete|","14.0"
|
||||
"`3218 <https://wg21.link/LWG3218>`__","Modifier for ``%d``\ parse flag does not match POSIX and ``format``\ specification","Belfast","","","|chrono| |format|"
|
||||
"`3224 <https://wg21.link/LWG3224>`__","``zoned_time``\ constructor from ``TimeZonePtr``\ does not specify initialization of ``tp_``\ ","Belfast","","","|chrono|"
|
||||
"`3230 <https://wg21.link/LWG3230>`__","Format specifier ``%y/%Y``\ is missing locale alternative versions","Belfast","","","|chrono| |format|"
|
||||
"`3232 <https://wg21.link/LWG3232>`__","Inconsistency in ``zoned_time``\ deduction guides","Belfast","","","|chrono|"
|
||||
"`3225 <https://wg21.link/LWG3225>`__","``zoned_time``\ converting constructor shall not be ``noexcept``\ ","Belfast","",""
|
||||
"`3190 <https://wg21.link/LWG3190>`__","``std::allocator::allocate``\ sometimes returns too little storage","Belfast","",""
|
||||
"`3218 <https://wg21.link/LWG3218>`__","Modifier for ``%d``\ parse flag does not match POSIX and ``format``\ specification","Belfast","",""
|
||||
"`3224 <https://wg21.link/LWG3224>`__","``zoned_time``\ constructor from ``TimeZonePtr``\ does not specify initialization of ``tp_``\ ","Belfast","",""
|
||||
"`3230 <https://wg21.link/LWG3230>`__","Format specifier ``%y/%Y``\ is missing locale alternative versions","Belfast","",""
|
||||
"`3232 <https://wg21.link/LWG3232>`__","Inconsistency in ``zoned_time``\ deduction guides","Belfast","",""
|
||||
"`3222 <https://wg21.link/LWG3222>`__","P0574R1 introduced preconditions on non-existent parameters","Belfast","",""
|
||||
"`3221 <https://wg21.link/LWG3221>`__","Result of ``year_month``\ arithmetic with ``months``\ is ambiguous","Belfast","|Complete|","8.0"
|
||||
"`3235 <https://wg21.link/LWG3235>`__","``parse``\ manipulator without abbreviation is not callable","Belfast","",""
|
||||
"`3246 <https://wg21.link/LWG3246>`__","What are the constraints on the template parameter of ``basic_format_arg``\ ?","Belfast","","","|format|"
|
||||
"`3246 <https://wg21.link/LWG3246>`__","What are the constraints on the template parameter of ``basic_format_arg``\ ?","Belfast","",""
|
||||
"`3253 <https://wg21.link/LWG3253>`__","``basic_syncbuf::basic_syncbuf()``\ should not be explicit","Belfast","",""
|
||||
"`3245 <https://wg21.link/LWG3245>`__","Unnecessary restriction on ``'%p'``\ parse specifier","Belfast","","","|chrono|"
|
||||
"`3245 <https://wg21.link/LWG3245>`__","Unnecessary restriction on ``'%p'``\ parse specifier","Belfast","",""
|
||||
"`3244 <https://wg21.link/LWG3244>`__","Constraints for ``Source``\ in |sect|\ [fs.path.req] insufficiently constrainty","Belfast","",""
|
||||
"`3241 <https://wg21.link/LWG3241>`__","``chrono-spec``\ grammar ambiguity in |sect|\ [time.format]","Belfast","","","|chrono| |format|"
|
||||
"`3241 <https://wg21.link/LWG3241>`__","``chrono-spec``\ grammar ambiguity in |sect|\ [time.format]","Belfast","",""
|
||||
"`3257 <https://wg21.link/LWG3257>`__","Missing feature testing macro update from P0858","Belfast","",""
|
||||
"`3256 <https://wg21.link/LWG3256>`__","Feature testing macro for ``constexpr``\ algorithms","Belfast","|Complete|","13.0"
|
||||
"`3273 <https://wg21.link/LWG3273>`__","Specify ``weekday_indexed``\ to range of ``[0, 7]``\ ","Belfast","","","|chrono|"
|
||||
"`3273 <https://wg21.link/LWG3273>`__","Specify ``weekday_indexed``\ to range of ``[0, 7]``\ ","Belfast","",""
|
||||
"`3070 <https://wg21.link/LWG3070>`__","``path::lexically_relative``\ causes surprising results if a filename can also be a *root-name*","Belfast","",""
|
||||
"`3266 <https://wg21.link/LWG3266>`__","``to_chars(bool)``\ should be deleted","Belfast","|Complete|","14.0"
|
||||
"`3272 <https://wg21.link/LWG3272>`__","``%I%p``\ should parse/format ``duration``\ since midnight","Belfast","","","|chrono| |format|"
|
||||
"`3259 <https://wg21.link/LWG3259>`__","The definition of *constexpr iterators* should be adjusted","Belfast","","","|ranges|"
|
||||
"`3266 <https://wg21.link/LWG3266>`__","``to_chars(bool)``\ should be deleted","Belfast","",""
|
||||
"`3272 <https://wg21.link/LWG3272>`__","``%I%p``\ should parse/format ``duration``\ since midnight","Belfast","",""
|
||||
"`3259 <https://wg21.link/LWG3259>`__","The definition of *constexpr iterators* should be adjusted","Belfast","",""
|
||||
"`3103 <https://wg21.link/LWG3103>`__","Errors in taking subview of ``span``\ should be ill-formed where possible","Belfast","",""
|
||||
"`3274 <https://wg21.link/LWG3274>`__","Missing feature test macro for ``<span>``\ ","Belfast","|Complete|","11.0"
|
||||
"`3276 <https://wg21.link/LWG3276>`__","Class ``split_view::outer_iterator::value_type``\ should inherit from ``view_interface``\ ","Belfast","","","|ranges|"
|
||||
"`3277 <https://wg21.link/LWG3277>`__","Pre-increment on prvalues is not a requirement of ``weakly_incrementable``\ ","Belfast","","","|ranges|"
|
||||
"`3274 <https://wg21.link/LWG3274>`__","Missing feature test macro for ``<span>``\ ","Belfast","",""
|
||||
"`3276 <https://wg21.link/LWG3276>`__","Class ``split_view::outer_iterator::value_type``\ should inherit from ``view_interface``\ ","Belfast","",""
|
||||
"`3277 <https://wg21.link/LWG3277>`__","Pre-increment on prvalues is not a requirement of ``weakly_incrementable``\ ","Belfast","",""
|
||||
"`3149 <https://wg21.link/LWG3149>`__","``DefaultConstructible``\ should require default initialization","Belfast","|Complete|","13.0"
|
||||
"","","","",""
|
||||
"`1203 <https://wg21.link/LWG1203>`__","More useful rvalue stream insertion","Prague","|Complete|","12.0"
|
||||
"`2859 <https://wg21.link/LWG2859>`__","Definition of *reachable* in [ptr.launder] misses pointer arithmetic from pointer-interconvertible object","Prague","",""
|
||||
"`3018 <https://wg21.link/LWG3018>`__","``shared_ptr``\ of function type","Prague","",""
|
||||
"`3050 <https://wg21.link/LWG3050>`__","Conversion specification problem in ``chrono::duration``\ constructor","Prague","","","|chrono|"
|
||||
"`3050 <https://wg21.link/LWG3050>`__","Conversion specification problem in ``chrono::duration``\ constructor","Prague","",""
|
||||
"`3141 <https://wg21.link/LWG3141>`__","``CopyConstructible``\ doesn't preserve source values","Prague","|Nothing to do|",""
|
||||
"`3150 <https://wg21.link/LWG3150>`__","``UniformRandomBitGenerator``\ should validate ``min``\ and ``max``\ ","Prague","|Complete|","13.0"
|
||||
"`3175 <https://wg21.link/LWG3175>`__","The ``CommonReference``\ requirement of concept ``SwappableWith``\ is not satisfied in the example","Prague","|Complete|","13.0"
|
||||
"`3194 <https://wg21.link/LWG3194>`__","``ConvertibleTo``\ prose does not match code","Prague","|Complete|","13.0"
|
||||
"`3200 <https://wg21.link/LWG3200>`__","``midpoint``\ should not constrain ``T``\ is complete","Prague","|Nothing To Do|",""
|
||||
"`3201 <https://wg21.link/LWG3201>`__","``lerp``\ should be marked as ``noexcept``\ ","Prague","|Complete|",""
|
||||
"`3226 <https://wg21.link/LWG3226>`__","``zoned_time``\ constructor from ``string_view``\ should accept ``zoned_time<Duration2, TimeZonePtr2>``\ ","Prague","","","|chrono|"
|
||||
"`3226 <https://wg21.link/LWG3226>`__","``zoned_time``\ constructor from ``string_view``\ should accept ``zoned_time<Duration2, TimeZonePtr2>``\ ","Prague","",""
|
||||
"`3233 <https://wg21.link/LWG3233>`__","Broken requirements for ``shared_ptr``\ converting constructors","Prague","",""
|
||||
"`3237 <https://wg21.link/LWG3237>`__","LWG 3038 and 3190 have inconsistent PRs","Prague","|Complete|","14.0"
|
||||
"`3237 <https://wg21.link/LWG3237>`__","LWG 3038 and 3190 have inconsistent PRs","Prague","",""
|
||||
"`3238 <https://wg21.link/LWG3238>`__","Insufficiently-defined behavior of ``std::function``\ deduction guides","Prague","",""
|
||||
"`3242 <https://wg21.link/LWG3242>`__","``std::format``\ : missing rules for ``arg-id``\ in ``width``\ and ``precision``\ ","Prague","|Complete|","Clang 14","|format|"
|
||||
"`3243 <https://wg21.link/LWG3243>`__","``std::format``\ and negative zeroes","Prague","|Complete|","14.0","|format|"
|
||||
"`3247 <https://wg21.link/LWG3247>`__","``ranges::iter_move``\ should perform ADL-only lookup of ``iter_move``\ ","Prague","","","|ranges|"
|
||||
"`3248 <https://wg21.link/LWG3248>`__","``std::format``\ ``#b``\ , ``#B``\ , ``#o``\ , ``#x``\ , and ``#X``\ presentation types misformat negative numbers","Prague","|Complete|","14.0","|format|"
|
||||
"`3250 <https://wg21.link/LWG3250>`__","``std::format``\ : ``#``\ (alternate form) for NaN and inf","Prague","|Complete|","14.0","|format|"
|
||||
"`3251 <https://wg21.link/LWG3251>`__","Are ``std::format``\ alignment specifiers applied to string arguments?","Prague","|Complete|","14.0","|format|"
|
||||
"`3252 <https://wg21.link/LWG3252>`__","Parse locale's aware modifiers for commands are not consistent with POSIX spec","Prague","","","|chrono|"
|
||||
"`3242 <https://wg21.link/LWG3242>`__","``std::format``\ : missing rules for ``arg-id``\ in ``width``\ and ``precision``\ ","Prague","",""
|
||||
"`3243 <https://wg21.link/LWG3243>`__","``std::format``\ and negative zeroes","Prague","",""
|
||||
"`3247 <https://wg21.link/LWG3247>`__","``ranges::iter_move``\ should perform ADL-only lookup of ``iter_move``\ ","Prague","",""
|
||||
"`3248 <https://wg21.link/LWG3248>`__","``std::format``\ ``#b``\ , ``#B``\ , ``#o``\ , ``#x``\ , and ``#X``\ presentation types misformat negative numbers","Prague","",""
|
||||
"`3250 <https://wg21.link/LWG3250>`__","``std::format``\ : ``#``\ (alternate form) for NaN and inf","Prague","",""
|
||||
"`3251 <https://wg21.link/LWG3251>`__","Are ``std::format``\ alignment specifiers applied to string arguments?","Prague","",""
|
||||
"`3252 <https://wg21.link/LWG3252>`__","Parse locale's aware modifiers for commands are not consistent with POSIX spec","Prague","",""
|
||||
"`3254 <https://wg21.link/LWG3254>`__","Strike ``stop_token``\ 's ``operator!=``\ ","Prague","",""
|
||||
"`3255 <https://wg21.link/LWG3255>`__","``span``\ 's ``array``\ constructor is too strict","Prague","|Complete|",""
|
||||
"`3260 <https://wg21.link/LWG3260>`__","``year_month*``\ arithmetic rejects durations convertible to years","Prague","","","|chrono|"
|
||||
"`3262 <https://wg21.link/LWG3262>`__","Formatting of negative durations is not specified","Prague","","","|chrono| |format|"
|
||||
"`3264 <https://wg21.link/LWG3264>`__","``sized_range``\ and ``ranges::size``\ redundantly use ``disable_sized_range``\ ","Prague","","","|ranges|"
|
||||
"`3269 <https://wg21.link/LWG3269>`__","Parse manipulators do not specify the result of the extraction from stream","Prague","","","|chrono|"
|
||||
"`3270 <https://wg21.link/LWG3270>`__","Parsing and formatting ``%j``\ with ``duration``\ s","Prague","","","|chrono| |format|"
|
||||
"`3280 <https://wg21.link/LWG3280>`__","View converting constructors can cause constraint recursion and are unneeded","Prague","","","|ranges|"
|
||||
"`3281 <https://wg21.link/LWG3281>`__","Conversion from ``*pair-like*``\ types to ``subrange``\ is a silent semantic promotion","Prague","","","|ranges|"
|
||||
"`3282 <https://wg21.link/LWG3282>`__","``subrange``\ converting constructor should disallow derived to base conversions","Prague","","","|ranges|"
|
||||
"`3284 <https://wg21.link/LWG3284>`__","``random_access_iterator``\ semantic constraints accidentally promote difference type using unary negate","Prague","","","|ranges|"
|
||||
"`3260 <https://wg21.link/LWG3260>`__","``year_month*``\ arithmetic rejects durations convertible to years","Prague","",""
|
||||
"`3262 <https://wg21.link/LWG3262>`__","Formatting of negative durations is not specified","Prague","",""
|
||||
"`3264 <https://wg21.link/LWG3264>`__","``sized_range``\ and ``ranges::size``\ redundantly use ``disable_sized_range``\ ","Prague","",""
|
||||
"`3269 <https://wg21.link/LWG3269>`__","Parse manipulators do not specify the result of the extraction from stream","Prague","",""
|
||||
"`3270 <https://wg21.link/LWG3270>`__","Parsing and formatting ``%j``\ with ``duration``\ s","Prague","",""
|
||||
"`3280 <https://wg21.link/LWG3280>`__","View converting constructors can cause constraint recursion and are unneeded","Prague","",""
|
||||
"`3281 <https://wg21.link/LWG3281>`__","Conversion from ``*pair-like*``\ types to ``subrange``\ is a silent semantic promotion","Prague","",""
|
||||
"`3282 <https://wg21.link/LWG3282>`__","``subrange``\ converting constructor should disallow derived to base conversions","Prague","",""
|
||||
"`3284 <https://wg21.link/LWG3284>`__","``random_access_iterator``\ semantic constraints accidentally promote difference type using unary negate","Prague","",""
|
||||
"`3285 <https://wg21.link/LWG3285>`__","The type of a customization point object shall satisfy ``semiregular``\ ","Prague","",""
|
||||
"`3286 <https://wg21.link/LWG3286>`__","``ranges::size``\ is not required to be valid after a call to ``ranges::begin``\ on an input range","Prague","","","|ranges|"
|
||||
"`3291 <https://wg21.link/LWG3291>`__","``iota_view::iterator``\ has the wrong ``iterator_category``\ ","Prague","","","|ranges|"
|
||||
"`3292 <https://wg21.link/LWG3292>`__","``iota_view``\ is under-constrained","Prague","","","|ranges|"
|
||||
"`3294 <https://wg21.link/LWG3294>`__","``zoned_time``\ deduction guides misinterprets ``string``\ /``char*``\ ","Prague","","","|chrono|"
|
||||
"`3286 <https://wg21.link/LWG3286>`__","``ranges::size``\ is not required to be valid after a call to ``ranges::begin``\ on an input range","Prague","",""
|
||||
"`3291 <https://wg21.link/LWG3291>`__","``iota_view::iterator``\ has the wrong ``iterator_category``\ ","Prague","",""
|
||||
"`3292 <https://wg21.link/LWG3292>`__","``iota_view``\ is under-constrained","Prague","",""
|
||||
"`3294 <https://wg21.link/LWG3294>`__","``zoned_time``\ deduction guides misinterprets ``string``\ /``char*``\ ","Prague","",""
|
||||
"`3296 <https://wg21.link/LWG3296>`__","Inconsistent default argument for ``basic_regex<>::assign``\ ","Prague","|Complete|",""
|
||||
"`3299 <https://wg21.link/LWG3299>`__","Pointers don't need customized iterator behavior","Prague","","","|ranges|"
|
||||
"`3299 <https://wg21.link/LWG3299>`__","Pointers don't need customized iterator behavior","Prague","",""
|
||||
"`3300 <https://wg21.link/LWG3300>`__","Non-array ``ssize``\ overload is underconstrained","Prague","",""
|
||||
"`3301 <https://wg21.link/LWG3301>`__","``transform_view::iterator``\ has incorrect ``iterator_category``\ ","Prague","","","|ranges|"
|
||||
"`3302 <https://wg21.link/LWG3302>`__","Range adaptor objects ``keys``\ and ``values``\ are unspecified","Prague","","","|ranges|"
|
||||
"`3301 <https://wg21.link/LWG3301>`__","``transform_view::iterator``\ has incorrect ``iterator_category``\ ","Prague","",""
|
||||
"`3302 <https://wg21.link/LWG3302>`__","Range adaptor objects ``keys``\ and ``values``\ are unspecified","Prague","",""
|
||||
"`3303 <https://wg21.link/LWG3303>`__","Bad ""``constexpr``\ "" marker for ``destroy/destroy_n``\ ","Prague","",""
|
||||
"`3304 <https://wg21.link/LWG3304>`__","Allocate functions of ``std::polymorphic_allocator``\ should require ``[[nodiscard]]``\ ","Prague","",""
|
||||
"`3307 <https://wg21.link/LWG3307>`__","``std::allocator<void>().allocate(n)``\ ","Prague","",""
|
||||
"`3310 <https://wg21.link/LWG3310>`__","Replace ``SIZE_MAX``\ with ``numeric_limits<size_t>::max()``\ ","Prague","",""
|
||||
"`3313 <https://wg21.link/LWG3313>`__","``join_view::iterator::operator--``\ is incorrectly constrained","Prague","","","|ranges|"
|
||||
"`3314 <https://wg21.link/LWG3314>`__","Is stream insertion behavior locale dependent when ``Period::type``\ is ``micro``\ ?","Prague","","","|chrono|"
|
||||
"`3313 <https://wg21.link/LWG3313>`__","``join_view::iterator::operator--``\ is incorrectly constrained","Prague","",""
|
||||
"`3314 <https://wg21.link/LWG3314>`__","Is stream insertion behavior locale dependent when ``Period::type``\ is ``micro``\ ?","Prague","",""
|
||||
"`3315 <https://wg21.link/LWG3315>`__","Correct Allocator Default Behavior","Prague","",""
|
||||
"`3316 <https://wg21.link/LWG3316>`__","Correctly define epoch for ``utc_clock``\ / ``utc_timepoint``\ ","Prague","","","|chrono|"
|
||||
"`3317 <https://wg21.link/LWG3317>`__","Incorrect ``operator<<``\ for floating-point durations","Prague","","","|chrono|"
|
||||
"`3318 <https://wg21.link/LWG3318>`__","Clarify whether clocks can represent time before their epoch","Prague","","","|chrono|"
|
||||
"`3319 <https://wg21.link/LWG3319>`__","Properly reference specification of IANA time zone database","Prague","","","|chrono|"
|
||||
"`3316 <https://wg21.link/LWG3316>`__","Correctly define epoch for ``utc_clock``\ / ``utc_timepoint``\ ","Prague","",""
|
||||
"`3317 <https://wg21.link/LWG3317>`__","Incorrect ``operator<<``\ for floating-point durations","Prague","",""
|
||||
"`3318 <https://wg21.link/LWG3318>`__","Clarify whether clocks can represent time before their epoch","Prague","",""
|
||||
"`3319 <https://wg21.link/LWG3319>`__","Properly reference specification of IANA time zone database","Prague","",""
|
||||
"`3320 <https://wg21.link/LWG3320>`__","``span::cbegin/cend``\ methods produce different results than ``std::[ranges::]cbegin/cend``\ ","Prague","|Complete|",""
|
||||
"`3321 <https://wg21.link/LWG3321>`__","``uninitialized_construct_using_allocator``\ should use ``construct_at``\ ","Prague","",""
|
||||
"`3323 <https://wg21.link/LWG3323>`__","``*has-tuple-element*``\ helper concept needs ``convertible_to``\ ","Prague","","","|ranges|"
|
||||
"`3324 <https://wg21.link/LWG3324>`__","Special-case ``std::strong/weak/partial_order``\ for pointers","Prague","|Complete|","14.0","|spaceship|"
|
||||
"`3325 <https://wg21.link/LWG3325>`__","Constrain return type of transformation function for ``transform_view``\ ","Prague","","","|ranges|"
|
||||
"`3326 <https://wg21.link/LWG3326>`__","``enable_view``\ has false positives","Prague","|In progress|","","|ranges|"
|
||||
"`3327 <https://wg21.link/LWG3327>`__","Format alignment specifiers vs. text direction","Prague","|Nothing To Do|","","|format|"
|
||||
"`3323 <https://wg21.link/LWG3323>`__","``*has-tuple-element*``\ helper concept needs ``convertible_to``\ ","Prague","",""
|
||||
"`3324 <https://wg21.link/LWG3324>`__","Special-case ``std::strong/weak/partial_order``\ for pointers","Prague","",""
|
||||
"`3325 <https://wg21.link/LWG3325>`__","Constrain return type of transformation function for ``transform_view``\ ","Prague","",""
|
||||
"`3326 <https://wg21.link/LWG3326>`__","``enable_view``\ has false positives","Prague","|In progress|",""
|
||||
"`3327 <https://wg21.link/LWG3327>`__","Format alignment specifiers vs. text direction","Prague","|Nothing To Do|",""
|
||||
"`3328 <https://wg21.link/LWG3328>`__","Clarify that ``std::string``\ is not good for UTF-8","Prague","",""
|
||||
"`3329 <https://wg21.link/LWG3329>`__","``totally_ordered_with``\ both directly and indirectly requires ``common_reference_with``\ ","Prague","|Complete|","13.0"
|
||||
"`3330 <https://wg21.link/LWG3330>`__","Include ``<compare>``\ from most library headers","Prague","|Complete|","13.0","|spaceship|"
|
||||
"`3331 <https://wg21.link/LWG3331>`__","Define ``totally_ordered/_with``\ in terms of ``partially-ordered-with``\ ","Prague","|Complete|","13.0"
|
||||
"`3332 <https://wg21.link/LWG3332>`__","Issue in |sect|\ [time.format]","Prague","","","|chrono| |format|"
|
||||
"`3330 <https://wg21.link/LWG3330>`__","Include ``<compare>``\ from most library headers","Prague","",""
|
||||
"`3331 <https://wg21.link/LWG3331>`__","Define ``totally_ordered/_with``\ in terms of ``*partially-ordered-with*``\ ","Prague","|Complete|","13.0"
|
||||
"`3332 <https://wg21.link/LWG3332>`__","Issue in |sect|\ [time.format]","Prague","",""
|
||||
"`3334 <https://wg21.link/LWG3334>`__","``basic_osyncstream``\ move assignment and destruction calls ``basic_syncbuf::emit()``\ twice","Prague","",""
|
||||
"`3335 <https://wg21.link/LWG3335>`__","Resolve C++20 NB comments US 273 and GB 274","Prague","","","|ranges|"
|
||||
"`3335 <https://wg21.link/LWG3335>`__","Resolve C++20 NB comments US 273 and GB 274","Prague","",""
|
||||
"`3338 <https://wg21.link/LWG3338>`__","Rename ``default_constructible``\ to ``default_initializable``\ ","Prague","|Complete|","13.0"
|
||||
"`3340 <https://wg21.link/LWG3340>`__","Formatting functions should throw on argument/format string mismatch in |sect|\ [format.functions]","Prague","|Complete|","14.0","|format|"
|
||||
"`3340 <https://wg21.link/LWG3340>`__","Formatting functions should throw on argument/format string mismatch in |sect|\ [format.functions]","Prague","",""
|
||||
"`3346 <https://wg21.link/LWG3346>`__","``pair``\ and ``tuple``\ copy and move constructor have backwards specification","Prague","",""
|
||||
"`3347 <https://wg21.link/LWG3347>`__","``std::pair<T, U>``\ now requires ``T``\ and ``U``\ to be less-than-comparable","Prague","",""
|
||||
"`3348 <https://wg21.link/LWG3348>`__","``__cpp_lib_unwrap_ref``\ in wrong header","Prague","|Complete|","12.0"
|
||||
"`3348 <https://wg21.link/LWG3348>`__","``__cpp_lib_unwrap_ref``\ in wrong header","Prague","",""
|
||||
"`3349 <https://wg21.link/LWG3349>`__","Missing ``__cpp_lib_constexpr_complex``\ for P0415R1","Prague","",""
|
||||
"`3350 <https://wg21.link/LWG3350>`__","Simplify return type of ``lexicographical_compare_three_way``\ ","Prague","","","|spaceship|"
|
||||
"`3351 <https://wg21.link/LWG3351>`__","``ranges::enable_safe_range``\ should not be constrained","Prague","","","|ranges|"
|
||||
"`3352 <https://wg21.link/LWG3352>`__","``strong_equality``\ isn't a thing","Prague","|Nothing To Do|","","|spaceship|"
|
||||
"`3354 <https://wg21.link/LWG3354>`__","``has_strong_structural_equality``\ has a meaningless definition","Prague","","","|spaceship|"
|
||||
"`3355 <https://wg21.link/LWG3355>`__","The memory algorithms should support move-only input iterators introduced by P1207","Prague","","","|ranges|"
|
||||
"`3356 <https://wg21.link/LWG3356>`__","``__cpp_lib_nothrow_convertible``\ should be ``__cpp_lib_is_nothrow_convertible``\ ","Prague","|Complete|","12.0"
|
||||
"`3350 <https://wg21.link/LWG3350>`__","Simplify return type of ``lexicographical_compare_three_way``\ ","Prague","",""
|
||||
"`3351 <https://wg21.link/LWG3351>`__","``ranges::enable_safe_range``\ should not be constrained","Prague","",""
|
||||
"`3352 <https://wg21.link/LWG3352>`__","``strong_equality``\ isn't a thing","Prague","",""
|
||||
"`3354 <https://wg21.link/LWG3354>`__","``has_strong_structural_equality``\ has a meaningless definition","Prague","",""
|
||||
"`3355 <https://wg21.link/LWG3355>`__","The memory algorithms should support move-only input iterators introduced by P1207","Prague","",""
|
||||
"`3356 <https://wg21.link/LWG3356>`__","``__cpp_lib_nothrow_convertible``\ should be ``__cpp_lib_is_nothrow_convertible``\ ","Prague","",""
|
||||
"`3358 <https://wg21.link/LWG3358>`__","|sect|\ [span.cons] is mistaken that ``to_address``\ can throw","Prague","",""
|
||||
"`3359 <https://wg21.link/LWG3359>`__","``<chrono>``\ leap second support should allow for negative leap seconds","Prague","","","|chrono|"
|
||||
"`3360 <https://wg21.link/LWG3360>`__","``three_way_comparable_with``\ is inconsistent with similar concepts","Prague","|Nothing To Do|","","|spaceship|"
|
||||
"`3359 <https://wg21.link/LWG3359>`__","``<chrono>``\ leap second support should allow for negative leap seconds","Prague","",""
|
||||
"`3360 <https://wg21.link/LWG3360>`__","``three_way_comparable_with``\ is inconsistent with similar concepts","Prague","",""
|
||||
"`3362 <https://wg21.link/LWG3362>`__","Strike ``stop_source``\ 's ``operator!=``\ ","Prague","",""
|
||||
"`3363 <https://wg21.link/LWG3363>`__","``drop_while_view``\ should opt-out of ``sized_range``\ ","Prague","","","|ranges|"
|
||||
"`3364 <https://wg21.link/LWG3364>`__","Initialize data members of ranges and their iterators","Prague","","","|ranges|"
|
||||
"`3363 <https://wg21.link/LWG3363>`__","``drop_while_view``\ should opt-out of ``sized_range``\ ","Prague","",""
|
||||
"`3364 <https://wg21.link/LWG3364>`__","Initialize data members of ranges and their iterators","Prague","",""
|
||||
"`3367 <https://wg21.link/LWG3367>`__","Integer-class conversions should not throw","Prague","",""
|
||||
"`3369 <https://wg21.link/LWG3369>`__","``span``\ 's deduction-guide for built-in arrays doesn't work","Prague","|Complete|","14.0"
|
||||
"`3371 <https://wg21.link/LWG3371>`__","``visit_format_arg``\ and ``make_format_args``\ are not hidden friends","Prague","|Complete|","14.0","|format|"
|
||||
"`3372 <https://wg21.link/LWG3372>`__","``vformat_to``\ should not try to deduce ``Out``\ twice","Prague","|Complete|","14.0","|format|"
|
||||
"`3373 <https://wg21.link/LWG3373>`__","``{to,from}_chars_result``\ and ``format_to_n_result``\ need the ""we really mean what we say"" wording","Prague","|Complete|","14.0","|format|"
|
||||
"`3369 <https://wg21.link/LWG3369>`__","``span``\ 's deduction-guide for built-in arrays doesn't work","Prague","",""
|
||||
"`3371 <https://wg21.link/LWG3371>`__","``visit_format_arg``\ and ``make_format_args``\ are not hidden friends","Prague","",""
|
||||
"`3372 <https://wg21.link/LWG3372>`__","``vformat_to``\ should not try to deduce ``Out``\ twice","Prague","",""
|
||||
"`3373 <https://wg21.link/LWG3373>`__","``{to,from}_chars_result``\ and ``format_to_n_result``\ need the ""we really mean what we say"" wording","Prague","",""
|
||||
"`3374 <https://wg21.link/LWG3374>`__","P0653 + P1006 should have made the other ``std::to_address``\ overload ``constexpr``\ ","Prague","|Complete|","12.0"
|
||||
"`3375 <https://wg21.link/LWG3375>`__","``decay``\ in ``viewable_range``\ should be ``remove_cvref``\ ","Prague","","","|ranges|"
|
||||
"`3377 <https://wg21.link/LWG3377>`__","``elements_view::iterator``\ befriends a specialization of itself","Prague","","","|ranges|"
|
||||
"`3375 <https://wg21.link/LWG3375>`__","``decay``\ in ``viewable_range``\ should be ``remove_cvref``\ ","Prague","",""
|
||||
"`3377 <https://wg21.link/LWG3377>`__","``elements_view::iterator``\ befriends a specialization of itself","Prague","",""
|
||||
"`3379 <https://wg21.link/LWG3379>`__","""``safe``\ "" in several library names is misleading","Prague","|In Progress|",""
|
||||
"`3380 <https://wg21.link/LWG3380>`__","``common_type``\ and comparison categories","Prague","","","|spaceship|"
|
||||
"`3381 <https://wg21.link/LWG3381>`__","``begin``\ and ``data``\ must agree for ``contiguous_range``\ ","Prague","","","|ranges|"
|
||||
"`3380 <https://wg21.link/LWG3380>`__","``common_type``\ and comparison categories","Prague","",""
|
||||
"`3381 <https://wg21.link/LWG3381>`__","``begin``\ and ``data``\ must agree for ``contiguous_range``\ ","Prague","",""
|
||||
"`3382 <https://wg21.link/LWG3382>`__","NTTP for ``pair``\ and ``array``\ ","Prague","",""
|
||||
"`3383 <https://wg21.link/LWG3383>`__","|sect|\ [time.zone.leap.nonmembers] ``sys_seconds``\ should be replaced with ``seconds``\ ","Prague","","","|chrono|"
|
||||
"`3384 <https://wg21.link/LWG3384>`__","``transform_view::*sentinel*``\ has an incorrect ``operator-``\ ","Prague","","","|ranges|"
|
||||
"`3385 <https://wg21.link/LWG3385>`__","``common_iterator``\ is not sufficiently constrained for non-copyable iterators","Prague","","","|ranges|"
|
||||
"`3387 <https://wg21.link/LWG3387>`__","|sect|\ [range.reverse.view] ``reverse_view<V>``\ unintentionally requires ``range<const V>``\ ","Prague","","","|ranges|"
|
||||
"`3388 <https://wg21.link/LWG3388>`__","``view``\ iterator types have ill-formed ``<=>``\ operators","Prague","","","|ranges|"
|
||||
"`3389 <https://wg21.link/LWG3389>`__","A move-only iterator still does not have a ``counted_iterator``\ ","Prague","","","|ranges|"
|
||||
"`3390 <https://wg21.link/LWG3390>`__","``make_move_iterator()``\ cannot be used to construct a ``move_iterator``\ for a move-only iterator","Prague","|Complete|","14.0","|ranges|"
|
||||
"`3393 <https://wg21.link/LWG3393>`__","Missing/incorrect feature test macro for coroutines","Prague","|Complete|","14.0"
|
||||
"`3395 <https://wg21.link/LWG3395>`__","Definition for three-way comparison needs to be updated (US 152)","Prague","","","|spaceship|"
|
||||
"`3383 <https://wg21.link/LWG3383>`__","|sect|\ [time.zone.leap.nonmembers] ``sys_seconds``\ should be replaced with ``seconds``\ ","Prague","",""
|
||||
"`3384 <https://wg21.link/LWG3384>`__","``transform_view::*sentinel*``\ has an incorrect ``operator-``\ ","Prague","",""
|
||||
"`3385 <https://wg21.link/LWG3385>`__","``common_iterator``\ is not sufficiently constrained for non-copyable iterators","Prague","",""
|
||||
"`3387 <https://wg21.link/LWG3387>`__","|sect|\ [range.reverse.view] ``reverse_view<V>``\ unintentionally requires ``range<const V>``\ ","Prague","",""
|
||||
"`3388 <https://wg21.link/LWG3388>`__","``view``\ iterator types have ill-formed ``<=>``\ operators","Prague","",""
|
||||
"`3389 <https://wg21.link/LWG3389>`__","A move-only iterator still does not have a ``counted_iterator``\ ","Prague","",""
|
||||
"`3390 <https://wg21.link/LWG3390>`__","``make_move_iterator()``\ cannot be used to construct a ``move_iterator``\ for a move-only iterator","Prague","",""
|
||||
"`3393 <https://wg21.link/LWG3393>`__","Missing/incorrect feature test macro for coroutines","Prague","",""
|
||||
"`3395 <https://wg21.link/LWG3395>`__","Definition for three-way comparison needs to be updated (US 152)","Prague","",""
|
||||
"`3396 <https://wg21.link/LWG3396>`__","Clarify point of reference for ``source_location::current()``\ (DE 169)","Prague","",""
|
||||
"`3397 <https://wg21.link/LWG3397>`__","``ranges::basic_istream_view::iterator``\ should not provide ``iterator_category``\ ","Prague","","","|ranges|"
|
||||
"`3398 <https://wg21.link/LWG3398>`__","``tuple_element_t``\ is also wrong for ``const subrange``\ ","Prague","|Complete|","14.0","|ranges|"
|
||||
"`3397 <https://wg21.link/LWG3397>`__","``ranges::basic_istream_view::iterator``\ should not provide ``iterator_category``\ ","Prague","",""
|
||||
"`3398 <https://wg21.link/LWG3398>`__","``tuple_element_t``\ is also wrong for ``const subrange``\ ","Prague","",""
|
||||
"`3446 <https://wg21.link/LWG3446>`__","``indirectly_readable_traits``\ ambiguity for types with both ``value_type``\ and ``element_type``\ ","November virtual meeting","|Complete|","13.0"
|
||||
|
Can't render this file because it has a wrong number of fields in line 2.
|
@ -22,14 +22,14 @@
|
||||
"`P0753R2 <https://wg21.link/P0753R2>`__","LWG","Manipulators for C++ Synchronized Buffered Ostream","Jacksonville","",""
|
||||
"`P0754R2 <https://wg21.link/P0754R2>`__","LWG","<version>","Jacksonville","|Complete|","7.0"
|
||||
"`P0809R0 <https://wg21.link/P0809R0>`__","LWG","Comparing Unordered Containers","Jacksonville","|Nothing To Do|",""
|
||||
"`P0858R0 <https://wg21.link/P0858R0>`__","LWG","Constexpr iterator requirements","Jacksonville","|Complete|","12.0"
|
||||
"`P0858R0 <https://wg21.link/P0858R0>`__","LWG","Constexpr iterator requirements","Jacksonville","",""
|
||||
"`P0905R1 <https://wg21.link/P0905R1>`__","CWG","Symmetry for spaceship","Jacksonville","",""
|
||||
"`P0966R1 <https://wg21.link/P0966R1>`__","LWG","``string::reserve``\ Should Not Shrink","Jacksonville","|Complete| [#note-P0966]_","12.0"
|
||||
"","","","","",""
|
||||
"`P0019R8 <https://wg21.link/P0019R8>`__","LWG","Atomic Ref","Rapperswil","",""
|
||||
"`P0458R2 <https://wg21.link/P0458R2>`__","LWG","Checking for Existence of an Element in Associative Containers","Rapperswil","|Complete|","13.0"
|
||||
"`P0475R1 <https://wg21.link/P0475R1>`__","LWG","LWG 2511: guaranteed copy elision for piecewise construction","Rapperswil","|Complete|",""
|
||||
"`P0476R2 <https://wg21.link/P0476R2>`__","LWG","Bit-casting object representations","Rapperswil","|Complete|","14.0"
|
||||
"`P0476R2 <https://wg21.link/P0476R2>`__","LWG","Bit-casting object representations","Rapperswil","",""
|
||||
"`P0528R3 <https://wg21.link/P0528R3>`__","CWG","The Curious Case of Padding Bits, Featuring Atomic Compare-and-Exchange","Rapperswil","",""
|
||||
"`P0542R5 <https://wg21.link/P0542R5>`__","CWG","Support for contract based programming in C++","Rapperswil","*Removed in Cologne*","n/a"
|
||||
"`P0556R3 <https://wg21.link/P0556R3>`__","LWG","Integral power-of-2 operations","Rapperswil","|Complete|","9.0"
|
||||
@ -98,110 +98,105 @@
|
||||
"`P1463R1 <https://wg21.link/P1463R1>`__","LWG","Mandating the Standard Library: Clause 21 - Containers library","Kona","",""
|
||||
"`P1464R1 <https://wg21.link/P1464R1>`__","LWG","Mandating the Standard Library: Clause 22 - Iterators library","Kona","|Complete|","9.0"
|
||||
"","","","","",""
|
||||
"`P0325R4 <https://wg21.link/P0325R4>`__","LWG","to_array from LFTS with updates","Cologne","|Complete|","10.0"
|
||||
"`P0408R7 <https://wg21.link/P0408R7>`__","LWG","Efficient Access to basic_stringbuf's Buffer","Cologne","",""
|
||||
"`P0466R5 <https://wg21.link/P0466R5>`__","LWG","Layout-compatibility and Pointer-interconvertibility Traits","Cologne","",""
|
||||
"`P0553R4 <https://wg21.link/P0553R4>`__","LWG","Bit operations","Cologne","|Complete|","9.0"
|
||||
"`P0631R8 <https://wg21.link/P0631R8>`__","LWG","Math Constants","Cologne","|Complete|","11.0"
|
||||
"`P0645R10 <https://wg21.link/P0645R10>`__","LWG","Text Formatting","Cologne","|Complete| [#note-P0645]_","14.0"
|
||||
"`P0660R10 <https://wg21.link/P0660R10>`__","LWG","Stop Token and Joining Thread, Rev 10","Cologne","",""
|
||||
"`P0784R7 <https://wg21.link/P0784R7>`__","CWG","More constexpr containers","Cologne","|Complete|","12.0"
|
||||
"`P0980R1 <https://wg21.link/P0980R1>`__","LWG","Making std::string constexpr","Cologne","",""
|
||||
"`P1004R2 <https://wg21.link/P1004R2>`__","LWG","Making std::vector constexpr","Cologne","",""
|
||||
"`P1035R7 <https://wg21.link/P1035R7>`__","LWG","Input Range Adaptors","Cologne","",""
|
||||
"`P1065R2 <https://wg21.link/P1065R2>`__","LWG","Constexpr INVOKE","Cologne","|Complete|","12.0"
|
||||
"`P1135R6 <https://wg21.link/P1135R6>`__","LWG","The C++20 Synchronization Library","Cologne","|Complete|","11.0"
|
||||
"`P1207R4 <https://wg21.link/P1207R4>`__","LWG","Movability of Single-pass Iterators","Cologne","",""
|
||||
"`P1208R6 <https://wg21.link/P1208R6>`__","LWG","Adopt source_location for C++20","Cologne","",""
|
||||
"`P1355R2 <https://wg21.link/P1355R2>`__","LWG","Exposing a narrow contract for ceil2","Cologne","|Complete|","9.0"
|
||||
"`P1361R2 <https://wg21.link/P1361R2>`__","LWG","Integration of chrono with text formatting","Cologne","",""
|
||||
"`P1423R3 <https://wg21.link/P1423R3>`__","LWG","char8_t backward compatibility remediation","Cologne","|In Progress|",""
|
||||
"`P1424R1 <https://wg21.link/P1424R1>`__","LWG","'constexpr' feature macro concerns","Cologne","Superseded by `P1902 <https://wg21.link/P1902>`__",""
|
||||
"`P1466R3 <https://wg21.link/P1466R3>`__","LWG","Miscellaneous minor fixes for chrono","Cologne","",""
|
||||
"`P1474R1 <https://wg21.link/P1474R1>`__","LWG","Helpful pointers for ContiguousIterator","Cologne","",""
|
||||
"`P1502R1 <https://wg21.link/P1502R1>`__","LWG","Standard library header units for C++20","Cologne","",""
|
||||
"`P1522R1 <https://wg21.link/P1522R1>`__","LWG","Iterator Difference Type and Integer Overflow","Cologne","",""
|
||||
"`P1523R1 <https://wg21.link/P1523R1>`__","LWG","Views and Size Types","Cologne","",""
|
||||
"`P1612R1 <https://wg21.link/P1612R1>`__","LWG","Relocate Endian's Specification","Cologne","|Complete|","10.0"
|
||||
"`P1614R2 <https://wg21.link/P1614R2>`__","LWG","The Mothership has Landed","Cologne","|In Progress|",""
|
||||
"`P1638R1 <https://wg21.link/P1638R1>`__","LWG","basic_istream_view::iterator should not be copyable","Cologne","",""
|
||||
"`P1643R1 <https://wg21.link/P1643R1>`__","LWG","Add wait/notify to atomic_ref","Cologne","",""
|
||||
"`P1644R0 <https://wg21.link/P1644R0>`__","LWG","Add wait/notify to atomic<shared_ptr>","Cologne","",""
|
||||
"`P1650R0 <https://wg21.link/P1650R0>`__","LWG","Output std::chrono::days with 'd' suffix","Cologne","",""
|
||||
"`P1651R0 <https://wg21.link/P1651R0>`__","LWG","bind_front should not unwrap reference_wrapper","Cologne","|Complete|","13.0"
|
||||
"`P1652R1 <https://wg21.link/P1652R1>`__","LWG","Printf corner cases in std::format","Cologne","|Complete|","14.0"
|
||||
"`P1661R1 <https://wg21.link/P1661R1>`__","LWG","Remove dedicated precalculated hash lookup interface","Cologne","|Nothing To Do|",""
|
||||
"`P1754R1 <https://wg21.link/P1754R1>`__","LWG","Rename concepts to standard_case for C++20, while we still can","Cologne","|In Progress|",""
|
||||
"`P0325 <https://wg21.link/P0325>`__","LWG","to_array from LFTS with updates","Cologne","|Complete|","10.0"
|
||||
"`P0408 <https://wg21.link/P0408>`__","LWG","Efficient Access to basic_stringbuf's Buffer","Cologne","",""
|
||||
"`P0466 <https://wg21.link/P0466>`__","LWG","Layout-compatibility and Pointer-interconvertibility Traits","Cologne","",""
|
||||
"`P0553 <https://wg21.link/P0553>`__","LWG","Bit operations","Cologne","|Complete|","9.0"
|
||||
"`P0631 <https://wg21.link/P0631>`__","LWG","Math Constants","Cologne","|Complete|","11.0"
|
||||
"`P0645 <https://wg21.link/P0645>`__","LWG","Text Formatting","Cologne","|In Progress|",""
|
||||
"`P0660 <https://wg21.link/P0660>`__","LWG","Stop Token and Joining Thread, Rev 10","Cologne","",""
|
||||
"`P0784 <https://wg21.link/P0784>`__","CWG","More constexpr containers","Cologne","|Complete|","12.0"
|
||||
"`P0980 <https://wg21.link/P0980>`__","LWG","Making std::string constexpr","Cologne","",""
|
||||
"`P1004 <https://wg21.link/P1004>`__","LWG","Making std::vector constexpr","Cologne","",""
|
||||
"`P1035 <https://wg21.link/P1035>`__","LWG","Input Range Adaptors","Cologne","",""
|
||||
"`P1065 <https://wg21.link/P1065>`__","LWG","Constexpr INVOKE","Cologne","|Complete|","12.0"
|
||||
"`P1135 <https://wg21.link/P1135>`__","LWG","The C++20 Synchronization Library","Cologne","|Complete|","11.0"
|
||||
"`P1207 <https://wg21.link/P1207>`__","LWG","Movability of Single-pass Iterators","Cologne","",""
|
||||
"`P1208 <https://wg21.link/P1208>`__","LWG","Adopt source_location for C++20","Cologne","",""
|
||||
"`P1355 <https://wg21.link/P1355>`__","LWG","Exposing a narrow contract for ceil2","Cologne","|Complete|","9.0"
|
||||
"`P1361 <https://wg21.link/P1361>`__","LWG","Integration of chrono with text formatting","Cologne","",""
|
||||
"`P1423 <https://wg21.link/P1423>`__","LWG","char8_t backward compatibility remediation","Cologne","|In Progress|",""
|
||||
"`P1424 <https://wg21.link/P1424>`__","LWG","'constexpr' feature macro concerns","Cologne","Superseded by `P1902 <https://wg21.link/P1902>`__",""
|
||||
"`P1466 <https://wg21.link/P1466>`__","LWG","Miscellaneous minor fixes for chrono","Cologne","",""
|
||||
"`P1474 <https://wg21.link/P1474>`__","LWG","Helpful pointers for ContiguousIterator","Cologne","",""
|
||||
"`P1502 <https://wg21.link/P1502>`__","LWG","Standard library header units for C++20","Cologne","",""
|
||||
"`P1522 <https://wg21.link/P1522>`__","LWG","Iterator Difference Type and Integer Overflow","Cologne","",""
|
||||
"`P1523 <https://wg21.link/P1523>`__","LWG","Views and Size Types","Cologne","",""
|
||||
"`P1612 <https://wg21.link/P1612>`__","LWG","Relocate Endian's Specification","Cologne","|Complete|","10.0"
|
||||
"`P1614 <https://wg21.link/P1614>`__","LWG","The Mothership has Landed","Cologne","|In Progress|",""
|
||||
"`P1638 <https://wg21.link/P1638>`__","LWG","basic_istream_view::iterator should not be copyable","Cologne","",""
|
||||
"`P1643 <https://wg21.link/P1643>`__","LWG","Add wait/notify to atomic_ref","Cologne","",""
|
||||
"`P1644 <https://wg21.link/P1644>`__","LWG","Add wait/notify to atomic<shared_ptr>","Cologne","",""
|
||||
"`P1650 <https://wg21.link/P1650>`__","LWG","Output std::chrono::days with 'd' suffix","Cologne","",""
|
||||
"`P1651 <https://wg21.link/P1651>`__","LWG","bind_front should not unwrap reference_wrapper","Cologne","|Complete|","13.0"
|
||||
"`P1652 <https://wg21.link/P1652>`__","LWG","Printf corner cases in std::format","Cologne","",""
|
||||
"`P1661 <https://wg21.link/P1661>`__","LWG","Remove dedicated precalculated hash lookup interface","Cologne","|Nothing To Do|",""
|
||||
"`P1754 <https://wg21.link/P1754>`__","LWG","Rename concepts to standard_case for C++20, while we still can","Cologne","|In Progress|",""
|
||||
"","","","","",""
|
||||
"`P0883R2 <https://wg21.link/P0883R2>`__","LWG","Fixing Atomic Initialization","Belfast","|Complete| [#note-P0883]_","14.0"
|
||||
"`P1391R4 <https://wg21.link/P1391R4>`__","LWG","Range constructor for std::string_view","Belfast","|Complete|","14.0"
|
||||
"`P1394R4 <https://wg21.link/P1394R4>`__","LWG","Range constructor for std::span","Belfast","|Complete|","14.0"
|
||||
"`P1456R1 <https://wg21.link/P1456R1>`__","LWG","Move-only views","Belfast","* *",""
|
||||
"`P1622R3 <https://wg21.link/P1622R3>`__","LWG","Mandating the Standard Library: Clause 32 - Thread support library","Belfast","* *",""
|
||||
"`P1645R1 <https://wg21.link/P1645R1>`__","LWG","constexpr for numeric algorithms","Belfast","|Complete|","12.0"
|
||||
"`P1686R2 <https://wg21.link/P1686R2>`__","LWG","Mandating the Standard Library: Clause 27 - Time library","Belfast","* *",""
|
||||
"`P1690R1 <https://wg21.link/P1690R1>`__","LWG","Refinement Proposal for P0919 Heterogeneous lookup for unordered containers","Belfast","|Complete|","12.0"
|
||||
"`P1716R3 <https://wg21.link/P1716R3>`__","LWG","ranges compare algorithm are over-constrained","Belfast","* *",""
|
||||
"`P1718R2 <https://wg21.link/P1718R2>`__","LWG","Mandating the Standard Library: Clause 25 - Algorithms library","Belfast","* *",""
|
||||
"`P1719R2 <https://wg21.link/P1719R2>`__","LWG","Mandating the Standard Library: Clause 26 - Numerics library","Belfast","* *",""
|
||||
"`P1720R2 <https://wg21.link/P1720R2>`__","LWG","Mandating the Standard Library: Clause 28 - Localization library","Belfast","* *",""
|
||||
"`P1721R2 <https://wg21.link/P1721R2>`__","LWG","Mandating the Standard Library: Clause 29 - Input/Output library","Belfast","* *",""
|
||||
"`P1722R2 <https://wg21.link/P1722R2>`__","LWG","Mandating the Standard Library: Clause 30 - Regular Expression library","Belfast","* *",""
|
||||
"`P1723R2 <https://wg21.link/P1723R2>`__","LWG","Mandating the Standard Library: Clause 31 - Atomics library","Belfast","* *",""
|
||||
"`P1855R0 <https://wg21.link/P1855R0>`__","LWG","Make ``<compare>``\ freestanding","Belfast","* *",""
|
||||
"`P1862R1 <https://wg21.link/P1862R1>`__","LWG","Ranges adaptors for non-copyable iterators","Belfast","* *",""
|
||||
"`P1865R1 <https://wg21.link/P1865R1>`__","LWG","Add max() to latch and barrier","Belfast","|Complete|","11.0"
|
||||
"`P1869R1 <https://wg21.link/P1869R1>`__","LWG","Rename 'condition_variable_any' interruptible wait methods","Belfast","* *",""
|
||||
"`P1870R1 <https://wg21.link/P1870R1>`__","LWG","forwarding-range is too subtle","Belfast","|In Progress|",""
|
||||
"`P1871R1 <https://wg21.link/P1871R1>`__","LWG","Should concepts be enabled or disabled?","Belfast","|Complete|","14.0"
|
||||
"`P1872R0 <https://wg21.link/P1872R0>`__","LWG","span should have size_type, not index_type","Belfast","|Complete|","10.0"
|
||||
"`P1878R1 <https://wg21.link/P1878R1>`__","LWG","Constraining Readable Types","Belfast","* *",""
|
||||
"`P1892R1 <https://wg21.link/P1892R1>`__","LWG","Extended locale-specific presentation specifiers for std::format","Belfast","|Complete|","14.0"
|
||||
"`P1902R1 <https://wg21.link/P1902R1>`__","LWG","Missing feature-test macros 2018-2019","Belfast","* *",""
|
||||
"`P1959R0 <https://wg21.link/P1959R0>`__","LWG","Remove std::weak_equality and std::strong_equality","Belfast","* *",""
|
||||
"`P1960R0 <https://wg21.link/P1960R0>`__","LWG","NB Comment Changes Reviewed by SG1","Belfast","* *",""
|
||||
"`P1961R0 <https://wg21.link/P1961R0>`__","LWG","Harmonizing the definitions of total order for pointers","Belfast","* *",""
|
||||
"`P1965R0 <https://wg21.link/P1965R0>`__","LWG","Blanket Wording for Specifying ""Hidden Friends""","Belfast","* *",""
|
||||
"`P0883 <https://wg21.link/P0883>`__","LWG","Fixing Atomic Initialization","Belfast","|Complete| [#note-P0883]_","13.0"
|
||||
"`P1391 <https://wg21.link/P1391>`__","LWG","Range constructor for std::string_view","Belfast","* *",""
|
||||
"`P1394 <https://wg21.link/P1394>`__","LWG","Range constructor for std::span","Belfast","* *",""
|
||||
"`P1456 <https://wg21.link/P1456>`__","LWG","Move-only views","Belfast","* *",""
|
||||
"`P1622 <https://wg21.link/P1622>`__","LWG","Mandating the Standard Library: Clause 32 - Thread support library","Belfast","* *",""
|
||||
"`P1645 <https://wg21.link/P1645>`__","LWG","constexpr for numeric algorithms","Belfast","|Complete|","12.0"
|
||||
"`P1664 <https://wg21.link/P1664>`__","LWG","reconstructible_range - a concept for putting ranges back together","Belfast","* *",""
|
||||
"`P1686 <https://wg21.link/P1686>`__","LWG","Mandating the Standard Library: Clause 27 - Time library","Belfast","* *",""
|
||||
"`P1690 <https://wg21.link/P1690>`__","LWG","Refinement Proposal for P0919 Heterogeneous lookup for unordered containers","Belfast","|Complete|","12.0"
|
||||
"`P1716 <https://wg21.link/P1716>`__","LWG","ranges compare algorithm are over-constrained","Belfast","* *",""
|
||||
"`P1718 <https://wg21.link/P1718>`__","LWG","Mandating the Standard Library: Clause 25 - Algorithms library","Belfast","* *",""
|
||||
"`P1719 <https://wg21.link/P1719>`__","LWG","Mandating the Standard Library: Clause 26 - Numerics library","Belfast","* *",""
|
||||
"`P1720 <https://wg21.link/P1720>`__","LWG","Mandating the Standard Library: Clause 28 - Localization library","Belfast","* *",""
|
||||
"`P1721 <https://wg21.link/P1721>`__","LWG","Mandating the Standard Library: Clause 29 - Input/Output library","Belfast","* *",""
|
||||
"`P1722 <https://wg21.link/P1722>`__","LWG","Mandating the Standard Library: Clause 30 - Regular Expression library","Belfast","* *",""
|
||||
"`P1723 <https://wg21.link/P1723>`__","LWG","Mandating the Standard Library: Clause 31 - Atomics library","Belfast","* *",""
|
||||
"`P1855 <https://wg21.link/P1855>`__","LWG","Make ``<compare>``\ freestanding","Belfast","* *",""
|
||||
"`P1862 <https://wg21.link/P1862>`__","LWG","Ranges adaptors for non-copyable iterators","Belfast","* *",""
|
||||
"`P1865 <https://wg21.link/P1865>`__","LWG","Add max() to latch and barrier","Belfast","|Complete|","11.0"
|
||||
"`P1869 <https://wg21.link/P1869>`__","LWG","Rename 'condition_variable_any' interruptible wait methods","Belfast","* *",""
|
||||
"`P1870 <https://wg21.link/P1870>`__","LWG","forwarding-range is too subtle","Belfast","|In Progress|",""
|
||||
"`P1871 <https://wg21.link/P1871>`__","LWG","Should concepts be enabled or disabled?","Belfast","* *",""
|
||||
"`P1872 <https://wg21.link/P1872>`__","LWG","span should have size_type, not index_type","Belfast","|Complete|","10.0"
|
||||
"`P1878 <https://wg21.link/P1878>`__","LWG","Constraining Readable Types","Belfast","* *",""
|
||||
"`P1892 <https://wg21.link/P1892>`__","LWG","Extended locale-specific presentation specifiers for std::format","Belfast","* *",""
|
||||
"`P1902 <https://wg21.link/P1902>`__","LWG","Missing feature-test macros 2018-2019","Belfast","* *",""
|
||||
"`P1959 <https://wg21.link/P1959>`__","LWG","Remove std::weak_equality and std::strong_equality","Belfast","* *",""
|
||||
"`P1960 <https://wg21.link/P1960>`__","LWG","NB Comment Changes Reviewed by SG1","Belfast","* *",""
|
||||
"`P1961 <https://wg21.link/P1961>`__","LWG","Harmonizing the definitions of total order for pointers","Belfast","* *",""
|
||||
"`P1965 <https://wg21.link/P1965>`__","LWG","Blanket Wording for Specifying ""Hidden Friends""","Belfast","* *",""
|
||||
"","","","","",""
|
||||
"`P0586R2 <https://wg21.link/P0586R2>`__","LWG","Safe integral comparisons","Prague","|Complete|","13.0"
|
||||
"`P0593R6 <https://wg21.link/P0593R6>`__","CWG","Implicit creation of objects for low-level object manipulation","Prague","* *",""
|
||||
"`P1115R3 <https://wg21.link/P1115R3>`__","LWG","Improving the Return Value of Erase-Like Algorithms II: Free erase/erase if","Prague","|Complete|","11.0"
|
||||
"`P1243R4 <https://wg21.link/P1243R4>`__","LWG","Rangify New Algorithms","Prague","* *",""
|
||||
"`P1460R1 <https://wg21.link/P1460R1>`__","LWG","Mandating the Standard Library: Clause 20 - Utilities library","Prague","* *",""
|
||||
"`P1739R4 <https://wg21.link/P1739R4>`__","LWG","Avoid template bloat for safe_ranges in combination with ""subrange-y"" view adaptors","Prague","* *",""
|
||||
"`P1831R1 <https://wg21.link/P1831R1>`__","LWG","Deprecating volatile: library","Prague","* *",""
|
||||
"`P1868R2 <https://wg21.link/P1868R2>`__","LWG","width: clarifying units of width and precision in std::format","Prague","|Complete|","14.0"
|
||||
"`P1908R1 <https://wg21.link/P1908R1>`__","CWG","Reserving Attribute Namespaces for Future Use","Prague","* *",""
|
||||
"`P1937R2 <https://wg21.link/P1937R2>`__","CWG","Fixing inconsistencies between constexpr and consteval functions","Prague","* *",""
|
||||
"`P1956R1 <https://wg21.link/P1956R1>`__","LWG","On the names of low-level bit manipulation functions","Prague","|Complete|","12.0"
|
||||
"`P1957R2 <https://wg21.link/P1957R2>`__","CWG","Converting from ``T*``\ to bool should be considered narrowing (re: US 212)","Prague","* *",""
|
||||
"`P1963R0 <https://wg21.link/P1963R0>`__","LWG","Fixing US 313","Prague","* *",""
|
||||
"`P1964R2 <https://wg21.link/P1964R2>`__","LWG","Wording for boolean-testable","Prague","|Complete|","13.0"
|
||||
"`P1970R2 <https://wg21.link/P1970R2>`__","LWG","Consistency for size() functions: Add ranges::ssize","Prague","* *",""
|
||||
"`P1973R1 <https://wg21.link/P1973R1>`__","LWG","Rename ""_default_init"" Functions, Rev1","Prague","* *",""
|
||||
"`P1976R2 <https://wg21.link/P1976R2>`__","LWG","Fixed-size span construction from dynamic range","Prague","|Complete|","11.0"
|
||||
"`P1981R0 <https://wg21.link/P1981R0>`__","LWG","Rename leap to leap_second","Prague","* *",""
|
||||
"`P1982R0 <https://wg21.link/P1982R0>`__","LWG","Rename link to time_zone_link","Prague","* *",""
|
||||
"`P1983R0 <https://wg21.link/P1983R0>`__","LWG","Wording for GB301, US296, US292, US291, and US283","Prague","* *",""
|
||||
"`P1994R1 <https://wg21.link/P1994R1>`__","LWG","elements_view needs its own sentinel","Prague","* *",""
|
||||
"`P2002R1 <https://wg21.link/P2002R1>`__","CWG","Defaulted comparison specification cleanups","Prague","* *",""
|
||||
"`P2045R1 <https://wg21.link/P2045R1>`__","LWG","Missing Mandates for the standard library","Prague","* *",""
|
||||
"`P2085R0 <https://wg21.link/P2085R0>`__","CWG","Consistent defaulted comparisons","Prague","* *",""
|
||||
"`P2091R0 <https://wg21.link/P2091R0>`__","LWG","Issues with range access CPOs","Prague","* *",""
|
||||
"`P2101R0 <https://wg21.link/P2101R0>`__","LWG","'Models' subsumes 'satisfies' (Wording for US298 and US300)","Prague","* *",""
|
||||
"`P2102R0 <https://wg21.link/P2102R0>`__","LWG","Make 'implicit expression variations' more explicit (Wording for US185)","Prague","* *",""
|
||||
"`P2106R0 <https://wg21.link/P2106R0>`__","LWG","Alternative wording for GB315 and GB316","Prague","* *",""
|
||||
"`P2116R0 <https://wg21.link/P2116R0>`__","LWG","Remove tuple-like protocol support from fixed-extent span","Prague","|Complete|","11.0"
|
||||
"","","","","",""
|
||||
"`P2231R1 <https://wg21.link/P2231R1>`__","LWG","Missing constexpr in std::optional and std::variant","June 2021","|In progress|","13.0"
|
||||
"`P2325R3 <https://wg21.link/P2325R3>`__","LWG","Views should not be required to be default constructible","June 2021","|In progress|",""
|
||||
"`P0586 <https://wg21.link/P0586>`__","LWG","Safe integral comparisons","Prague","|Complete|","13.0"
|
||||
"`P0593 <https://wg21.link/P0593>`__","CWG","Implicit creation of objects for low-level object manipulation","Prague","* *",""
|
||||
"`P1115 <https://wg21.link/P1115>`__","LWG","Improving the Return Value of Erase-Like Algorithms II: Free erase/erase if","Prague","|Complete|","11.0"
|
||||
"`P1243 <https://wg21.link/P1243>`__","LWG","Rangify New Algorithms","Prague","* *",""
|
||||
"`P1460 <https://wg21.link/P1460>`__","LWG","Mandating the Standard Library: Clause 20 - Utilities library","Prague","* *",""
|
||||
"`P1739 <https://wg21.link/P1739>`__","LWG","Avoid template bloat for safe_ranges in combination with ""subrange-y"" view adaptors","Prague","* *",""
|
||||
"`P1831 <https://wg21.link/P1831>`__","LWG","Deprecating volatile: library","Prague","* *",""
|
||||
"`P1868 <https://wg21.link/P1868>`__","LWG","width: clarifying units of width and precision in std::format","Prague","* *",""
|
||||
"`P1908 <https://wg21.link/P1908>`__","CWG","Reserving Attribute Namespaces for Future Use","Prague","* *",""
|
||||
"`P1937 <https://wg21.link/P1937>`__","CWG","Fixing inconsistencies between constexpr and consteval functions","Prague","* *",""
|
||||
"`P1956 <https://wg21.link/P1956>`__","LWG","On the names of low-level bit manipulation functions","Prague","|Complete|","12.0"
|
||||
"`P1957 <https://wg21.link/P1957>`__","CWG","Converting from ``T*``\ to bool should be considered narrowing (re: US 212)","Prague","* *",""
|
||||
"`P1963 <https://wg21.link/P1963>`__","LWG","Fixing US 313","Prague","* *",""
|
||||
"`P1964 <https://wg21.link/P1964>`__","LWG","Wording for boolean-testable","Prague","|Complete|","13.0"
|
||||
"`P1970 <https://wg21.link/P1970>`__","LWG","Consistency for size() functions: Add ranges::ssize","Prague","* *",""
|
||||
"`P1973 <https://wg21.link/P1973>`__","LWG","Rename ""_default_init"" Functions, Rev1","Prague","* *",""
|
||||
"`P1976 <https://wg21.link/P1976>`__","LWG","Fixed-size span construction from dynamic range","Prague","|Complete|","11.0"
|
||||
"`P1981 <https://wg21.link/P1981>`__","LWG","Rename leap to leap_second","Prague","* *",""
|
||||
"`P1982 <https://wg21.link/P1982>`__","LWG","Rename link to time_zone_link","Prague","* *",""
|
||||
"`P1983 <https://wg21.link/P1983>`__","LWG","Wording for GB301, US296, US292, US291, and US283","Prague","* *",""
|
||||
"`P1994 <https://wg21.link/P1994>`__","LWG","elements_view needs its own sentinel","Prague","* *",""
|
||||
"`P2002 <https://wg21.link/P2002>`__","CWG","Defaulted comparison specification cleanups","Prague","* *",""
|
||||
"`P2045 <https://wg21.link/P2045>`__","LWG","Missing Mandates for the standard library","Prague","* *",""
|
||||
"`P2085 <https://wg21.link/P2085>`__","CWG","Consistent defaulted comparisons","Prague","* *",""
|
||||
"`P2091 <https://wg21.link/P2091>`__","LWG","Issues with range access CPOs","Prague","* *",""
|
||||
"`P2101 <https://wg21.link/P2101>`__","LWG","'Models' subsumes 'satisfies' (Wording for US298 and US300)","Prague","* *",""
|
||||
"`P2102 <https://wg21.link/P2102>`__","LWG","Make 'implicit expression variations' more explicit (Wording for US185)","Prague","* *",""
|
||||
"`P2106 <https://wg21.link/P2106>`__","LWG","Alternative wording for GB315 and GB316","Prague","* *",""
|
||||
"`P2116 <https://wg21.link/P2116>`__","LWG","Remove tuple-like protocol support from fixed-extent span","Prague","|Complete|","11.0"
|
||||
"`P2231 <https://wg21.link/P2231>`__","LWG","Missing constexpr in std::optional and std::variant","February 2021","|In progress|","13.0"
|
||||
"`P2325 <https://wg21.link/P2325>`__","LWG","Views should not be required to be default constructible","June 2021","|In progress|",""
|
||||
"`P2210R2 <https://wg21.link/P2210R2>`__","LWG",Superior String Splitting,"June 2021","",""
|
||||
"`P2216R3 <https://wg21.link/P2216R3>`__","LWG",std::format improvements,"June 2021","|Partial|",""
|
||||
"`P2281R1 <https://wg21.link/P2281R1>`__","LWG",Clarifying range adaptor objects,"June 2021","|Complete|","14.0"
|
||||
"`P2216R3 <https://wg21.link/P2216R3>`__","LWG",std::format improvements,"June 2021","",""
|
||||
"`P2281R1 <https://wg21.link/P2281R1>`__","LWG",Clarifying range adaptor objects,"June 2021","",""
|
||||
"`P2328R1 <https://wg21.link/P2328R1>`__","LWG",join_view should join all views of ranges,"June 2021","",""
|
||||
"`P2367R0 <https://wg21.link/P2367R0>`__","LWG",Remove misuses of list-initialization from Clause 24,"June 2021","",""
|
||||
"","","","","",""
|
||||
"`P2372R3 <https://wg21.link/P2372R3>`__","LWG","Fixing locale handling in chrono formatters","October 2021","",""
|
||||
"`P2415R2 <https://wg21.link/P2415R2>`__","LWG","What is a ``view``","October 2021","|Complete|","14.0"
|
||||
"`P2418R2 <https://wg21.link/P2418R2>`__","LWG","Add support for ``std::generator``-like types to ``std::format``","October 2021","",""
|
||||
"`P2432R1 <https://wg21.link/P2432R1>`__","LWG","Fix ``istream_view``","October 2021","",""
|
||||
|
|
@ -46,3 +46,5 @@ Library Working Group Issues Status
|
||||
:file: Cxx2bIssues.csv
|
||||
:header-rows: 1
|
||||
:widths: auto
|
||||
|
||||
Last Updated: 22-July-2021
|
||||
|
@ -1,141 +1,99 @@
|
||||
"Issue #","Issue Name","Meeting","Status","First released version","Labels"
|
||||
"`2839 <https://wg21.link/LWG2839>`__","Self-move-assignment of library types, again","November 2020","|Nothing To Do|",""
|
||||
"Issue #","Issue Name","Meeting","Status","First released version"
|
||||
"`2839 <https://wg21.link/LWG2839>`__","Self-move-assignment of library types, again","November 2020","",""
|
||||
"`3117 <https://wg21.link/LWG3117>`__","Missing ``packaged_task`` deduction guides","November 2020","",""
|
||||
"`3143 <https://wg21.link/LWG3143>`__","``monotonic_buffer_resource`` growth policy is unclear","November 2020","",""
|
||||
"`3195 <https://wg21.link/LWG3195>`__","What is the stored pointer value of an empty ``weak_ptr``?","November 2020","|Nothing To Do|",""
|
||||
"`3211 <https://wg21.link/LWG3211>`__","``std::tuple<>`` should be trivially constructible","November 2020","|Complete|","9.0"
|
||||
"`3236 <https://wg21.link/LWG3236>`__","Random access iterator requirements lack limiting relational operators domain to comparing those from the same range","November 2020","|Nothing To Do|","","|ranges|"
|
||||
"`3195 <https://wg21.link/LWG3195>`__","What is the stored pointer value of an empty weak_ptr?","November 2020","",""
|
||||
"`3211 <https://wg21.link/LWG3211>`__","``std::tuple<>`` should be trivially constructible","November 2020","",""
|
||||
"`3236 <https://wg21.link/LWG3236>`__","Random access iterator requirements lack limiting relational operators domain to comparing those from the same range","November 2020","",""
|
||||
"`3265 <https://wg21.link/LWG3265>`__","``move_iterator``'s conversions are more broken after P1207","November 2020","Fixed by `LWG3435 <https://wg21.link/LWG3435>`__",""
|
||||
"`3435 <https://wg21.link/LWG3435>`__","``three_way_comparable_with<reverse_iterator<int*>, reverse_iterator<const int*>>``","November 2020","|Complete|","13.0"
|
||||
"`3432 <https://wg21.link/LWG3432>`__","Missing requirement for ``comparison_category``","November 2020","","","|spaceship|"
|
||||
"`3447 <https://wg21.link/LWG3447>`__","Deduction guides for ``take_view`` and ``drop_view`` have different constraints","November 2020","|Complete|","14.0"
|
||||
"`3450 <https://wg21.link/LWG3450>`__","The const overloads of ``take_while_view::begin/end`` are underconstrained","November 2020","","","|ranges|"
|
||||
"`3432 <https://wg21.link/LWG3432>`__","Missing requirement for comparison_category","November 2020","",""
|
||||
"`3447 <https://wg21.link/LWG3447>`__","Deduction guides for ``take_view`` and ``drop_view`` have different constraints","November 2020","",""
|
||||
"`3450 <https://wg21.link/LWG3450>`__","The const overloads of ``take_while_view::begin/end`` are underconstrained","November 2020","",""
|
||||
"`3464 <https://wg21.link/LWG3464>`__","``istream::gcount()`` can overflow","November 2020","",""
|
||||
"`2731 <https://wg21.link/LWG2731>`__","Existence of ``lock_guard<MutexTypes...>::mutex_type`` typedef unclear","November 2020","|Complete|","5.0"
|
||||
"`2743 <https://wg21.link/LWG2743>`__","P0083R3 ``node_handle`` private members missing ""exposition only"" comment","November 2020","|Nothing To Do|",""
|
||||
"`2820 <https://wg21.link/LWG2820>`__","Clarify ``<cstdint>`` macros","November 2020","|Nothing To Do|",""
|
||||
"`2731 <https://wg21.link/LWG2731>`__","Existence of ``lock_guard<MutexTypes...>::mutex_type`` typedef unclear","November 2020","",""
|
||||
"`2743 <https://wg21.link/LWG2743>`__","P0083R3 ``node_handle`` private members missing ""exposition only"" comment","November 2020","",""
|
||||
"`2820 <https://wg21.link/LWG2820>`__","Clarify ``<cstdint>`` macros","November 2020","",""
|
||||
"`3120 <https://wg21.link/LWG3120>`__","Unclear behavior of ``monotonic_buffer_resource::release()``","November 2020","",""
|
||||
"`3170 <https://wg21.link/LWG3170>`__","``is_always_equal`` added to ``std::allocator`` makes the standard library treat derived types as always equal","November 2020","",""
|
||||
"`3036 <https://wg21.link/LWG3036>`__","``polymorphic_allocator::destroy`` is extraneous","November 2020","",""
|
||||
"`3171 <https://wg21.link/LWG3171>`__","LWG2989 breaks ``directory_entry`` stream insertion","November 2020","|Complete|","14.0"
|
||||
"`3306 <https://wg21.link/LWG3306>`__","``ranges::advance`` violates its preconditions","November 2020","|Complete|","14.0","|ranges|"
|
||||
"`3403 <https://wg21.link/LWG3403>`__","Domain of ``ranges::ssize(E)`` doesn't ``match ranges::size(E)``","November 2020","","","|ranges|"
|
||||
"`3404 <https://wg21.link/LWG3404>`__","Finish removing subrange's conversions from pair-like","November 2020","","","|ranges|"
|
||||
"`3405 <https://wg21.link/LWG3405>`__","``common_view``'s converting constructor is bad, too","November 2020","|Complete|","14.0","|ranges|"
|
||||
"`3406 <https://wg21.link/LWG3406>`__","``elements_view::begin()`` and ``elements_view::end()`` have incompatible constraints","November 2020","","","|ranges|"
|
||||
"`3419 <https://wg21.link/LWG3419>`__","[algorithms.requirements]/15 doesn't reserve as many rights as it intends to","November 2020","|Nothing To Do|",""
|
||||
"`3420 <https://wg21.link/LWG3420>`__","cpp17-iterator should check that the type looks like an iterator first","November 2020","|Complete|","14.0","|ranges|"
|
||||
"`3421 <https://wg21.link/LWG3421>`__","Imperfect ADL emulation for boolean-testable","November 2020","|Nothing To Do|","","|ranges|"
|
||||
"`3425 <https://wg21.link/LWG3425>`__","``condition_variable_any`` fails to constrain its Lock parameters","November 2020","|Nothing To Do|",""
|
||||
"`3426 <https://wg21.link/LWG3426>`__","``operator<=>(const unique_ptr<T, D>&, nullptr_t)`` can't get no satisfaction","November 2020","","","|spaceship|"
|
||||
"`3427 <https://wg21.link/LWG3427>`__","``operator<=>(const shared_ptr<T>&, nullptr_t)`` definition ill-formed","November 2020","","","|spaceship|"
|
||||
"`3428 <https://wg21.link/LWG3428>`__","``single_view``'s in place constructor should be explicit","November 2020","|Complete|","14.0","|ranges|"
|
||||
"`3434 <https://wg21.link/LWG3434>`__","``ios_base`` never reclaims memory for iarray and parray","November 2020","|Nothing To Do|",""
|
||||
"`3437 <https://wg21.link/LWG3437>`__","``__cpp_lib_polymorphic_allocator`` is in the wrong header","November 2020","|Complete|","14.0"
|
||||
"`3446 <https://wg21.link/LWG3446>`__","``indirectly_readable_traits`` ambiguity for types with both ``value_type`` and ``element_type``","November 2020","|Complete|","14.0","|ranges|"
|
||||
"`3448 <https://wg21.link/LWG3448>`__","``transform_view``'s ``sentinel<false>`` not comparable with ``iterator<true>``","November 2020","","","|ranges|"
|
||||
"`3449 <https://wg21.link/LWG3449>`__","``take_view`` and ``take_while_view``'s ``sentinel<false>`` not comparable with their ``const iterator``","November 2020","","","|ranges|"
|
||||
"`3453 <https://wg21.link/LWG3453>`__","Generic code cannot call ``ranges::advance(i, s)``","November 2020","|Nothing To Do|","","|ranges|"
|
||||
"`3171 <https://wg21.link/LWG3171>`__","LWG2989 breaks ``directory_entry`` stream insertion","November 2020","",""
|
||||
"`3306 <https://wg21.link/LWG3306>`__","``ranges::advance`` violates its preconditions","November 2020","",""
|
||||
"`3403 <https://wg21.link/LWG3403>`__","Domain of ``ranges::ssize(E)`` doesn't ``match ranges::size(E)``","November 2020","",""
|
||||
"`3404 <https://wg21.link/LWG3404>`__","Finish removing subrange's conversions from pair-like","November 2020","",""
|
||||
"`3405 <https://wg21.link/LWG3405>`__","``common_view``'s converting constructor is bad, too","November 2020","",""
|
||||
"`3406 <https://wg21.link/LWG3406>`__","``elements_view::begin()`` and ``elements_view::end()`` have incompatible constraints","November 2020","",""
|
||||
"`3419 <https://wg21.link/LWG3419>`__","[algorithms.requirements]/15 doesn't reserve as many rights as it intends to","November 2020","",""
|
||||
"`3420 <https://wg21.link/LWG3420>`__","cpp17-iterator should check that the type looks like an iterator first","November 2020","",""
|
||||
"`3421 <https://wg21.link/LWG3421>`__","Imperfect ADL emulation for boolean-testable","November 2020","",""
|
||||
"`3425 <https://wg21.link/LWG3425>`__","``condition_variable_any`` fails to constrain its Lock parameters","November 2020","",""
|
||||
"`3426 <https://wg21.link/LWG3426>`__","``operator<=>(const unique_ptr<T, D>&, nullptr_t)`` can't get no satisfaction","November 2020","",""
|
||||
"`3427 <https://wg21.link/LWG3427>`__","``operator<=>(const shared_ptr<T>&, nullptr_t)`` definition ill-formed","November 2020","",""
|
||||
"`3428 <https://wg21.link/LWG3428>`__","``single_view``'s in place constructor should be explicit","November 2020","",""
|
||||
"`3434 <https://wg21.link/LWG3434>`__","``ios_base`` never reclaims memory for iarray and parray","November 2020","",""
|
||||
"`3437 <https://wg21.link/LWG3437>`__","``__cpp_lib_polymorphic_allocator`` is in the wrong header","November 2020","",""
|
||||
"`3446 <https://wg21.link/LWG3446>`__","``indirectly_readable_traits`` ambiguity for types with both ``value_type`` and ``element_type``","November 2020","",""
|
||||
"`3448 <https://wg21.link/LWG3448>`__","``transform_view``'s sentinel<false> not comparable with ``iterator<true>``","November 2020","",""
|
||||
"`3449 <https://wg21.link/LWG3449>`__","take_view and take_while_view's ``sentinel<false>`` not comparable with their const iterator","November 2020","",""
|
||||
"`3453 <https://wg21.link/LWG3453>`__","Generic code cannot call ``ranges::advance(i, s)``","November 2020","",""
|
||||
"`3455 <https://wg21.link/LWG3455>`__","Incorrect Postconditions on ``unique_ptr`` move assignment","November 2020","|Nothing To Do|",""
|
||||
"`3460 <https://wg21.link/LWG3460>`__","Unimplementable ``noop_coroutine_handle`` guarantees","November 2020","|Complete|","14.0"
|
||||
"`3461 <https://wg21.link/LWG3461>`__","``convertible_to``'s description mishandles cv-qualified ``void``","November 2020","|Nothing To Do|",""
|
||||
"`3465 <https://wg21.link/LWG3465>`__","``compare_partial_order_fallback`` requires ``F < E``","November 2020","|Complete|","14.0","|spaceship|"
|
||||
"`3466 <https://wg21.link/LWG3466>`__","Specify the requirements for ``promise``/``future``/``shared_future`` consistently","November 2020","|Nothing To Do|",""
|
||||
"`3467 <https://wg21.link/LWG3467>`__","``bool`` can't be an integer-like type","November 2020","|Complete|","14.0"
|
||||
"`3472 <https://wg21.link/LWG3472>`__","``counted_iterator`` is missing preconditions","November 2020","|Complete|","14.0","|ranges|"
|
||||
"`3473 <https://wg21.link/LWG3473>`__","Normative encouragement in non-normative note","November 2020","|Nothing To Do|","","|format|"
|
||||
"`3474 <https://wg21.link/LWG3474>`__","Nesting ``join_views`` is broken because of CTAD","November 2020","","","|ranges|"
|
||||
"`3460 <https://wg21.link/LWG3460>`__","Unimplementable ``noop_coroutine_handle`` guarantees","November 2020","",""
|
||||
"`3461 <https://wg21.link/LWG3461>`__","``convertible_to``'s description mishandles cv-qualified void","November 2020","",""
|
||||
"`3465 <https://wg21.link/LWG3465>`__","compare_partial_order_fallback requires ``F < E``","November 2020","",""
|
||||
"`3466 <https://wg21.link/LWG3466>`__","Specify the requirements for ``promise``/``future``/``shared_future`` consistently","November 2020","",""
|
||||
"`3467 <https://wg21.link/LWG3467>`__","``bool`` can't be an integer-like type","November 2020","",""
|
||||
"`3472 <https://wg21.link/LWG3472>`__","``counted_iterator`` is missing preconditions","November 2020","",""
|
||||
"`3473 <https://wg21.link/LWG3473>`__","Normative encouragement in non-normative note","November 2020","",""
|
||||
"`3474 <https://wg21.link/LWG3474>`__","Nesting ``join_views`` is broken because of CTAD","November 2020","",""
|
||||
"`3476 <https://wg21.link/LWG3476>`__","``thread`` and ``jthread`` constructors require that the parameters be move-constructible but never move construct the parameters","November 2020","",""
|
||||
"`3477 <https://wg21.link/LWG3477>`__","Simplify constraints for ``semiregular-box``","November 2020","","","|ranges|"
|
||||
"`3482 <https://wg21.link/LWG3482>`__","``drop_view``'s const begin should additionally require ``sized_range``","November 2020","|Complete|","14.0","|ranges|"
|
||||
"`3483 <https://wg21.link/LWG3483>`__","``transform_view::iterator``'s difference is overconstrained","November 2020","|Complete|","14.0","|ranges|"
|
||||
"`3477 <https://wg21.link/LWG3477>`__","Simplify constraints for semiregular-box","November 2020","",""
|
||||
"`3482 <https://wg21.link/LWG3482>`__","``drop_view``'s const begin should additionally require sized_range","November 2020","",""
|
||||
"`3483 <https://wg21.link/LWG3483>`__","``transform_view::iterator``'s difference is overconstrained","November 2020","",""
|
||||
"","","","",""
|
||||
"`3391 <https://wg21.link/LWG3391>`__","Problems with ``counted_iterator``/``move_iterator::base() const &``","February 2021","","","|ranges|"
|
||||
"`3433 <https://wg21.link/LWG3433>`__","``subrange::advance(n)`` has UB when ``n < 0``","February 2021","|Complete|","14.0","|ranges|"
|
||||
"`3490 <https://wg21.link/LWG3490>`__","``ranges::drop_while_view::begin()`` is missing a precondition","February 2021","|Nothing To Do|","","|ranges|"
|
||||
"`3492 <https://wg21.link/LWG3492>`__","Minimal improvements to ``elements_view::iterator``","February 2021","","","|ranges|"
|
||||
"`3494 <https://wg21.link/LWG3494>`__","Allow ranges to be conditionally borrowed","February 2021","Superseded by `P2017R1 <https://wg21.link/P2017R1>`__","","|ranges|"
|
||||
"`3495 <https://wg21.link/LWG3495>`__","``constexpr launder`` makes pointers to inactive members of unions usable","February 2021","|Nothing To Do|",""
|
||||
"`3500 <https://wg21.link/LWG3500>`__","``join_view::iterator::operator->()`` is bogus","February 2021","","","|ranges|"
|
||||
"`3502 <https://wg21.link/LWG3502>`__","``elements_view`` should not be allowed to return dangling reference","February 2021","","","|ranges|"
|
||||
"`3505 <https://wg21.link/LWG3505>`__","``split_view::outer-iterator::operator++`` misspecified","February 2021","","","|ranges|"
|
||||
"`3391 <https://wg21.link/LWG3391>`__","Problems with ``counted_iterator``/``move_iterator::base() const &``","February 2021","",""
|
||||
"`3433 <https://wg21.link/LWG3433>`__","``subrange::advance(n)`` has UB when ``n < 0``","February 2021","",""
|
||||
"`3490 <https://wg21.link/LWG3490>`__","``ranges::drop_while_view::begin()`` is missing a precondition","February 2021","",""
|
||||
"`3492 <https://wg21.link/LWG3492>`__","Minimal improvements to ``elements_view::iterator``","February 2021","",""
|
||||
"`3494 <https://wg21.link/LWG3494>`__","Allow ranges to be conditionally borrowed","February 2021","Superseded by `P2017R1 <https://wg21.link/P2017R1>`__",""
|
||||
"`3495 <https://wg21.link/LWG3495>`__","``constexpr launder`` makes pointers to inactive members of unions usable","February 2021","",""
|
||||
"`3500 <https://wg21.link/LWG3500>`__","``join_view::iterator::operator->()`` is bogus","February 2021","",""
|
||||
"`3502 <https://wg21.link/LWG3502>`__","``elements_view`` should not be allowed to return dangling reference","February 2021","",""
|
||||
"`3505 <https://wg21.link/LWG3505>`__","``split_view::outer-iterator::operator++`` misspecified","February 2021","",""
|
||||
"","","","",""
|
||||
`2774 <https://wg21.link/LWG2774>`__,"``std::function`` construction vs assignment","June 2021","",""
|
||||
`2818 <https://wg21.link/LWG2818>`__,"``::std::`` everywhere rule needs tweaking","June 2021","|Nothing To Do|",""
|
||||
`2818 <https://wg21.link/LWG2818>`__,"``::std::`` everywhere rule needs tweaking","June 2021","",""
|
||||
`2997 <https://wg21.link/LWG2997>`__,"LWG 491 and the specification of ``{forward_,}list::unique``","June 2021","",""
|
||||
`3410 <https://wg21.link/LWG3410>`__,"``lexicographical_compare_three_way`` is overspecified","June 2021","","","|spaceship|"
|
||||
`3410 <https://wg21.link/LWG3410>`__,"``lexicographical_compare_three_way`` is overspecified","June 2021","",""
|
||||
`3430 <https://wg21.link/LWG3430>`__,"``std::fstream`` & co. should be constructible from string_view","June 2021","",""
|
||||
`3462 <https://wg21.link/LWG3462>`__,"§[formatter.requirements]: Formatter requirements forbid use of ``fc.arg()``","June 2021","","","|format|"
|
||||
`3481 <https://wg21.link/LWG3481>`__,"``viewable_range`` mishandles lvalue move-only views","June 2021","Superseded by `P2415R2 <https://wg21.link/P2415R2>`__","","|ranges|"
|
||||
`3506 <https://wg21.link/LWG3506>`__,"Missing allocator-extended constructors for ``priority_queue``","June 2021","|Complete|","14.0"
|
||||
`3517 <https://wg21.link/LWG3517>`__,"``join_view::iterator``'s ``iter_swap`` is underconstrained","June 2021","","","|ranges|"
|
||||
`3518 <https://wg21.link/LWG3518>`__,"Exception requirements on char trait operations unclear","June 2021","|Nothing To Do|",""
|
||||
`3519 <https://wg21.link/LWG3519>`__,"Incomplete synopses for ``<random>`` classes","June 2021","",""
|
||||
`3520 <https://wg21.link/LWG3520>`__,"``iter_move`` and ``iter_swap`` are inconsistent for ``transform_view::iterator``","June 2021","|Complete|","14.0","|ranges|"
|
||||
`3521 <https://wg21.link/LWG3521>`__,"Overly strict requirements on ``qsort`` and ``bsearch``","June 2021","|Nothing To Do|",""
|
||||
`3522 <https://wg21.link/LWG3522>`__,"Missing requirement on ``InputIterator`` template parameter for ``priority_queue`` constructors","June 2021","|Complete|","14.0","|ranges|"
|
||||
`3523 <https://wg21.link/LWG3523>`__,"``iota_view::sentinel`` is not always ``iota_view``'s sentinel","June 2021","","","|ranges|"
|
||||
`3462 <https://wg21.link/LWG3462>`__,"§[formatter.requirements]: Formatter requirements forbid use of ``fc.arg()``","June 2021","",""
|
||||
`3481 <https://wg21.link/LWG3481>`__,"``viewable_range`` mishandles lvalue move-only views","June 2021","",""
|
||||
`3506 <https://wg21.link/LWG3506>`__,"Missing allocator-extended constructors for ``priority_queue``","June 2021","",""
|
||||
`3517 <https://wg21.link/LWG3517>`__,"``join_view::iterator``'s ``iter_swap`` is underconstrained","June 2021","",""
|
||||
`3518 <https://wg21.link/LWG3518>`__,"Exception requirements on char trait operations unclear","June 2021","",""
|
||||
`3519 <https://wg21.link/LWG3519>`__,"Incomplete synopses for <random> classes","June 2021","",""
|
||||
`3520 <https://wg21.link/LWG3520>`__,"``iter_move`` and ``iter_swap`` are inconsistent for ``transform_view::iterator``","June 2021","",""
|
||||
`3521 <https://wg21.link/LWG3521>`__,"Overly strict requirements on ``qsort`` and ``bsearch``","June 2021","",""
|
||||
`3522 <https://wg21.link/LWG3522>`__,"Missing requirement on ``InputIterator`` template parameter for ``priority_queue`` constructors","June 2021","",""
|
||||
`3523 <https://wg21.link/LWG3523>`__,"``iota_view::sentinel`` is not always ``iota_view``'s sentinel","June 2021","",""
|
||||
`3526 <https://wg21.link/LWG3526>`__,"Return types of ``uses_allocator_construction_args`` unspecified","June 2021","",""
|
||||
`3527 <https://wg21.link/LWG3527>`__,"``uses_allocator_construction_args`` handles rvalue pairs of rvalue references incorrectly","June 2021","",""
|
||||
`3528 <https://wg21.link/LWG3528>`__,"``make_from_tuple`` can perform (the equivalent of) a C-style cast","June 2021","",""
|
||||
`3529 <https://wg21.link/LWG3529>`__,"``priority_queue(first, last)`` should construct ``c`` with ``(first, last)``","June 2021","|Complete|","14.0"
|
||||
`3529 <https://wg21.link/LWG3529>`__,"``priority_queue(first, last)`` should construct ``c`` with ``(first, last)``","June 2021","",""
|
||||
`3530 <https://wg21.link/LWG3530>`__,"``BUILTIN-PTR-MEOW`` should not opt the type out of syntactic checks","June 2021","",""
|
||||
`3532 <https://wg21.link/LWG3532>`__,"``split_view<V, P>::inner-iterator<true>::operator++(int)`` should depend on ``Base``","June 2021","","","|ranges|"
|
||||
`3533 <https://wg21.link/LWG3533>`__,"Make ``base() const &`` consistent across iterator wrappers that supports ``input_iterators``","June 2021","|Complete|","14.0","|ranges|"
|
||||
`3536 <https://wg21.link/LWG3536>`__,"Should ``chrono::from_stream()`` assign zero to duration for failure?","June 2021","","","|chrono|"
|
||||
`3539 <https://wg21.link/LWG3539>`__,"``format_to`` must not copy models of ``output_iterator<const charT&>``","June 2021","","","|format|"
|
||||
`3540 <https://wg21.link/LWG3540>`__,"§[format.arg] There should be no const in ``basic_format_arg(const T* p)``","June 2021","|Complete|","14.0","|format|"
|
||||
`3541 <https://wg21.link/LWG3541>`__,"``indirectly_readable_traits`` should be SFINAE-friendly for all types","June 2021","|Complete|","14.0","|ranges|"
|
||||
`3542 <https://wg21.link/LWG3542>`__,"``basic_format_arg`` mishandles ``basic_string_view`` with custom traits","June 2021","|Complete|","14.0","|format|"
|
||||
`3543 <https://wg21.link/LWG3543>`__,"Definition of when ``counted_iterators`` refer to the same sequence isn't quite right","June 2021","|Nothing To Do|","","|ranges|"
|
||||
`3544 <https://wg21.link/LWG3544>`__,"``format-arg-store::args`` is unintentionally not exposition-only","June 2021","|Complete|","14.0","|format|"
|
||||
`3546 <https://wg21.link/LWG3546>`__,"``common_iterator``'s postfix-proxy is not quite right","June 2021","","","|ranges|"
|
||||
`3532 <https://wg21.link/LWG3532>`__,"``split_view<V, P>::inner-iterator<true>::operator++(int)`` should depend on ``Base``","June 2021","",""
|
||||
`3533 <https://wg21.link/LWG3533>`__,"Make ``base() const &`` consistent across iterator wrappers that supports ``input_iterators``","June 2021","",""
|
||||
`3536 <https://wg21.link/LWG3536>`__,"Should ``chrono::from_stream()`` assign zero to duration for failure?","June 2021","",""
|
||||
`3539 <https://wg21.link/LWG3539>`__,"``format_to`` must not copy models of ``output_iterator<const charT&>``","June 2021","",""
|
||||
`3540 <https://wg21.link/LWG3540>`__,"§[format.arg] There should be no const in ``basic_format_arg(const T* p)``","June 2021","",""
|
||||
`3541 <https://wg21.link/LWG3541>`__,"``indirectly_readable_traits`` should be SFINAE-friendly for all types","June 2021","",""
|
||||
`3542 <https://wg21.link/LWG3542>`__,"``basic_format_arg`` mishandles ``basic_string_view`` with custom traits","June 2021","",""
|
||||
`3543 <https://wg21.link/LWG3543>`__,"Definition of when ``counted_iterators`` refer to the same sequence isn't quite right","June 2021","",""
|
||||
`3544 <https://wg21.link/LWG3544>`__,"``format-arg-store::args`` is unintentionally not exposition-only","June 2021","",""
|
||||
`3546 <https://wg21.link/LWG3546>`__,"``common_iterator``'s postfix-proxy is not quite right","June 2021","",""
|
||||
`3548 <https://wg21.link/LWG3548>`__,"``shared_ptr`` construction from ``unique_ptr`` should move (not copy) the deleter","June 2021","",""
|
||||
`3549 <https://wg21.link/LWG3549>`__,"``view_interface`` is overspecified to derive from ``view_base``","June 2021","|Complete|","14.0","|ranges|"
|
||||
`3551 <https://wg21.link/LWG3551>`__,"``borrowed_{iterator,subrange}_t`` are overspecified","June 2021","|Nothing To Do|","","|ranges|"
|
||||
`3549 <https://wg21.link/LWG3549>`__,"``view_interface`` is overspecified to derive from ``view_base``","June 2021","",""
|
||||
`3551 <https://wg21.link/LWG3551>`__,"``borrowed_{iterator,subrange}_t`` are overspecified","June 2021","",""
|
||||
`3552 <https://wg21.link/LWG3552>`__,"Parallel specialized memory algorithms should require forward iterators","June 2021","",""
|
||||
`3553 <https://wg21.link/LWG3553>`__,"Useless constraint in ``split_view::outer-iterator::value_type::begin()``","June 2021","","","|ranges|"
|
||||
`3555 <https://wg21.link/LWG3555>`__,"``{transform,elements}_view::iterator::iterator_concept`` should consider const-qualification of the underlying range","June 2021","","","|ranges|"
|
||||
"","","","",""
|
||||
`2191 <https://wg21.link/LWG2191>`__,"Incorrect specification of ``match_results(match_results&&)``","October 2021","|Nothing To Do|",""
|
||||
`2381 <https://wg21.link/LWG2381>`__,"Inconsistency in parsing floating point numbers","October 2021","",""
|
||||
`2762 <https://wg21.link/LWG2762>`__,"``unique_ptr operator*()`` should be ``noexcept``","October 2021","",""
|
||||
`3121 <https://wg21.link/LWG3121>`__,"``tuple`` constructor constraints for ``UTypes&&...`` overloads","October 2021","",""
|
||||
`3123 <https://wg21.link/LWG3123>`__,"``duration`` constructor from representation shouldn't be effectively non-throwing","October 2021","","","|chrono|"
|
||||
`3146 <https://wg21.link/LWG3146>`__,"Excessive unwrapping in ``std::ref/cref``","October 2021","|Complete|","14.0"
|
||||
`3152 <https://wg21.link/LWG3152>`__,"``common_type`` and ``common_reference`` have flaws in common","October 2021","",""
|
||||
`3293 <https://wg21.link/LWG3293>`__,"``move_iterator operator+()`` has incorrect constraints","October 2021","","","|ranges|"
|
||||
`3361 <https://wg21.link/LWG3361>`__,"``safe_range<SomeRange&>`` case","October 2021","|Nothing To Do|","","|ranges|"
|
||||
`3392 <https://wg21.link/LWG3392>`__,"``ranges::distance()`` cannot be used on a move-only iterator with a sized sentinel","October 2021","|Complete|","14.0","|ranges|"
|
||||
`3407 <https://wg21.link/LWG3407>`__,"Some problems with the wording changes of P1739R4","October 2021","","","|ranges|"
|
||||
`3422 <https://wg21.link/LWG3422>`__,"Issues of ``seed_seq``'s constructors","October 2021","|Complete|","14.0"
|
||||
`3470 <https://wg21.link/LWG3470>`__,"``convertible-to-non-slicing`` seems to reject valid case","October 2021","|Complete|","14.0","|ranges|"
|
||||
`3480 <https://wg21.link/LWG3480>`__,"``directory_iterator`` and ``recursive_directory_iterator`` are not C++20 ranges","October 2021","|Complete|","14.0","|ranges|"
|
||||
`3498 <https://wg21.link/LWG3498>`__,"Inconsistent ``noexcept``-specifiers for ``basic_syncbuf``","October 2021","",""
|
||||
`3535 <https://wg21.link/LWG3535>`__,"``join_view::iterator::iterator_category`` and ``::iterator_concept`` lie","October 2021","","","|ranges|"
|
||||
`3554 <https://wg21.link/LWG3554>`__,"``chrono::parse`` needs ``const charT*`` and ``basic_string_view<charT>`` overloads","October 2021","","","|chrono|"
|
||||
`3557 <https://wg21.link/LWG3557>`__,"The ``static_cast`` expression in ``convertible_to`` has the wrong operand","October 2021","|Complete|","14.0"
|
||||
`3559 <https://wg21.link/LWG3559>`__,"Semantic requirements of ``sized_range`` is circular","October 2021","|Nothing To Do|","","|ranges|"
|
||||
`3560 <https://wg21.link/LWG3560>`__,"``ranges::equal`` and ``ranges::is_permutation`` should short-circuit for ``sized_ranges``","October 2021","","","|ranges|"
|
||||
`3561 <https://wg21.link/LWG3561>`__,"Issue with internal counter in ``discard_block_engine``","October 2021","",""
|
||||
`3563 <https://wg21.link/LWG3563>`__,"``keys_view`` example is broken","October 2021","","","|ranges|"
|
||||
`3566 <https://wg21.link/LWG3566>`__,"Constraint recursion for ``operator<=>(optional<T>, U)``","October 2021","","","|spaceship|"
|
||||
`3567 <https://wg21.link/LWG3567>`__,"Formatting move-only iterators take two","October 2021","","","|format|"
|
||||
`3568 <https://wg21.link/LWG3568>`__,"``basic_istream_view`` needs to initialize ``value_``","October 2021","","","|ranges|"
|
||||
`3570 <https://wg21.link/LWG3570>`__,"``basic_osyncstream::emit`` should be an unformatted output function","October 2021","",""
|
||||
`3571 <https://wg21.link/LWG3571>`__,"``flush_emit`` should set ``badbit`` if the ``emit`` call fails","October 2021","",""
|
||||
`3572 <https://wg21.link/LWG3572>`__,"``copyable-box`` should be fully ``constexpr``","October 2021","|Complete|","14.0","|ranges|"
|
||||
`3573 <https://wg21.link/LWG3573>`__,"Missing Throws element for ``basic_string_view(It begin, End end)``","October 2021","|Complete|","14.0"
|
||||
`3574 <https://wg21.link/LWG3574>`__,"``common_iterator`` should be completely ``constexpr``-able","October 2021","|Complete|","14.0","|ranges|"
|
||||
`3580 <https://wg21.link/LWG3580>`__,"``iota_view``'s ``iterator``'s binary ``operator+`` should be improved","October 2021","|Complete|","14.0","|ranges|"
|
||||
`3581 <https://wg21.link/LWG3581>`__,"The range constructor makes ``basic_string_view`` not trivially move constructible","October 2021","|Complete|","14.0","|ranges|"
|
||||
`3585 <https://wg21.link/LWG3585>`__,"``variant`` converting assignment with immovable alternative","October 2021","",""
|
||||
`3589 <https://wg21.link/LWG3589>`__,"The ``const`` lvalue reference overload of ``get`` for ``subrange`` does not constrain ``I`` to be ``copyable`` when ``N == 0``","October 2021","|Complete|","14.0","|ranges|"
|
||||
`3590 <https://wg21.link/LWG3590>`__,"``split_view::base() const &`` is overconstrained","October 2021","","","|ranges|"
|
||||
`3591 <https://wg21.link/LWG3591>`__,"``lazy_split_view<input_view>::inner-iterator::base() &&`` invalidates outer iterators","October 2021","","","|ranges|"
|
||||
`3592 <https://wg21.link/LWG3592>`__,"``lazy_split_view`` needs to check the simpleness of Pattern","October 2021","","","|ranges|"
|
||||
`3593 <https://wg21.link/LWG3593>`__,"Several iterators' ``base() const &`` and ``lazy_split_view::outer-iterator::value_type::end()`` missing ``noexcept``","October 2021","","","|ranges|"
|
||||
`3595 <https://wg21.link/LWG3595>`__,"Exposition-only classes proxy and postfix-proxy for ``common_iterator`` should be fully ``constexpr``","October 2021","|Complete|","14.0","|ranges|"
|
||||
"","","","",""
|
||||
`3645 <https://wg21.link/LWG3645>`__,"``resize_and_overwrite`` is overspecified to call its callback with lvalues", "Not voted in","|Complete|","14.0",""
|
||||
`3553 <https://wg21.link/LWG3553>`__,"Useless constraint in ``split_view::outer-iterator::value_type::begin()``","June 2021","",""
|
||||
`3555 <https://wg21.link/LWG3555>`__,"``{transform,elements}_view::iterator::iterator_concept`` should consider const-qualification of the underlying range","June 2021","",""
|
||||
"","","","",""
|
||||
|
Can't render this file because it has a wrong number of fields in line 2.
|
@ -15,26 +15,11 @@
|
||||
"`P0448R4 <https://wg21.link/P0448R4>`__","LWG","A strstream replacement using span<charT> as buffer","June 2021","",""
|
||||
"`P1132R8 <https://wg21.link/P1132R8>`__","LWG","out_ptr - a scalable output pointer abstraction","June 2021","",""
|
||||
"`P1328R1 <https://wg21.link/P1328R1>`__","LWG","Making std::type_info::operator== constexpr","June 2021","",""
|
||||
"`P1425R4 <https://wg21.link/P1425R4>`__","LWG","Iterators pair constructors for stack and queue","June 2021","|Complete|","14.0"
|
||||
"`P1425R4 <https://wg21.link/P1425R4>`__","LWG","Iterators pair constructors for stack and queue","June 2021","",""
|
||||
"`P1518R2 <https://wg21.link/P1518R2>`__","LWG","Stop overconstraining allocators in container deduction guides","June 2021","|Complete|","13.0"
|
||||
"`P1659R3 <https://wg21.link/P1659R3>`__","LWG","starts_with and ends_with","June 2021","",""
|
||||
"`P1951R1 <https://wg21.link/P1951R1>`__","LWG","Default Arguments for pair Forwarding Constructor","June 2021","|Complete|","14.0"
|
||||
"`P1989R2 <https://wg21.link/P1989R2>`__","LWG","Range constructor for std::string_view","June 2021","|Complete|","14.0"
|
||||
"`P1951R1 <https://wg21.link/P1951R1>`__","LWG","Default Arguments for pair Forwarding Constructor","June 2021","",""
|
||||
"`P1989R2 <https://wg21.link/P1989R2>`__","LWG","Range constructor for std::string_view","June 2021","",""
|
||||
"`P2136R3 <https://wg21.link/P2136R3>`__","LWG","invoke_r","June 2021","",""
|
||||
"`P2166R1 <https://wg21.link/P2166R1>`__","LWG","A Proposal to Prohibit std::basic_string and std::basic_string_view construction from nullptr","June 2021","|Complete|","13.0"
|
||||
"","","","","",""
|
||||
"`P0288R9 <https://wg21.link/P0288R9>`__","LWG","``any_invocable``","October 2021","",""
|
||||
"`P0798R8 <https://wg21.link/P0798R8>`__","LWG","Monadic operations for ``std::optional``","October 2021","|Complete|","14.0"
|
||||
"`P0849R8 <https://wg21.link/P0849R8>`__","LWG","``auto(x)``: ``DECAY_COPY`` in the language","October 2021","|Complete|","14.0"
|
||||
"`P1072R10 <https://wg21.link/P1072R10>`__","LWG","``basic_string::resize_and_overwrite``","October 2021","|Complete|","14.0"
|
||||
"`P1147R1 <https://wg21.link/P1147R1>`__","LWG","Printing ``volatile`` Pointers","October 2021","|Complete|","14.0"
|
||||
"`P1272R4 <https://wg21.link/P1272R4>`__","LWG","Byteswapping for fun&&nuf","October 2021","|Complete|","14.0"
|
||||
"`P1675R2 <https://wg21.link/P1675R2>`__","LWG","``rethrow_exception`` must be allowed to copy","October 2021","",""
|
||||
"`P2077R3 <https://wg21.link/P2077R3>`__","LWG","Heterogeneous erasure overloads for associative containers","October 2021","",""
|
||||
"`P2251R1 <https://wg21.link/P2251R1>`__","LWG","Require ``span`` & ``basic_string_view`` to be Trivially Copyable","October 2021","|Complete|","14.0"
|
||||
"`P2301R1 <https://wg21.link/P2301R1>`__","LWG","Add a ``pmr`` alias for ``std::stacktrace``","October 2021","",""
|
||||
"`P2321R2 <https://wg21.link/P2321R2>`__","LWG","``zip``","October 2021","|In Progress|",""
|
||||
"`P2340R1 <https://wg21.link/P2340R1>`__","LWG","Clarifying the status of the 'C headers'","October 2021","",""
|
||||
"`P2393R1 <https://wg21.link/P2393R1>`__","LWG","Cleaning up ``integer``-class types","October 2021","",""
|
||||
"`P2401R0 <https://wg21.link/P2401R0>`__","LWG","Add a conditional ``noexcept`` specification to ``std::exchange``","October 2021","|Complete|","14.0"
|
||||
"","","","","",""
|
||||
|
|
@ -39,6 +39,10 @@ Misc. Items and TODOs
|
||||
(Please mark all Format-related TODO comments with the string ``TODO FMT``, so we
|
||||
can find them easily.)
|
||||
|
||||
* C++23 may break the ABI with `P2216 <https://wg21.link/P2216>`_.
|
||||
This ABI break may be backported to C++20. Therefore the library will not
|
||||
be available on platforms where the ABI break is an issue.
|
||||
|
||||
|
||||
Paper and Issue Status
|
||||
======================
|
||||
|
@ -1,10 +1,31 @@
|
||||
Number,Name,Assignee,Patch,Status,First released version
|
||||
`P0645 <https://wg21.link/P0645>`_,"Text Formatting",Mark de Wever,,|Complete|,Clang 14
|
||||
`P1652 <https://wg21.link/P1652>`_,"Printf corner cases in std::format",Mark de Wever,"`D103433 <https://reviews.llvm.org/D103433>`__, `D114001 <https://reviews.llvm.org/D114001>`__",|Complete|,Clang 14
|
||||
`P1892 <https://wg21.link/P1892>`_,"Extended locale-specific presentation specifiers for std::format",Mark de Wever,`D103368 <https://reviews.llvm.org/D103368>`__,|Complete|,Clang 14
|
||||
`P1868 <https://wg21.link/P1868>`_,"width: clarifying units of width and precision in std::format (Implements the unicode support.)",Mark de Wever,"`D103413 <https://reviews.llvm.org/D103413>`__ `D103425 <https://reviews.llvm.org/D103425>`__ `D103670 <https://reviews.llvm.org/D103670>`__",|Complete|,Clang 14
|
||||
`P2216 <https://wg21.link/P2216>`_,"std::format improvements",Mark de Wever,,|In Progress|,
|
||||
`P2418 <https://wg21.link/P2418>`__,"Add support for ``std::generator``-like types to ``std::format``",Mark de Wever,,|In Progress|,
|
||||
`P0645 <https://wg21.link/P0645>`_,"Text Formatting",Mark de Wever,,|partial|,
|
||||
`P1652 <https://wg21.link/P1652>`_,"Printf corner cases in std::format",Mark de Wever,`D103433 <https://reviews.llvm.org/D103433>`__,Review,
|
||||
`P1892 <https://wg21.link/P1892>`_,"Extended locale-specific presentation specifiers for std::format",Mark de Wever,`D103368 <https://reviews.llvm.org/D103368>`__,Review,
|
||||
`P1868 <https://wg21.link/P1868>`_,"width: clarifying units of width and precision in std::format (Implements the unicode support.)",Mark de Wever,"`D103413 <https://reviews.llvm.org/D103413>`__ `D103425 <https://reviews.llvm.org/D103425>`__ `D103670 <https://reviews.llvm.org/D103670>`__",Review,
|
||||
`P2216 <https://wg21.link/P2216>`_,"std::format improvements",,,,
|
||||
`LWG-3242 <https://wg21.link/LWG3242>`_,"std::format: missing rules for arg-id in width and precision",Mark de Wever,`D103368 <https://reviews.llvm.org/D103368>`__,Review,
|
||||
`LWG-3243 <https://wg21.link/LWG3243>`_,"std::format and negative zeroes",,,,
|
||||
`LWG-3246 <https://wg21.link/LWG3246>`_,"What are the constraints on the template parameter of basic_format_arg?",,,,
|
||||
`LWG-3248 <https://wg21.link/LWG3248>`_,"std::format #b, #B, #o, #x, and #X presentation types misformat negative numbers",Mark de Wever,`D103433 <https://reviews.llvm.org/D103433>`__,Review,
|
||||
`LWG-3250 <https://wg21.link/LWG3250>`_,"std::format: # (alternate form) for NaN and inf",,,,
|
||||
`LWG-3327 <https://wg21.link/LWG3327>`_,"Format alignment specifiers vs. text direction",,,|Nothing To Do|,
|
||||
`LWG-3340 <https://wg21.link/LWG3340>`_,"Formatting functions should throw on argument/format string mismatch in [format.functions]",,,,
|
||||
`LWG-3371 <https://wg21.link/LWG3371>`_,"visit_format_arg and make_format_args are not hidden friends",Mark de Wever,`D103357 <https://llvm.org/D103357>`__,Review,
|
||||
`LWG-3372 <https://wg21.link/LWG3372>`_,"vformat_to should not try to deduce Out twice",,,,
|
||||
`LWG-3373 <https://wg21.link/LWG3373>`_,"{to,from}_chars_result and format_to_n_result need the 'we really mean what we say'",,,,
|
||||
`LWG-3462 <https://wg21.link/LWG3462>`_,"§[formatter.requirements]: Formatter requirements forbid use of fc.arg()",,,,
|
||||
`LWG-3539 <https://wg21.link/LWG3539>`_,"format_to must not copy models of output_iterator<const charT&>",,,,
|
||||
`LWG-3540 <https://wg21.link/LWG3540>`_,"§[format.arg] There should be no const in basic_format_arg(const T* p)",,,,
|
||||
`LWG-3541 <https://wg21.link/LWG3541>`_,"indirectly_readable_traits should be SFINAE-friendly for all types",,,,
|
||||
`LWG-3542 <https://wg21.link/LWG3542>`_,"basic_format_arg mishandles basic_string_view with custom traits",,,,
|
||||
`LWG-3544 <https://wg21.link/LWG3544>`_,"format-arg-store::args is unintentionally not exposition-only",,,,
|
||||
|
||||
`P1361 <https://wg21.link/P1361>`_,"Integration of chrono with text formatting",,,|Not Started|,
|
||||
`P2372 <https://wg21.link/P2372>`__,"Fixing locale handling in chrono formatters",,,|Not Started|,
|
||||
`P1361 <https://wg21.link/P1361>`_,"Integration of chrono with text formatting",,,,
|
||||
`LWG-3218 <https://wg21.link/LWG3218>`_,"Modifier for %d parse flag does not match POSIX and format specification",,,,
|
||||
`LWG-3230 <https://wg21.link/LWG3230>`_,"Format specifier %y/%Y is missing locale alternative versions",,,,
|
||||
`LWG-3241 <https://wg21.link/LWG3241>`_,"chrono-spec grammar ambiguity in [time.format]",,,,
|
||||
`LWG-3262 <https://wg21.link/LWG3262>`_,"Formatting of negative durations is not specified",,,,
|
||||
`LWG-3270 <https://wg21.link/LWG3270>`_,"Parsing and formatting %j with durations",,,,
|
||||
`LWG-3272 <https://wg21.link/LWG3272>`_,"%I%p should parse/format duration since midnight",,,,
|
||||
`LWG-3332 <https://wg21.link/LWG3332>`_,"Issue in [time.format]",,,,
|
||||
|
|
@ -1,49 +1,48 @@
|
||||
Section,Description,Dependencies,Assignee,Patch,Status,First released version
|
||||
`[charconv.to.chars] <https://wg21.link/charconv.to.chars>`_,"Fix integral conformance",,Mark de Wever,`D100722 <https://llvm.org/D100722>`__,|Complete|,Clang 13
|
||||
`[charconv.to.chars] <https://wg21.link/charconv.to.chars>`_,"Add floating-point conversion",`D100722 <https://llvm.org/D100722>`__,"Mark de Wever (Code provided by Stephan T. Lavavej of Microsoft)",`D70631 <https://llvm.org/D70631>`__,|Complete|,Clang 14
|
||||
`[format.error] <https://wg21.link/format.error>`_,"Class format_error",,Mark de Wever,`D92214 <https://llvm.org/D92214>`__,|Complete|,Clang 13
|
||||
`[format.parse.ctx] <https://wg21.link/format.parse.ctx>`_,"Class template basic_format_parse_context",,Mark de Wever,`D93166 <https://llvm.org/D93166>`__,|Complete|,Clang 13
|
||||
`[format.context] <https://wg21.link/format.context>`_,"Class template basic_format_context",,Mark de Wever,`D103357 <https://llvm.org/D103357>`__,|Complete|,Clang 14
|
||||
`[format.args] <https://wg21.link/format.args>`_,"Class template basic_format_args",,Mark de Wever,`D103357 <https://llvm.org/D103357>`__,|Complete|,Clang 14
|
||||
`[format.arg] <https://wg21.link/format.arg>`_,"Class template basic_format_arg",,Mark de Wever,`D103357 <https://llvm.org/D103357>`__,|Complete|,Clang 14
|
||||
`[format.arg] <https://wg21.link/format.arg>`_,"Class template basic_format_arg - handle",,Mark de Wever,,|Complete|,Clang 14
|
||||
`[format.arg] <https://wg21.link/format.arg>`_,"Class template basic_format_arg - pointers",,Mark de Wever,,|Complete|,Clang 14
|
||||
`[format.arg.store] <https://wg21.link/format.arg.store>`_,"Class template format-arg-store",,Mark de Wever,`D103357 <https://llvm.org/D103357>`__,|Complete|,Clang 14
|
||||
`[format.formatter.spec] <https://wg21.link/format.formatter.spec>`_,"Formatter specializations - character types",,Mark de Wever,"`D96664 <https://llvm.org/D96664>`__ `D103466 <https://llvm.org/D103466>`__",|Complete|,Clang 14
|
||||
`[format.formatter.spec] <https://wg21.link/format.formatter.spec>`_,"Formatter specializations - string types",,Mark de Wever,"`D96664 <https://llvm.org/D96664>`__ `D103425 <https://reviews.llvm.org/D103425>`__",|Complete|,Clang 14
|
||||
`[format.formatter.spec] <https://wg21.link/format.formatter.spec>`_,"Formatter specializations - boolean type",,Mark de Wever,"`D96664 <https://llvm.org/D96664>`__ `D103670 <https://reviews.llvm.org/D103670>`__",|Complete|,Clang 14
|
||||
`[format.formatter.spec] <https://wg21.link/format.formatter.spec>`_,"Formatter specializations - integral types",,Mark de Wever,"`D96664 <https://llvm.org/D96664>`__ `D103433 <https://reviews.llvm.org/D103433>`__",|Complete|,Clang 14
|
||||
`[format.formatter.spec] <https://wg21.link/format.formatter.spec>`_,"Formatter specializations - floating-point types",`D70631 <https://llvm.org/D70631>`__,Mark de Wever,`D114001 <https://reviews.llvm.org/D114001>`__,|Complete|,Clang 14
|
||||
`[format.formatter.spec] <https://wg21.link/format.formatter.spec>`_,"Formatter specializations - pointer types",,Mark de Wever,,|Complete|,Clang 14
|
||||
`[format.string.std] <https://wg21.link/format.string.std>`_,"Standard format specifiers - character types",,Mark de Wever,`D103368 <https://reviews.llvm.org/D103368>`__,|Complete|,Clang 14
|
||||
`[format.string.std] <https://wg21.link/format.string.std>`_,"Standard format specifiers - string types",`D103379 <https://reviews.llvm.org/D103379>`__,Mark de Wever,"`D103368 <https://reviews.llvm.org/D103368>`__ `D103413 <https://reviews.llvm.org/D103413>`__",|Complete|,Clang 14
|
||||
`[format.string.std] <https://wg21.link/format.string.std>`_,"Standard format specifiers - boolean type",`D103379 <https://reviews.llvm.org/D103379>`__,Mark de Wever,"`D103368 <https://reviews.llvm.org/D103368>`__ `D103413 <https://reviews.llvm.org/D103413>`__",|Complete|,Clang 14
|
||||
`[format.string.std] <https://wg21.link/format.string.std>`_,"Standard format specifiers - integral types",,Mark de Wever,`D103368 <https://reviews.llvm.org/D103368>`__,|Complete|,Clang 14
|
||||
`[format.string.std] <https://wg21.link/format.string.std>`_,"Standard format specifiers - floating-point types",,Mark de Wever,`D114001 <https://reviews.llvm.org/D114001>`__,|Complete|,Clang 14
|
||||
`[format.string.std] <https://wg21.link/format.string.std>`_,"Standard format specifiers - pointer types",,Mark de Wever,,|Complete|,Clang 14
|
||||
`[format.functions] <https://wg21.link/format.functions>`_,"Format functions - format(string_view fmt, const Args&... args);",,Mark de Wever,`D96664 <https://llvm.org/D96664>`__,|Complete|,Clang 14
|
||||
`[format.functions] <https://wg21.link/format.functions>`_,"Format functions - format(wstring_view fmt, const Args&... args);",,Mark de Wever,`D96664 <https://llvm.org/D96664>`__,|Complete|,Clang 14
|
||||
`[format.functions] <https://wg21.link/format.functions>`_,"Format functions - format(const locale& loc, string_view fmt, const Args&... args);",,Mark de Wever,`D96664 <https://llvm.org/D96664>`__,|Complete|,Clang 14
|
||||
`[format.functions] <https://wg21.link/format.functions>`_,"Format functions - format(const locale& loc, wstring_view fmt, const Args&... args);",,Mark de Wever,`D96664 <https://llvm.org/D96664>`__,|Complete|,Clang 14
|
||||
`[format.functions] <https://wg21.link/format.functions>`_,"Format functions - vformat(string_view fmt, format_args args);",,Mark de Wever,`D96664 <https://llvm.org/D96664>`__,|Complete|,Clang 14
|
||||
`[format.functions] <https://wg21.link/format.functions>`_,"Format functions - vformat(wstring_view fmt, wformat_args args);",,Mark de Wever,`D96664 <https://llvm.org/D96664>`__,|Complete|,Clang 14
|
||||
`[format.functions] <https://wg21.link/format.functions>`_,"Format functions - vformat(const locale& loc, string_view fmt, format_args args);",,Mark de Wever,`D96664 <https://llvm.org/D96664>`__,|Complete|,Clang 14
|
||||
`[format.functions] <https://wg21.link/format.functions>`_,"Format functions - vformat(const locale& loc, wstring_view fmt, wformat_args args);",,Mark de Wever,`D96664 <https://llvm.org/D96664>`__,|Complete|,Clang 14
|
||||
`[format.functions] <https://wg21.link/format.functions>`_,"Format functions - format_to(Out out, wstring_view fmt, const Args&... args);",,Mark de Wever,`D96664 <https://llvm.org/D96664>`__,|Complete|,Clang 14
|
||||
`[format.functions] <https://wg21.link/format.functions>`_,"Format functions - format_to(Out out, const locale& loc, wstring_view fmt, const Args&... args);",,Mark de Wever,`D96664 <https://llvm.org/D96664>`__,|Complete|,Clang 14
|
||||
`[format.functions] <https://wg21.link/format.functions>`_,"Format functions - vformat_to(Out out, string_view fmt, format_args_t<type_identity_t<Out>, char> args);",,Mark de Wever,`D96664 <https://llvm.org/D96664>`__,|Complete|,Clang 14
|
||||
`[format.functions] <https://wg21.link/format.functions>`_,"Format functions - vformat_to(Out out, wstring_view fmt, format_args_t<type_identity_t<Out>, char> args);",,Mark de Wever,`D96664 <https://llvm.org/D96664>`__,|Complete|,Clang 14
|
||||
`[format.functions] <https://wg21.link/format.functions>`_,"Format functions - vformat_to(Out out, const locale& loc, string_view fmt, format_args_t<type_identity_t<Out>, char> args);",,Mark de Wever,`D96664 <https://llvm.org/D96664>`__,|Complete|,Clang 14
|
||||
`[format.functions] <https://wg21.link/format.functions>`_,"Format functions - vformat_to(Out out, const locale& loc, wstring_view fmt,format_args_t<type_identity_t<Out>, wchar_t> args);",,Mark de Wever,`D96664 <https://llvm.org/D96664>`__,|Complete|,Clang 14
|
||||
`[format.functions] <https://wg21.link/format.functions>`_,"Format functions - format_to_n(Out out, iter_difference_t<Out> n, string_view fmt, const Args&... args);",,Mark de Wever,`D96664 <https://llvm.org/D96664>`__,|Complete|,Clang 14
|
||||
`[format.functions] <https://wg21.link/format.functions>`_,"Format functions - format_to_n(Out out, iter_difference_t<Out> n, wstring_view fmt, const Args&... args);",,Mark de Wever,`D96664 <https://llvm.org/D96664>`__,|Complete|,Clang 14
|
||||
`[format.functions] <https://wg21.link/format.functions>`_,"Format functions - format_to_n_result<Out> format_to_n(Out out, iter_difference_t<Out> n, const locale& loc, string_view fmt, const Args&... args);",,Mark de Wever,`D96664 <https://llvm.org/D96664>`__,|Complete|,Clang 14
|
||||
`[format.functions] <https://wg21.link/format.functions>`_,"Format functions - format_to_n_result<Out> format_to_n(Out out, iter_difference_t<Out> n, const locale& loc, wstring_view fmt, const Args&... args);",,Mark de Wever,`D96664 <https://llvm.org/D96664>`__,|Complete|,Clang 14
|
||||
`[format.functions] <https://wg21.link/format.functions>`_,"Format functions - formatted_size(string_view fmt, const Args&... args);",,Mark de Wever,`D96664 <https://llvm.org/D96664>`__,|Complete|,Clang 14
|
||||
`[format.functions] <https://wg21.link/format.functions>`_,"Format functions - formatted_size(wstring_view fmt, const Args&... args);",,Mark de Wever,`D96664 <https://llvm.org/D96664>`__,|Complete|,Clang 14
|
||||
`[format.functions] <https://wg21.link/format.functions>`_,"Format functions - formatted_size(const locale& loc, string_view fmt, const Args&... args);",,Mark de Wever,`D96664 <https://llvm.org/D96664>`__,|Complete|,Clang 14
|
||||
`[format.functions] <https://wg21.link/format.functions>`_,"Format functions - formatted_size(const locale& loc, wstring_view fmt, const Args&... args);",,Mark de Wever,`D96664 <https://llvm.org/D96664>`__,|Complete|,Clang 14
|
||||
`[format.functions] <https://wg21.link/format.functions>`_,"Format functions - Improve performance format_to_n",,Mark de Wever,`D110499 <https://llvm.org/D110499>`__,|Review|,
|
||||
`[format.functions] <https://wg21.link/format.functions>`_,"Format functions - Improve performance formatted size",,Mark de Wever,`D110500 <https://llvm.org/D110500>`__,|Review|,
|
||||
`[format.functions] <https://wg21.link/format.functions>`_,"`P2216 <https://wg21.link/P2216>`_ - Compile-time checks",,Mark de Wever,,|In Progress|,
|
||||
`[format.functions] <https://wg21.link/format.functions>`_,"`P2216 <https://wg21.link/P2216>`_ - Binary size",,Mark de Wever,`D110494 <https://llvm.org/D110494>`__,|Complete|,Clang 14
|
||||
[charconv.to.chars],"Fix integral conformance",,Mark de Wever,`D100722 <https://llvm.org/D100722>`__,|Complete|,Clang 13
|
||||
[charconv.to.chars],"Add floating-point conversion",`D100722 <https://llvm.org/D100722>`__,"Mark de Wever (Code provided by Stephan T. Lavavej of Microsoft)",`D70631 <https://llvm.org/D70631>`__,In progress,
|
||||
[format.error],"Class format_error",,Mark de Wever,`D92214 <https://llvm.org/D92214>`__,|Complete|,Clang 13
|
||||
[format.parse.ctx],"Class template basic_format_parse_context",,Mark de Wever,`D93166 <https://llvm.org/D93166>`__,|Complete|,Clang 13
|
||||
[format.context],"Class template basic_format_context",,Mark de Wever,`D103357 <https://llvm.org/D103357>`__,Review,
|
||||
[format.args],"Class template basic_format_args",,Mark de Wever,`D103357 <https://llvm.org/D103357>`__,Review,
|
||||
[format.arg],"Class template basic_format_arg",,Mark de Wever,`D103357 <https://llvm.org/D103357>`__,Review,
|
||||
[format.arg],"Class template basic_format_arg - handle",,,,,,
|
||||
[format.arg],"Class template basic_format_arg - pointers",,,,,,
|
||||
[format.arg.store],"Class template format-arg-store",,Mark de Wever,`D103357 <https://llvm.org/D103357>`__,Review,
|
||||
[format.formatter.spec],"Formatter specializations - character types",,Mark de Wever,"`D96664 <https://llvm.org/D96664>`__ `D103466 <https://llvm.org/D103466>`__",Review,
|
||||
[format.formatter.spec],"Formatter specializations - string types",,Mark de Wever,"`D96664 <https://llvm.org/D96664>`__ `D103425 <https://reviews.llvm.org/D103425>`__",Review,
|
||||
[format.formatter.spec],"Formatter specializations - boolean type",,Mark de Wever,"`D96664 <https://llvm.org/D96664>`__ `D103670 <https://reviews.llvm.org/D103670>`__",Review,
|
||||
[format.formatter.spec],"Formatter specializations - integral types",,Mark de Wever,"`D96664 <https://llvm.org/D96664>`__ `D103433 <https://reviews.llvm.org/D103433>`__",Review,
|
||||
[format.formatter.spec],"Formatter specializations - floating-point types",`D70631 <https://llvm.org/D70631>`__,Mark de Wever,`D96664 <https://llvm.org/D96664>`__,Review,
|
||||
[format.formatter.spec],"Formatter specializations - pointer types",,,,,,
|
||||
[format.string.std],"Standard format specifiers - character types",,Mark de Wever,`D103368 <https://reviews.llvm.org/D103368>`__,Review,
|
||||
[format.string.std],"Standard format specifiers - string types",`D103379 <https://reviews.llvm.org/D103379>`__,Mark de Wever,"`D103368 <https://reviews.llvm.org/D103368>`__ `D103413 <https://reviews.llvm.org/D103413>`__",Review,
|
||||
[format.string.std],"Standard format specifiers - boolean type",`D103379 <https://reviews.llvm.org/D103379>`__,Mark de Wever,"`D103368 <https://reviews.llvm.org/D103368>`__ `D103413 <https://reviews.llvm.org/D103413>`__",Review,
|
||||
[format.string.std],"Standard format specifiers - integral types",,Mark de Wever,`D103368 <https://reviews.llvm.org/D103368>`__,Review,
|
||||
[format.string.std],"Standard format specifiers - floating-point types",,Mark de Wever,,,,
|
||||
[format.string.std],"Standard format specifiers - pointer types",,Mark de Wever,,,,
|
||||
[format.functions],"Format functions - format(string_view fmt, const Args&... args);",,Mark de Wever,`D96664 <https://llvm.org/D96664>`__,Review,
|
||||
[format.functions],"Format functions - format(wstring_view fmt, const Args&... args);",,Mark de Wever,`D96664 <https://llvm.org/D96664>`__,Review,
|
||||
[format.functions],"Format functions - format(const locale& loc, string_view fmt, const Args&... args);",,Mark de Wever,`D96664 <https://llvm.org/D96664>`__,Review,
|
||||
[format.functions],"Format functions - format(const locale& loc, wstring_view fmt, const Args&... args);",,Mark de Wever,`D96664 <https://llvm.org/D96664>`__,Review,
|
||||
[format.functions],"Format functions - vformat(string_view fmt, format_args args);",,Mark de Wever,`D96664 <https://llvm.org/D96664>`__,Review,
|
||||
[format.functions],"Format functions - vformat(wstring_view fmt, wformat_args args);",,Mark de Wever,`D96664 <https://llvm.org/D96664>`__,Review,
|
||||
[format.functions],"Format functions - vformat(const locale& loc, string_view fmt, format_args args);",,Mark de Wever,`D96664 <https://llvm.org/D96664>`__,Review,
|
||||
[format.functions],"Format functions - vformat(const locale& loc, wstring_view fmt, wformat_args args);",,Mark de Wever,`D96664 <https://llvm.org/D96664>`__,Review,
|
||||
[format.functions],"Format functions - format_to(Out out, wstring_view fmt, const Args&... args);",,Mark de Wever,`D96664 <https://llvm.org/D96664>`__,Review,
|
||||
[format.functions],"Format functions - format_to(Out out, const locale& loc, wstring_view fmt, const Args&... args);",,Mark de Wever,`D96664 <https://llvm.org/D96664>`__,Review,
|
||||
[format.functions],"Format functions - vformat_to(Out out, string_view fmt, format_args_t<type_identity_t<Out>, char> args);",,Mark de Wever,`D96664 <https://llvm.org/D96664>`__,Review,
|
||||
[format.functions],"Format functions - vformat_to(Out out, wstring_view fmt, format_args_t<type_identity_t<Out>, char> args);",,Mark de Wever,`D96664 <https://llvm.org/D96664>`__,Review,
|
||||
[format.functions],"Format functions - vformat_to(Out out, const locale& loc, string_view fmt, format_args_t<type_identity_t<Out>, char> args);",,Mark de Wever,`D96664 <https://llvm.org/D96664>`__,Review,
|
||||
[format.functions],"Format functions - vformat_to(Out out, const locale& loc, wstring_view fmt,format_args_t<type_identity_t<Out>, wchar_t> args);",,Mark de Wever,`D96664 <https://llvm.org/D96664>`__,Review,
|
||||
[format.functions],"Format functions - format_to_n(Out out, iter_difference_t<Out> n, string_view fmt, const Args&... args);",,Mark de Wever,`D96664 <https://llvm.org/D96664>`__,Review,
|
||||
[format.functions],"Format functions - format_to_n(Out out, iter_difference_t<Out> n, wstring_view fmt, const Args&... args);",,Mark de Wever,`D96664 <https://llvm.org/D96664>`__,Review,
|
||||
[format.functions],"Format functions - format_to_n_result<Out> format_to_n(Out out, iter_difference_t<Out> n, const locale& loc, string_view fmt, const Args&... args);",,Mark de Wever,`D96664 <https://llvm.org/D96664>`__,Review,
|
||||
[format.functions],"Format functions - format_to_n_result<Out> format_to_n(Out out, iter_difference_t<Out> n, const locale& loc, wstring_view fmt, const Args&... args);",,Mark de Wever,`D96664 <https://llvm.org/D96664>`__,Review,
|
||||
[format.functions],"Format functions - formatted_size(string_view fmt, const Args&... args);",,Mark de Wever,`D96664 <https://llvm.org/D96664>`__,Review,
|
||||
[format.functions],"Format functions - formatted_size(wstring_view fmt, const Args&... args);",,Mark de Wever,`D96664 <https://llvm.org/D96664>`__,Review,
|
||||
[format.functions],"Format functions - formatted_size(const locale& loc, string_view fmt, const Args&... args);",,Mark de Wever,`D96664 <https://llvm.org/D96664>`__,Review,
|
||||
[format.functions],"Format functions - formatted_size(const locale& loc, wstring_view fmt, const Args&... args);",,Mark de Wever,`D96664 <https://llvm.org/D96664>`__,Review,
|
||||
[format.functions],"Format functions - Implement locale support",,Mark de Wever,,In progress,,
|
||||
[format.functions],"Format functions - Improve performance format_to_n",,Mark de Wever,,,,
|
||||
[format.functions],"Format functions - Improve performance formatted size",,Mark de Wever,,,,
|
||||
|
Can't render this file because it has a wrong number of fields in line 9.
|
@ -31,11 +31,6 @@ Sub-Projects in the One Ranges Proposal
|
||||
:header-rows: 1
|
||||
:widths: auto
|
||||
|
||||
.. csv-table::
|
||||
:file: RangesAlgorithms.csv
|
||||
:header-rows: 1
|
||||
:widths: auto
|
||||
|
||||
|
||||
Misc. Items and TODOs
|
||||
====================================
|
||||
|
@ -1,100 +0,0 @@
|
||||
Category,Algorithm,Assignee,CL,Complete
|
||||
Search,any_of,Christopher Di Bella,`D105793 <https://llvm.org/D105793>`_
|
||||
Search,all_of,Christopher Di Bella,`D105793 <https://llvm.org/D105793>`_
|
||||
Search,none_of,Christopher Di Bella,`D105793 <https://llvm.org/D105793>`_
|
||||
Search,find,Christopher Di Bella,`D105456 <https://llvm.org/D105456>`_
|
||||
Search,find_if,Christopher Di Bella,`D105792 <https://llvm.org/D105792>`_
|
||||
Search,find_if_not,Christopher Di Bella,`D105792 <https://llvm.org/D105792>`_
|
||||
Search,find_first_of,Not assigned,n/a,Not started
|
||||
Search,adjacent_find,Not assigned,n/a,Not started
|
||||
Search,mismatch,Not assigned,n/a,Not started
|
||||
Search,equal,Not assigned,n/a,Not started
|
||||
Search,lexicographical_compare,Not assigned,n/a,Not started
|
||||
Search,partition_point,Christopher Di Bella,`D105794 <https://llvm.org/D105794>`_,Under review
|
||||
Search,lower_bound,Christopher Di Bella,`D105795 <https://llvm.org/D105795>`_,Under review
|
||||
Search,upper_bound,Christopher Di Bella,`D105795 <https://llvm.org/D105795>`_,Under review
|
||||
Search,equal_range,Christopher Di Bella,n/a,Not started
|
||||
Search,binary_search,Christopher Di Bella,n/a,Not started
|
||||
Search,min,Not assigned,n/a,Not started
|
||||
Search,max,Not assigned,n/a,Not started
|
||||
Search,minmax,Not assigned,n/a,Not started
|
||||
Search,min_element,Not assigned,n/a,Not started
|
||||
Search,max_element,Not assigned,n/a,Not started
|
||||
Search,minmax_element,Not assigned,n/a,Not started
|
||||
Search,count,Not assigned,n/a,Not started
|
||||
Search,count_if,Not assigned,n/a,Not started
|
||||
Search,search,Not assigned,n/a,Not started
|
||||
Search,search_n,Not assigned,n/a,Not started
|
||||
Search,find_end,Not assigned,n/a,Not started
|
||||
Read-only,is_partitioned,Christopher Di Bella,`D105794 <https://llvm.org/D105794>`_,Under review
|
||||
Read-only,is_sorted,Not assigned,n/a,Not started
|
||||
Read-only,is_sorted_unitl,Not assigned,n/a,Not started
|
||||
Read-only,includes,Not assigned,n/a,Not started
|
||||
Read-only,is_heap,Not assigned,n/a,Not started
|
||||
Read-only,is_heap_until,Not assigned,n/a,Not started
|
||||
Read-only,clamp,Not assigned,n/a,Not started
|
||||
Read-only,is_permutation,Not assigned,n/a,Not started
|
||||
Read-only,for_each,Not assigned,n/a,Not started
|
||||
Read-only,for_each_n,Not assigned,n/a,Not started
|
||||
Write,copy,Not assigned,n/a,Not started
|
||||
Write,copy_if,Not assigned,n/a,Not started
|
||||
Write,copy_n,Not assigned,n/a,Not started
|
||||
Write,copy_backward,Not assigned,n/a,Not started
|
||||
Write,move,Not assigned,n/a,Not started
|
||||
Write,move_backward,Not assigned,n/a,Not started
|
||||
Write,fill,Not assigned,n/a,Not started
|
||||
Write,fill_n,Not assigned,n/a,Not started
|
||||
Write,transform,Not assigned,n/a,Not started
|
||||
Write,generate,Not assigned,n/a,Not started
|
||||
Write,generate_nNot assigned,n/a,Not started
|
||||
Write,remove_copy,Not assigned,n/a,Not started
|
||||
Write,remove_copy_if,Not assigned,n/a,Not started
|
||||
Write,replace,Not assigned,n/a,Not started
|
||||
Write,replace_if,Not assigned,n/a,Not started
|
||||
Write,replace_copy,Not assigned,n/a,Not started
|
||||
Write,replace_copy_if,Not assigned,n/a,Not started
|
||||
Write,swap_ranges,Not assigned,n/a,Not started
|
||||
Write,reverse_copy,Not assigned,n/a,Not started
|
||||
Write,rotate_copy,Not assigned,n/a,Not started
|
||||
Write,sample,Not assigned,n/a,Not started
|
||||
Write,unique_copy,Not assigned,n/a,Not started
|
||||
Write,partition_copy,Not assigned,n/a,Not started
|
||||
Write,partial_sort_copy,Not assigned,n/a,Not started
|
||||
Merge,merge,Not assigned,n/a,Not started
|
||||
Merge,set_difference,Not assigned,n/a,Not started
|
||||
Merge,set_intersection,Not assigned,n/a,Not started
|
||||
Merge,set_symmetric_difference,Not assigned,n/a,Not started
|
||||
Merge,set_union,Not assigned,n/a,Not started
|
||||
Permutation,remove,Not assigned,n/a,Not started
|
||||
Permutation,remove_if,Not assigned,n/a,Not started
|
||||
Permutation,reverse,Not assigned,n/a,Not started
|
||||
Permutation,rotate,Not assigned,n/a,Not started
|
||||
Permutation,shuffle,Not assigned,n/a,Not started
|
||||
Permutation,unique,Not assigned,n/a,Not started
|
||||
Permutation,partition,Not assigned,n/a,Not started
|
||||
Permutation,stable_partition,Not assigned,n/a,Not started
|
||||
Permutation,sort,Not assigned,n/a,Not started
|
||||
Permutation,stable_sort,Not assigned,n/a,Not started
|
||||
Permutation,partial_sort,Not assigned,n/a,Not started
|
||||
Permutation,nth_element,Not assigned,n/a,Not started
|
||||
Permutation,inplace_merge,Not assigned,n/a,Not started
|
||||
Permutation,make_heap,Not assigned,n/a,Not started
|
||||
Permutation,push_heap,Not assigned,n/a,Not started
|
||||
Permutation,pop_heap,Not assigned,n/a,Not started
|
||||
Permutation,sort_heap,Not assigned,n/a,Not started
|
||||
Permutation,prev_permutation,Not assigned,n/a,Not started
|
||||
Permutation,next_permutation,Not assigned,n/a,Not started
|
||||
Uninitialised memory,uninitialized_copy,Konstantin Varlamov,`D116023 <https://llvm.org/D116023>`_,✅
|
||||
Uninitialised memory,uninitialized_copy_n,Konstantin Varlamov,`D116023 <https://llvm.org/D116023>`_,✅
|
||||
Uninitialised memory,uninitialized_fill,Konstantin Varlamov,`D115626 <https://llvm.org/D115626>`_,✅
|
||||
Uninitialised memory,uninitialized_fill_n,Konstantin Varlamov,`D115626 <https://llvm.org/D115626>`_,✅
|
||||
Uninitialised memory,uninitialized_move,Konstantin Varlamov,`D116023 <https://llvm.org/D116023>`_,✅
|
||||
Uninitialised memory,uninitialized_move_n,Konstantin Varlamov,`D116023 <https://llvm.org/D116023>`_,✅
|
||||
Uninitialised memory,uninitialized_default_construct,Konstantin Varlamov,`D115315 <https://llvm.org/D115315>`_,✅
|
||||
Uninitialised memory,uninitialized_default_construct_n,Konstantin Varlamov,`D115315 <https://llvm.org/D115315>`_,✅
|
||||
Uninitialised memory,uninitialized_value_construct,Konstantin Varlamov,`D115626 <https://llvm.org/D115626>`_,✅
|
||||
Uninitialised memory,uninitialized_value_construct_n,Konstantin Varlamov,`D115626 <https://llvm.org/D115626>`_,✅
|
||||
Uninitialised memory,destroy,Konstantin Varlamov,`D116078 <https://llvm.org/D116078>`_,✅
|
||||
Uninitialised memory,destroy_n,Konstantin Varlamov,`D116078 <https://llvm.org/D116078>`_,✅
|
||||
Uninitialised memory,destroy_at,Konstantin Varlamov,`D116078 <https://llvm.org/D116078>`_,✅
|
||||
Uninitialised memory,construct_at,Konstantin Varlamov,`D116078 <https://llvm.org/D116078>`_,✅
|
|
@ -1,11 +1,11 @@
|
||||
"Number","Name","Status","First released version"
|
||||
"Number","Name","Status","Assignee"
|
||||
`P0896R4 <https://wg21.link/P0896R4>`__,<ranges>,,
|
||||
`P1035R7 <https://wg21.link/P1035R7>`__,Input Range Adaptors,,
|
||||
`P1207R4 <https://wg21.link/P1207R4>`__,Movability Of Single-Pass Iterators,,
|
||||
`P1243R4 <https://wg21.link/P1243R4>`__,Rangify New Algorithms,,
|
||||
`P1248R1 <https://wg21.link/P1248R1>`__,Fixing Relations,|Complete|,13.0
|
||||
`P1248R1 <https://wg21.link/P1248R1>`__,Fixing Relations,,
|
||||
`P1252R2 <https://wg21.link/P1252R2>`__,Ranges Design Cleanup,,
|
||||
`P1391R4 <https://wg21.link/P1391R4>`__,Range Constructor For string_view,|Complete|,14.0
|
||||
`P1391R4 <https://wg21.link/P1391R4>`__,Range Constructor For string_view,,
|
||||
`P1456R1 <https://wg21.link/P1456R1>`__,Move-Only Views,,
|
||||
`P1474R1 <https://wg21.link/P1474R1>`__,Helpful Pointers For contiguous_iterator,,
|
||||
`P1522R1 <https://wg21.link/P1522R1>`__,Iterator Difference Type And Integer Overflow,,
|
||||
@ -15,7 +15,7 @@
|
||||
`P1739R4 <https://wg21.link/P1739R4>`__,Avoiding Template Bloat For Ranges,,
|
||||
`P1862R1 <https://wg21.link/P1862R1>`__,Range Adaptors For Non-Copyable Iterators,,
|
||||
`P1870R1 <https://wg21.link/P1870R1>`__,safe_range,,
|
||||
`P1871R1 <https://wg21.link/P1871R1>`__,disable_sized_sentinel_for,|Complete|,14.0
|
||||
`P1871R1 <https://wg21.link/P1871R1>`__,disable_sized_sentinel_for,,
|
||||
`P1878R1 <https://wg21.link/P1878R1>`__,Constraining Readable Types,,
|
||||
`P1970R2 <https://wg21.link/P1970R2>`__,ranges::ssize,,
|
||||
`P1983R0 <https://wg21.link/P1983R0>`__,Fixing Minor Ranges Issues,,
|
||||
@ -26,8 +26,55 @@
|
||||
`P2325R3 <https://wg21.link/P2325R3>`__,Views should not be required to be default constructible ,,
|
||||
`P2328R1 <https://wg21.link/P2328R1>`__,join_view should join all views of ranges,,
|
||||
`P2210R2 <https://wg21.link/P2210R2>`__,Superior String Splitting,,
|
||||
`P2281R1 <https://wg21.link/P2281R1>`__,Clarifying range adaptor objects,|Complete|,14.0
|
||||
`P2281R1 <https://wg21.link/P2281R1>`__,Clarifying range adaptor objects,,
|
||||
`P2367R0 <https://wg21.link/P2367R0>`__,Remove misuses of list-initialization from Clause 24,,
|
||||
|
||||
`P2415 <https://wg21.link/P2415>`__,"What is a ``view``",|Complete|,14.0
|
||||
`P2432 <https://wg21.link/P2432>`__,"Fix ``istream_view``",,
|
||||
`LWG3169 <https://wg21.link/lwg3169>`__, ranges permutation generators discard useful information,,
|
||||
`LWG3173 <https://wg21.link/lwg3173>`__, Enable CTAD for ref-view,,
|
||||
`LWG3179 <https://wg21.link/lwg3179>`__, subrange should always model Range,,
|
||||
`LWG3180 <https://wg21.link/lwg3180>`__, Inconsistently named return type for ranges::minmax_element,,
|
||||
`LWG3183 <https://wg21.link/lwg3183>`__, Normative permission to specialize Ranges variable templates,,
|
||||
`LWG3186 <https://wg21.link/lwg3186>`__, "ranges removal, partition, and partial_sort_copy algorithms discard useful information",,
|
||||
`LWG3191 <https://wg21.link/lwg3191>`__, std::ranges::shuffle synopsis does not match algorithm definition,,
|
||||
`LWG3276 <https://wg21.link/lwg3276>`__, Class split_view::outer_iterator::value_type should inherit from view_interface,,
|
||||
`LWG3280 <https://wg21.link/lwg3280>`__, View converting constructors can cause constraint recursion and are unneeded,,
|
||||
`LWG3281 <https://wg21.link/lwg3281>`__, Conversion from pair-like types to subrange is a silent semantic promotion,,
|
||||
`LWG3282 <https://wg21.link/lwg3282>`__, subrange converting constructor should disallow derived to base conversions,,
|
||||
`LWG3286 <https://wg21.link/lwg3286>`__, ranges::size is not required to be valid after a call to ranges::begin on an input range,,
|
||||
`LWG3291 <https://wg21.link/lwg3291>`__, iota_view::iterator has the wrong iterator_category,,
|
||||
`LWG3292 <https://wg21.link/lwg3292>`__, iota_view is under-constrained,,
|
||||
`LWG3299 <https://wg21.link/lwg3299>`__, Pointers don't need customized iterator behavior,,
|
||||
`LWG3301 <https://wg21.link/lwg3301>`__, transform_view::iterator has incorrect iterator_category,,
|
||||
`LWG3302 <https://wg21.link/lwg3302>`__, Range adaptor objects keys and values are unspecified,,
|
||||
`LWG3313 <https://wg21.link/lwg3313>`__, join_view::iterator::operator-- is incorrectly constrained,,
|
||||
`LWG3323 <https://wg21.link/lwg3323>`__, has-tuple-element helper concept needs convertible_to,,
|
||||
`LWG3325 <https://wg21.link/lwg3325>`__, Constrain return type of transformation function for transform_view,,
|
||||
`LWG3335 <https://wg21.link/lwg3335>`__, range_size_t and views::all_t,,
|
||||
`LWG3355 <https://wg21.link/lwg3355>`__, The memory algorithms should support move-only input iterators introduced by P1207,,
|
||||
`LWG3363 <https://wg21.link/lwg3363>`__, drop_while_view should opt-out of sized_range,,
|
||||
`LWG3364 <https://wg21.link/lwg3364>`__, Initialize data members of ranges and their iterators,,
|
||||
`LWG3381 <https://wg21.link/lwg3381>`__, begin and data must agree for contiguous_range,,
|
||||
`LWG3384 <https://wg21.link/lwg3384>`__, transform_view::sentinel has an incorrect operator-,,
|
||||
`LWG3385 <https://wg21.link/lwg3385>`__, common_iterator is not sufficiently constrained for non-copyable iterators,,
|
||||
`LWG3387 <https://wg21.link/lwg3387>`__, [range.reverse.view] reverse_view<V> unintentionally requires range<const V>,,
|
||||
`LWG3388 <https://wg21.link/lwg3388>`__, view iterator types have ill-formed <=> operators,,
|
||||
`LWG3389 <https://wg21.link/lwg3389>`__, A move-only iterator still does not have a counted_iterator,,
|
||||
`LWG3397 <https://wg21.link/lwg3397>`__, ranges::basic_istream_view::iterator should not provide iterator_category,,
|
||||
`LWG3398 <https://wg21.link/lwg3398>`__, tuple_element_t is also wrong for const subrange,,
|
||||
`LWG3474 <https://wg21.link/lwg3474>`__, Nesting join_views is broken because of CTAD,,
|
||||
`LWG3481 <https://wg21.link/LWG3481>`__,"viewable_range mishandles lvalue move-only views",,
|
||||
`LWG3500 <https://wg21.link/lwg3500>`__, join_view::iterator::operator->() is bogus,,
|
||||
`LWG3505 <https://wg21.link/lwg3505>`__, split_view::outer-iterator::operator++ misspecified,,
|
||||
`LWG3517 <https://wg21.link/LWG3517>`__,"join_view::iterator's iter_swap is underconstrained",,
|
||||
`LWG3520 <https://wg21.link/LWG3520>`__,"iter_move and iter_swap are inconsistent for transform_view::iterator",,
|
||||
`LWG3522 <https://wg21.link/LWG3522>`__,"Missing requirement on InputIterator template parameter for priority_queue constructors",,
|
||||
`LWG3523 <https://wg21.link/LWG3523>`__,"iota_view::sentinel is not always iota_view's sentinel",,
|
||||
`LWG3532 <https://wg21.link/LWG3532>`__,"split_view<V, P>::inner-iterator<true>::operator++(int) should depend on Base",,
|
||||
`LWG3533 <https://wg21.link/LWG3533>`__,"Make base() const & consistent across iterator wrappers that supports input_iterators",,
|
||||
`LWG3541 <https://wg21.link/LWG3541>`__,"indirectly_readable_traits should be SFINAE-friendly for all types",,
|
||||
`LWG3543 <https://wg21.link/LWG3543>`__,"Definition of when counted_iterators refer to the same sequence isn't quite right",,
|
||||
`LWG3546 <https://wg21.link/LWG3546>`__,"common_iterator's postfix-proxy is not quite right",,
|
||||
`LWG3549 <https://wg21.link/LWG3549>`__,"view_interface is overspecified to derive from view_base",,
|
||||
`LWG3551 <https://wg21.link/LWG3551>`__,"borrowed_{iterator,subrange}_t are overspecified",,
|
||||
`LWG3553 <https://wg21.link/LWG3553>`__,"Useless constraint in split_view::outer-iterator::value_type::begin()",,
|
||||
`LWG3555 <https://wg21.link/LWG3555>`__,"{transform,elements}_view::iterator::iterator_concept should consider const-qualification of the underlying range",,
|
||||
|
|
@ -1,42 +1,42 @@
|
||||
Section,Description,Dependencies,Assignee,Complete
|
||||
`[tuple.helper] <https://wg21.link/tuple.helper>`_,Update <tuple> includes.,None,Konstantin Varlamov,Not started
|
||||
`[range.cmp] <https://wg21.link/range.cmp>`_,"| `ranges::equal_to <https://llvm.org/D100429>`_
|
||||
[tuple.helper],Update <tuple> includes.,None,Unassigned,Not started
|
||||
`[range.cmp] <http://wg21.link/range.cmp>`_,"| `ranges::equal_to <https://llvm.org/D100429>`_
|
||||
| `ranges::not_equal_to <https://llvm.org/D100429>`_
|
||||
| `ranges::less <https://llvm.org/D100429>`_
|
||||
| `ranges::greater <https://llvm.org/D100429>`_
|
||||
| `ranges::less_equal <https://llvm.org/D100429>`_
|
||||
| `ranges::greater_equal <https://llvm.org/D100429>`_",None,Zoe Carver,✅
|
||||
`[readable.traits] <https://wg21.link/readable.traits>`_,"| `indirectly_readable_traits <https://llvm.org/D99461>`_
|
||||
`[readable.traits] <http://wg21.link/readable.traits>`_,"| `indirectly_readable_traits <https://llvm.org/D99461>`_
|
||||
| `iter_value_t <https://llvm.org/D99863>`_",None,Christopher Di Bella,✅
|
||||
`[incrementable.traits] <https://wg21.link/incrementable.traits>`_,"| `incrementable_traits <https://llvm.org/D99141>`_
|
||||
`[incrementable.traits] <http://wg21.link/incrementable.traits>`_,"| `incrementable_traits <https://llvm.org/D99141>`_
|
||||
| `iter_difference_t <https://llvm.org/D99863>`_",,Christopher Di Bella,✅
|
||||
`[iterator.traits] <https://wg21.link/iterator.traits>`_,`Updates to iterator_traits <https://llvm.org/D99855>`_,"| indirectly_readable_traits
|
||||
`[iterator.traits] <http://wg21.link/iterator.traits>`_,`Updates to iterator_traits <https://llvm.org/D99855>`_,"| indirectly_readable_traits
|
||||
| incrementable_traits",Christopher Di Bella,✅
|
||||
`[special.mem.concepts] <https://wg21.link/special.mem.concepts>`_,"| `nothrow-input-iterator <https://llvm.org/D114761>`_
|
||||
| `nothrow-sentinel-for <https://llvm.org/D114761>`_
|
||||
| `nothrow-input-range <https://llvm.org/D114761>`_
|
||||
| `nothrow-forward-iterator <https://llvm.org/D114761>`_
|
||||
| `nothrow-forward-range <https://llvm.org/D114761>`_","| [iterator.concepts]
|
||||
| [range.refinements]",Konstantin Varlamov,✅
|
||||
`[specialized.algorithms] <https://wg21.link/specialized.algorithms>`_,"| `ranges::uninitialized_default_construct <https://llvm.org/D115315>`_
|
||||
| `ranges::uninitialized_default_construct_n <https://llvm.org/D115315>`_
|
||||
| `ranges::uninitialized_value_construct <https://llvm.org/D115626>`_
|
||||
| `ranges::uninitialized_value_construct_n <https://llvm.org/D115626>`_
|
||||
| `ranges::uninitialized_copy <https://llvm.org/D116023>`_
|
||||
| `ranges::uninitialized_copy_n <https://llvm.org/D116023>`_
|
||||
| `ranges::uninitialized_move <https://llvm.org/D116023>`_
|
||||
| `ranges::uninitialized_move_n <https://llvm.org/D116023>`_
|
||||
| `ranges::uninitialized_fill <https://llvm.org/D115626>`_
|
||||
| `ranges::uninitialized_fill_n <https://llvm.org/D115626>`_
|
||||
| `ranges::construct_at <https://llvm.org/D116078>`_
|
||||
| `ranges::destroy <https://llvm.org/D116078>`_
|
||||
| `ranges::destroy_at <https://llvm.org/D116078>`_
|
||||
| `ranges::destroy_n <https://llvm.org/D116078>`_",[special.mem.concepts],Konstantin Varlamov,✅
|
||||
`[strings] <https://wg21.link/strings>`_,Adds begin/end and updates const_iterator.,[iterator.concepts],Unassigned,Not started
|
||||
`[views.span] <https://wg21.link/views.span>`_,Same as [strings],[iterator.concepts],Unassigned,Not started
|
||||
`[iterator.cust.move] <https://wg21.link/iterator.cust.move>`_,`ranges::iter_move <https://llvm.org/D99873>`_,,Zoe Carver,✅
|
||||
`[iterator.cust.swap] <https://wg21.link/iterator.cust.swap>`_,`ranges::iter_swap <https://llvm.org/D102809>`_,iter_value_t,Zoe Carver,✅
|
||||
`[iterator.concepts] <https://wg21.link/iterator.concepts>`_,"| `indirectly_readable <https://llvm.org/D100073>`_
|
||||
`[special.mem.concepts] <http://wg21.link/special.mem.concepts>`_,"| *no-throw-input-iterator*
|
||||
| *no-throw-sentinel-for*
|
||||
| *no-throw-input-range*
|
||||
| *no-throw-forward-iterator*
|
||||
| *no-throw-forward-range*","| [iterator.concepts]
|
||||
| [range.refinements]",Unassigned,Not started
|
||||
`[specialized.algorithms] <http://wg21.link/specialized.algorithms>`_,"| ranges::uninitialized_default_construct
|
||||
| ranges::uninitialized_default_construct_n
|
||||
| ranges::uninitialized_value_construct
|
||||
| ranges::uninitialized_value_construct_n
|
||||
| ranges::uninitialized_copy
|
||||
| ranges::uninitialized_copy_n
|
||||
| ranges::uninitialized_move
|
||||
| ranges::uninitialized_move_n
|
||||
| ranges::uninitialized_fill
|
||||
| ranges::uninitialized_fill_n
|
||||
| ranges::construct_at
|
||||
| ranges::destroy
|
||||
| ranges::destroy_at
|
||||
| ranges::destroy_n",[special.mem.concepts],Unassigned,Not started
|
||||
[strings],Adds begin/end and updates const_iterator.,[iterator.concepts],Unassigned,Not started
|
||||
[views.span],Same as [strings],[iterator.concepts],Unassigned,Not started
|
||||
`[iterator.cust.move] <http://wg21.link/iterator.cust.move>`_,`ranges::iter_move <https://llvm.org/D99873>`_,,Zoe Carver,✅
|
||||
`[iterator.cust.swap] <http://wg21.link/iterator.cust.swap>`_,`ranges::iter_swap <https://llvm.org/D102809>`_,iter_value_t,Zoe Carver,✅
|
||||
`[iterator.concepts] <http://wg21.link/iterator.concepts>`_,"| `indirectly_readable <https://llvm.org/D100073>`_
|
||||
| `indirectly_writable <https://llvm.org/D100073>`_
|
||||
| `weakly_incrementable <https://llvm.org/D100080>`_
|
||||
| `incrementable <https://llvm.org/D100080>`_
|
||||
@ -49,52 +49,42 @@ Section,Description,Dependencies,Assignee,Complete
|
||||
| `bidirectional_iterator <https://llvm.org/D100278>`_
|
||||
| `random_access_iterator <https://llvm.org/D101316>`_
|
||||
| `contiguous_iterator <https://llvm.org/D101396>`_",,Various,✅
|
||||
`[indirectcallable.indirectinvocable] <https://wg21.link/indirectcallable.indirectinvocable>`_,"
|
||||
| `indirectly_unary_invocable <https://llvm.org/D101277>`_
|
||||
`[indirectcallable.indirectinvocable] <http://wg21.link/indirectcallable.indirectinvocable>`_,"| indirectly_unary_invocable
|
||||
| `indirectly_regular_unary_invocable <https://llvm.org/D101277>`_
|
||||
| `indirectly_unary_predicate <https://llvm.org/D101277>`_
|
||||
| `indirectly_binary_predicate <https://llvm.org/D101277>`_
|
||||
| `indirectly_equivalence_relation <https://llvm.org/D101277>`_
|
||||
| `indirectly_strict_weak_order <https://llvm.org/D101277>`_",[readable.traits],Louis Dionne,✅
|
||||
`[projected] <https://wg21.link/projected>`_,`ranges::projected <https://llvm.org/D101277>`_,[iterator.concepts],Louis Dionne,✅
|
||||
`[common.alg.req] <https://wg21.link/common.alg.req>`_: pt. 1,"| `indirectly_movable <https://llvm.org/D102639>`_
|
||||
`[projected] <http://wg21.link/projected>`_,`ranges::projected <https://llvm.org/D101277>`_,[iterator.concepts],Louis Dionne,✅
|
||||
`[common.alg.req] <http://wg21.link/common.alg.req>`_: pt. 1,"| `indirectly_movable <https://llvm.org/D102639>`_
|
||||
| `indirectly_movable_storable <https://llvm.org/D102639>`_
|
||||
| indirectly_copyable
|
||||
| indirectly_copyable_storable",[iterator.concepts],Zoe Carver,In progress
|
||||
`[common.alg.req] <https://wg21.link/common.alg.req>`_: pt. 2,`indirectly_swappable <https://llvm.org/D105304>`_,"| [iterator.concepts]
|
||||
[common.alg.req]: pt. 2,indirectly_swappable,"| [iterator.concepts]
|
||||
| [iterator.cust.swap]",Zoe Carver,✅
|
||||
`[common.alg.req] <https://wg21.link/common.alg.req>`_: pt. 3,`indirectly_comparable <https://llvm.org/D116268>`_,[projected],Nikolas Klauser,✅
|
||||
`[common.alg.req] <https://wg21.link/common.alg.req>`_: pt. 4,"| permutable
|
||||
[common.alg.req]: pt. 3,indirectly_comparable,[projected],Louis Dionne,Not started
|
||||
[common.alg.req]: pt. 4,"| permutable
|
||||
| mergeable
|
||||
| sortable",[iterator.concepts],Unassigned,Not started
|
||||
`[std.iterator.tags] <https://wg21.link/std.iterator.tags>`_,,[iterator.traits],Unassigned,Not started
|
||||
`[range.iter.ops] <https://wg21.link/range.iter.ops>`_,"| `ranges::advance <https://llvm.org/D101922>`_
|
||||
[std.iterator.tags],,[iterator.traits],Unassigned,Not started
|
||||
`[range.iter.ops] <http://wg21.link/range.iter.ops>`_,"| `ranges::advance <https://llvm.org/D101922>`_
|
||||
| `ranges::distance <https://llvm.org/D102789>`_
|
||||
| `ranges::next <https://llvm.org/D102563>`_
|
||||
| `ranges::prev <https://llvm.org/D102564>`_",[iterator.concepts],Christopher Di Bella and Arthur O'Dwyer,✅
|
||||
`[predef.iterators] <https://wg21.link/predef.iterators>`_,"
|
||||
| Updates to reverse_iterator
|
||||
| Updates to back_insert_iterator
|
||||
| Updates to front_insert_iterator
|
||||
| Updates to move_iterator","| [iterator.concepts]
|
||||
| `ranges::prev <https://llvm.org/D102564>`_",[iterator.concepts],Christopher Di Bella,In progress
|
||||
[predef.iterators],Updates to predefined iterators.,"| [iterator.concepts]
|
||||
| [iterator.cust.swap]
|
||||
| [iterator.cust.move]",Unassigned,Not started
|
||||
`[move.sentinel] <https://wg21.link/move.sentinel>`_,move_sentinel,[predef.iterators],Unassigned,Not started
|
||||
`[common.iterator] <https://wg21.link/common.iterator>`_,`common_iterator <https://llvm.org/D103335>`_,"| [iterator.concepts]
|
||||
[move.sentinel],,[predef.iterators],Unassigned,Not started
|
||||
[common.iterator],,"| [iterator.concepts]
|
||||
| [iterator.cust.swap]
|
||||
| [iterator.cust.move]",Zoe Carver,✅
|
||||
`[default.sentinel] <https://wg21.link/default.sentinel>`_,`std::default_sentinel_t <https://llvm.org/D103487>`_,No dependencies,Zoe Carver,✅
|
||||
`[counted.iterator] <https://wg21.link/counted.iterator>`_,`counted_iterator <https://llvm.org/D106205>`_,"| [iterator.concepts]
|
||||
[default.sentinels],std::default_sentinel_t.,No dependencies,Zoe Carver,✅
|
||||
[counted.iterator],,"| [iterator.concepts]
|
||||
| [iterator.cust.swap]
|
||||
| [iterator.cust.move]
|
||||
| [default.sentinels]",Zoe Carver,✅
|
||||
`[stream.iterators] <https://wg21.link/stream.iterators>`_,"
|
||||
| Updates to istream_iterator
|
||||
| Updates to ostream_iterator
|
||||
| Updates to istreambuf_iterator
|
||||
| Updates to ostreambuf_iterator
|
||||
",[default.sentinels],Unassigned,Not started
|
||||
`[range.access] <https://wg21.link/range.access>`_,"| `ranges::begin <https://llvm.org/D100255>`_
|
||||
[stream.iterators],,[default.sentinels],Unassigned,Not started
|
||||
`[range.access] <http://wg21.link/range.access>`_,"| `ranges::begin <https://llvm.org/D100255>`_
|
||||
| `ranges::end <https://llvm.org/D100255>`_
|
||||
| `range::cbegin <https://llvm.org/D100255>`_
|
||||
| `ranges::cend <https://llvm.org/D100255>`_
|
||||
@ -106,8 +96,8 @@ Section,Description,Dependencies,Assignee,Complete
|
||||
| `ranges::ssize <https://llvm.org/D101189>`_
|
||||
| `ranges::empty <https://llvm.org/D101193>`_
|
||||
| `ranges::data <https://llvm.org/D101476>`_
|
||||
| `ranges::cdata <https://llvm.org/D117044>`_",[iterator.concepts],Christopher Di Bella and Zoe Carver,In progress
|
||||
`[range.range] <https://wg21.link/range.range>`_,"| `ranges::range <https://llvm.org/D100269>`_
|
||||
| ranges::cdata",[iterator.concepts],Christopher Di Bella and Zoe Carver,In progress
|
||||
`[range.range] <http://wg21.link/range.range>`_,"| `ranges::range <https://llvm.org/D100269>`_
|
||||
| `ranges::borrowed_range <https://llvm.org/D102426>`_
|
||||
| `ranges::enable_borrowed_range <https://llvm.org/D90999>`_
|
||||
| `ranges::iterator_t <https://llvm.org/D100255>`_
|
||||
@ -117,43 +107,43 @@ Section,Description,Dependencies,Assignee,Complete
|
||||
| `ranges::range_value_t <https://llvm.org/D100269>`_
|
||||
| `ranges::range_reference_t <https://llvm.org/D100269>`_
|
||||
| `ranges::range_rvalue_reference_t <https://llvm.org/D100269>`_",[range.access],Christopher Di Bella,✅
|
||||
`[range.sized] <https://wg21.link/range.sized>`_,"| `ranges::sized_range <https://llvm.org/D102434>`_
|
||||
`[range.sized] <http://wg21.link/range.sized>`_,"| `ranges::sized_range <https://llvm.org/D102434>`_
|
||||
| `ranges::disable_sized_range <https://llvm.org/D102434>`_","| [range.primitives]
|
||||
| [range.range]",Christopher Di Bella,✅
|
||||
`[range.view] <https://wg21.link/range.view>`_,"| `ranges::enable_view <https://llvm.org/D101547>`_
|
||||
`[range.view] <http://wg21.link/range.view>`_,"| `ranges::enable_view <https://llvm.org/D101547>`_
|
||||
| `ranges::view_base <https://llvm.org/D101547>`_
|
||||
| `ranges::view <https://llvm.org/D101547>`_",[range.range],Louis Dionne,✅
|
||||
`[range.refinements] <https://wg21.link/range.refinements>`_,"| `ranges::output_range <https://llvm.org/D106704>`_
|
||||
`[range.refinements] <http://wg21.link/range.refinements>`_,"| ranges::output_range
|
||||
| `ranges::input_range <https://llvm.org/D100271>`_
|
||||
| `ranges::forward_range <https://llvm.org/D100275>`_
|
||||
| `ranges::forward_range: `D100275 <https://llvm.org/D100275>`_
|
||||
| `ranges::bidirectional_range <https://llvm.org/D100278>`_
|
||||
| `ranges::random_access_range <https://llvm.org/D101316>`_
|
||||
| `ranges::contiguous_range <https://llvm.org/D104262>`_
|
||||
| ranges::contiguous_range
|
||||
| `ranges::common_range <https://llvm.org/D100269>`_",[range.range],Christopher Di Bella,✅
|
||||
`[range.refinements]`_,`ranges::viewable_range <https://llvm.org/D105816>`_,[range.range],Louis Dionne,✅
|
||||
`[range.utility.helpers] <https://wg21.link/range.utility.helpers>`_,"| `simple-view <https://llvm.org/D103493>`_
|
||||
| `has-arrow <https://llvm.org/D103493>`_
|
||||
| `not-same-as <https://llvm.org/D103493>`_","| [range.range]
|
||||
`[range.utility.helpers] <http://wg21.link/range.utility.helpers>`_,"| *simple-view*
|
||||
| *has-arrow*
|
||||
| *not-same-as*","| [range.range]
|
||||
| [iterator.concept.input]",Zoe Carver,✅
|
||||
`[view.interface] <https://wg21.link/view.interface>`_,"`ranges::view_interface <https://llvm.org/D101737>`_","| [ranges.range]
|
||||
`[view.interface] <http://wg21.link/view.interface>`_,"`ranges::view_interface <https://llvm.org/D101737>`_","| [ranges.range]
|
||||
| [range.view]
|
||||
| [range.iterator.op.prev]
|
||||
| [range.refinements]",Zoe Carver,✅
|
||||
`[range.subrange] <https://wg21.link/range.subrange>`_,`ranges::subrange <https://llvm.org/D102006>`_,[view.interface],Zoe Carver,✅
|
||||
`[range.dangling] <https://wg21.link/range.dangling>`_,"| `ranges::dangling <https://llvm.org/D105205>`_
|
||||
| `ranges::borrowed_iterator_t <https://llvm.org/D105205>`_
|
||||
| `ranges::borrowed_subrange_t <https://llvm.org/D105205>`_","| [range.range]
|
||||
`[range.subrange] <http://wg21.link/range.subrange>`_,`ranges::subrange <https://llvm.org/D102006>`_,[view.interface],Zoe Carver,✅
|
||||
`[range.dangling] <http://wg21.link/range.dangling>`_,"| ranges::dangling
|
||||
| ranges::borrowed_iterator_t
|
||||
| ranges::borrowed_subrange_t","| [range.range]
|
||||
| [range.subrange]",Christopher Di Bella,✅
|
||||
`[range.empty] <https://wg21.link/range.empty>`_,`empty_view <https://llvm.org/D103208>`_,[view.interface],Zoe Carver,✅
|
||||
`[range.single] <https://wg21.link/range.single>`_,`single_view <https://llvm.org/D106840>`_,[view.interface],Zoe Carver,✅
|
||||
`[range.iota] <https://wg21.link/range.iota>`_,`iota_view <https://llvm.org/D107396>`_,[range.all],Zoe Carver,✅
|
||||
`[range.all] <https://wg21.link/range.all>`_,`view::all <https://llvm.org/D102028>`_,"[range.subrange], [range.view.ref]",Zoe Carver,✅
|
||||
`[range.ref.view] <https://wg21.link/range.ref.view>`_,`ref_view <https://llvm.org/D102020>`_,[view.interface],Zoe Carver,✅
|
||||
`[range.filter] <https://wg21.link/range.filter>`_,`filter_view <https://llvm.org/D109086>`_,[range.all],Louis Dionne,Under review
|
||||
`[range.transform] <https://wg21.link/range.transform>`_,`transform_view <https://llvm.org/D103056>`_,[range.all],Zoe Carver,✅
|
||||
`[range.take] <https://wg21.link/range.take>`_,`take_view <https://llvm.org/D106507>`_,[range.all],Zoe Carver,✅
|
||||
`[range.join] <https://wg21.link/range.join>`_,`join_view <https://llvm.org/D107671>`_,[range.all],Zoe Carver,✅
|
||||
`[range.split] <https://wg21.link/range.split>`_,`split_view <https://llvm.org/D107500>`_,[range.all],Zoe Carver,In progress
|
||||
`[range.counted] <https://wg21.link/range.counted>`_,`view::counted <https://llvm.org/D106923>`_,[range.subrange],Zoe Carver,✅
|
||||
`[range.common] <https://wg21.link/range.common>`_,`common_view <https://llvm.org/D105753>`_,[range.all],Zoe Carver,✅
|
||||
`[range.reverse] <https://wg21.link/range.reverse>`_,`reverse_view <https://llvm.org/D107096>`_,[range.all],Zoe Carver,✅
|
||||
`[range.all] <http://wg21.link/range.all>`_,`view::all <https://llvm.org/D102028>`_,"[range.subrange], [range.view.ref]",Zoe Carver,✅
|
||||
`[range.view.ref] <http://wg21.link/range.view>`_,`ref-view <https://llvm.org/D102020>`_,[view.interface],Zoe Carver,✅
|
||||
`[range.filter] <http://wg21.link/range.filter>`_,filter_view,[range.all],Louis Dionne,Not started
|
||||
`[range.transform] <http://wg21.link/range.transform>`_,`transform_view <https://llvm.org/D103056>`_,[range.all],Zoe Carver,✅
|
||||
`[range.iota] <http://wg21.link/range.iota>`_,iota_view,[range.all],Louis Dionne,Not started
|
||||
`[range.take] <http://wg21.link/range.take>`_,take_view,[range.all],Zoe Carver,In Progress
|
||||
`[range.join] <http://wg21.link/range.join>`_,join_view,[range.all],Christopher Di Bella,Not started
|
||||
`[range.empty] <http://wg21.link/range.empty>`_,`empty_view <https://llvm.org/D103208>`_,[view.interface],Zoe Carver,✅
|
||||
`[range.single] <http://wg21.link/range.single>`_,single_view,[view.interface],Zoe Carver,In Progress
|
||||
`[range.split] <http://wg21.link/range.split>`_,split_view,[range.all],Unassigned,Not started
|
||||
`[range.counted] <http://wg21.link/range.counted>`_,view::counted,[range.subrange],Zoe Carver,Not started
|
||||
`[range.common] <http://wg21.link/range.common>`_,common_view,[range.all],Zoe Carver,✅
|
||||
`[range.reverse] <http://wg21.link/range.reverse>`_,reverse_view,[range.all],Unassigned,Not started
|
||||
|
|
@ -1,53 +0,0 @@
|
||||
.. spaceship-status:
|
||||
|
||||
==============================================
|
||||
libc++ Spaceship Operator Status (operator<=>)
|
||||
==============================================
|
||||
|
||||
.. include:: ../Helpers/Styles.rst
|
||||
|
||||
.. contents::
|
||||
:local:
|
||||
|
||||
|
||||
Overview
|
||||
================================
|
||||
|
||||
This document contains the status of the C++20 spaceship operator support
|
||||
in libc++. It is used to track both the status of the sub-projects of the effort
|
||||
and who is assigned to these sub-projects. This is imperative to effective
|
||||
implementation so that work is not duplicated and implementors are not blocked
|
||||
by each other.
|
||||
|
||||
If you are interested in contributing to this effort, please send a message
|
||||
to the #libcxx channel in the LLVM discord. Please *do not* start working on any
|
||||
of the assigned items below.
|
||||
|
||||
|
||||
Sub-Projects in the Implementation Effort
|
||||
=========================================
|
||||
|
||||
.. csv-table::
|
||||
:file: SpaceshipProjects.csv
|
||||
:header-rows: 1
|
||||
:widths: auto
|
||||
|
||||
.. note::
|
||||
|
||||
.. [#note-strongorder] ``std::strong_order(long double, long double)`` is not yet implemented.
|
||||
|
||||
|
||||
Misc. Items and TODOs
|
||||
====================================
|
||||
|
||||
(Note: files with required updates will contain the TODO at the beginning of the
|
||||
list item so they can be easily found via global search.)
|
||||
|
||||
|
||||
Paper and Issue Status
|
||||
====================================
|
||||
|
||||
.. csv-table::
|
||||
:file: SpaceshipPapers.csv
|
||||
:header-rows: 1
|
||||
:widths: auto
|
@ -1,10 +0,0 @@
|
||||
"Number","Name","Status","First released version"
|
||||
`P1614R2 <https://wg21.link/P1614>`_,The Mothership has Landed,|In Progress|,
|
||||
`P2404R0 <https://wg21.link/P2404>`_,"Relaxing equality_comparable_with's, totally_ordered_with's, and three_way_comparable_with's common reference requirements to support move-only types",,
|
||||
`P2405R0 <https://wg21.link/P2405>`_,nullopt_t and nullptr_t should both have operator<=> and operator==,,
|
||||
`LWG3330 <https://wg21.link/LWG3330>`_,Include <compare> from most library headers,"|Complete|","13.0"
|
||||
`LWG3347 <https://wg21.link/LWG3347>`_,"std::pair<T, U> now requires T and U to be less-than-comparable",|Nothing To Do|,
|
||||
`LWG3350 <https://wg21.link/LWG3350>`_,Simplify return type of lexicographical_compare_three_way,|Nothing To Do|,
|
||||
`LWG3360 <https://wg21.link/LWG3360>`_,three_way_comparable_with is inconsistent with similar concepts,|Nothing To Do|,
|
||||
`LWG3380 <https://wg21.link/LWG3380>`_,common_type and comparison categories,|Nothing To Do|,
|
||||
`LWG3395 <https://wg21.link/LWG3395>`_,Definition for three-way comparison needs to be updated,|Nothing To Do|,
|
|
@ -1,82 +0,0 @@
|
||||
Section,Description,Dependencies,Assignee,Complete
|
||||
| `[cmp.concept] <https://wg21.link/cmp.concept>`_,"| `three_way_comparable <https://reviews.llvm.org/D103478>`_
|
||||
| `three_way_comparable_with <https://reviews.llvm.org/D103478>`_",None,Ruslan Arutyunyan,|Complete|
|
||||
| `[cmp.result] <https://wg21.link/cmp.result>`_,| `compare_three_way_result <https://reviews.llvm.org/D103581>`_,None,Arthur O'Dwyer,|Complete|
|
||||
| `[expos.only.func] <https://wg21.link/expos.only.func>`_,"| `synth-three-way <https://reviews.llvm.org/D107721>`_
|
||||
| `synth-three-way-result <https://reviews.llvm.org/D107721>`_",[cmp.concept],Kent Ross,|Complete|
|
||||
| `[comparisons.three.way] <https://wg21.link/comparisons.three.way>`_,| `compare_three_way <https://reviews.llvm.org/D80899>`_,[cmp.concept],Arthur O'Dwyer,|Complete|
|
||||
| `[cmp.alg] <https://wg21.link/cmp.alg>`_,"| `strong_order <https://reviews.llvm.org/D110738>`_
|
||||
| `weak_order <https://reviews.llvm.org/D110738>`_
|
||||
| `partial_order <https://reviews.llvm.org/D110738>`_
|
||||
| `strong_order_fallback <https://reviews.llvm.org/D111514>`_
|
||||
| `weak_order_fallback <https://reviews.llvm.org/D111514>`_
|
||||
| `partial_order_fallback <https://reviews.llvm.org/D111514>`_",None,Arthur O'Dwyer,|Complete| [#note-strongorder]_
|
||||
| `[alg.three.way] <https://wg21.link/alg.three.way>`_,| `lexicographical_compare_three_way <https://reviews.llvm.org/D80902>`_,[comparisons.three.way],Christopher Di Bella,|In Progress|
|
||||
| `[coroutine.handle.compare] <https://wg21.link/coroutine.handle.compare>`_,| `coroutine_handle <https://reviews.llvm.org/D109433>`_,[comparisons.three.way],Chuanqi Xu,|Complete|
|
||||
| `[pairs.spec] <https://wg21.link/pairs.spec>`_,| `pair <https://reviews.llvm.org/D107721>`_,[expos.only.func],Kent Ross,|Complete|
|
||||
| `[syserr.errcat.nonvirtuals] <https://wg21.link/syserr.errcat.nonvirtuals>`_,| error_category,[comparisons.three.way],Unassigned,|Not Started|
|
||||
| `[syserr.compare] <https://wg21.link/syserr.compare>`_,"| error_code
|
||||
| error_condition",None,Unassigned,|Not Started|
|
||||
| `[tuple.rel] <https://wg21.link/tuple.rel>`_,| `tuple <https://reviews.llvm.org/D108250>`_,[expos.only.func],Kent Ross,|Complete|
|
||||
"| `[optional.relops] <https://wg21.link/optional.relops>`_
|
||||
| `[optional.nullops] <https://wg21.link/optional.nullops>`_
|
||||
| `[optional.comp.with.t] <https://wg21.link/optional.comp.with.t>`_","| optional
|
||||
| nullopt",None,Kent Ross,|In Progress|
|
||||
"| `[variant.relops] <https://wg21.link/variant.relops>`_
|
||||
| `[variant.monostate.relops] <https://wg21.link/variant.monostate.relops>`_","| monostate
|
||||
| variant",None,Kent Ross,|In Progress|
|
||||
| `[unique.ptr.special] <https://wg21.link/unique.ptr.special>`_,| unique_ptr,[comparisons.three.way],Unassigned,|Not Started|
|
||||
| `[util.smartptr.shared.cmp] <https://wg21.link/util.smartptr.shared.cmp>`_,| shared_ptr,[comparisons.three.way],Unassigned,|Not Started|
|
||||
| `[type.index.members] <https://wg21.link/type.index.members>`_,| type_index,None,Unassigned,|Not Started|
|
||||
| `[charconv.syn] <https://wg21.link/charconv.syn>`_,| to_chars_result,None,Mark de Wever,|Complete|
|
||||
| `[charconv.syn] <https://wg21.link/charconv.syn>`_,| from_chars_result,None,Mark de Wever,|Complete|
|
||||
| `[stacktrace.entry.cmp] <https://wg21.link/stacktrace.entry.cmp>`_,| stacktrace_entry,None,Unassigned,|Not Started|
|
||||
| `[stacktrace.basic.cmp] <https://wg21.link/stacktrace.basic.cmp>`_,| basic_stacktrace,[alg.three.way],Unassigned,|Not Started|
|
||||
| `[string.cmp] <https://wg21.link/string.cmp>`_,| `basic_string <https://reviews.llvm.org/D80895>`_,None,Christopher Di Bella,|In Progress|
|
||||
| `[string.view.comparison] <https://wg21.link/string.view.comparison>`_,| `basic_string_view <https://reviews.llvm.org/D80891>`_,None,Christopher Di Bella,|In Progress|
|
||||
| `[array.syn] <https://wg21.link/array.syn>`_ (`general <https://wg21.link/container.requirements.general#14>`_),| array,[expos.only.func],Unassigned,|Not Started|
|
||||
| `[deque.syn] <https://wg21.link/deque.syn>`_ (`general <https://wg21.link/container.requirements.general#14>`_),| deque,[expos.only.func],Unassigned,|Not Started|
|
||||
| `[forward.list.syn] <https://wg21.link/forward.list.syn>`_ (`general <https://wg21.link/container.requirements.general#14>`_),| forward_list,[expos.only.func],Unassigned,|Not Started|
|
||||
| `[list.syn] <https://wg21.link/list.syn>`_ (`general <https://wg21.link/container.requirements.general#14>`_),| list,[expos.only.func],Unassigned,|Not Started|
|
||||
| `[vector.syn] <https://wg21.link/vector.syn>`_ (`general <https://wg21.link/container.requirements.general#14>`_),| vector,[expos.only.func],Unassigned,|Not Started|
|
||||
| `[associative.map.syn] <https://wg21.link/associative.map.syn>`_ (`general <https://wg21.link/container.requirements.general#14>`_),"| map
|
||||
| multimap",[expos.only.func],Unassigned,|Not Started|
|
||||
| `[associative.set.syn] <https://wg21.link/associative.set.syn>`_ (`general <https://wg21.link/container.requirements.general#14>`_),"| multiset
|
||||
| set",[expos.only.func],Unassigned,|Not Started|
|
||||
| `[queue.ops] <https://wg21.link/queue.ops>`_,| queue,None,Unassigned,|Not Started|
|
||||
| `[stack.ops] <https://wg21.link/stack.ops>`_,| stack,None,Unassigned,|Not Started|
|
||||
| `[reverse.iter.cmp] <https://wg21.link/reverse.iter.cmp>`_,| reverse_iterator,None,Mikhail Maltsev,|Complete|
|
||||
| `[move.iter.op.comp] <https://wg21.link/move.iter.op.comp>`_,| move_iterator,None,Unassigned,|Not Started|
|
||||
| `[counted.iter.cmp] <https://wg21.link/counted.iter.cmp>`_,| counted_iterator,None,Unassigned,|Not Started|
|
||||
| `[range.iota.iterator] <https://wg21.link/range.iota.iterator>`_,| ranges::iota_view::iterator,[concepts.cmp],Unassigned,|Not Started|
|
||||
| `[range.transform.iterator] <https://wg21.link/range.transform.iterator>`_,| ranges::transform_view::iterator,[concepts.cmp],Unassigned,|Not Started|
|
||||
| `[range.elements.iterator] <https://wg21.link/range.elements.iterator>`_,| ranges::elements_view::iterator,[concepts.cmp],Unassigned,|Not Started|
|
||||
"| `[time.duration.comparisons] <https://wg21.link/time.duration.comparisons>`_
|
||||
| `[time.point.comparisons] <https://wg21.link/time.point.comparisons>`_
|
||||
| `[time.cal.day.nonmembers] <https://wg21.link/time.cal.day.nonmembers>`_
|
||||
| `[time.cal.month.nonmembers] <https://wg21.link/time.cal.month.nonmembers>`_
|
||||
| `[time.cal.year.nonmembers] <https://wg21.link/time.cal.year.nonmembers>`_
|
||||
| `[time.cal.md.nonmembers] <https://wg21.link/time.cal.md.nonmembers>`_
|
||||
| `[time.cal.mdlast] <https://wg21.link/time.cal.mdlast>`_
|
||||
| `[time.cal.ym.nonmembers] <https://wg21.link/time.cal.ym.nonmembers>`_
|
||||
| `[time.cal.ymd.nonmembers] <https://wg21.link/time.cal.ymd.nonmembers>`_
|
||||
| `[time.cal.ymdlast.nonmembers] <https://wg21.link/time.cal.ymdlast.nonmembers>`_
|
||||
| `[time.zone.nonmembers] <https://wg21.link/time.zone.nonmembers>`_
|
||||
| `[time.zone.leap.nonmembers] <https://wg21.link/time.zone.leap.nonmembers>`_
|
||||
| `[time.zone.link.nonmembers] <https://wg21.link/time.zone.link.nonmembers>`_","| chrono::duration
|
||||
| chrono::time_point
|
||||
| chrono::day
|
||||
| chrono::month
|
||||
| chrono::year
|
||||
| chrono::month_day
|
||||
| chrono::month_day_last
|
||||
| chrono::year_month
|
||||
| chrono::year_month_day
|
||||
| chrono::year_month_day_last
|
||||
| chrono::time_zone
|
||||
| chrono::leap_second
|
||||
| chrono::time_zone_link",None,Unassigned,|Not Started|
|
||||
| `[fs.path.nonmember] <https://wg21.link/fs.path.nonmember>`_,| filesystem::path,None,Unassigned,|Not Started|
|
||||
| `[fs.dir.entry.obs] <https://wg21.link/fs.dir.entry.obs>`_,| filesystem::directory_entry,None,Unassigned,|Not Started|
|
||||
| `[re.submatch.op] <https://wg21.link/re.submatch.op>`_,| sub_match,None,Unassigned,|Not Started|
|
||||
| `[thread.thread.id] <https://wg21.link/thread.thread.id>`_,| thread::id,None,Unassigned,|Not Started|
|
|
@ -1,29 +0,0 @@
|
||||
.. zip-status:
|
||||
|
||||
===========================
|
||||
libc++ Zip Status (P2321R2)
|
||||
===========================
|
||||
|
||||
.. include:: ../Helpers/Styles.rst
|
||||
|
||||
.. contents::
|
||||
:local:
|
||||
|
||||
Overview
|
||||
========
|
||||
|
||||
This document contains the status of the C++2b zip implementation in libc++.
|
||||
It is used to track both the status of the sub-projects of the effort and who
|
||||
is assigned to these sub-projects. This avoids duplicating effort.
|
||||
|
||||
If you are interested in contributing to this effort, please send a message
|
||||
to the #libcxx channel in the LLVM discord. Please *do not* start working
|
||||
on any items below that has already been assigned to someone else.
|
||||
|
||||
Sub-projects in the Implementation Effort
|
||||
=========================================
|
||||
|
||||
.. csv-table::
|
||||
:file: ZipProjects.csv
|
||||
:header-rows: 1
|
||||
:widths: auto
|
@ -1,27 +0,0 @@
|
||||
Section,Description,Dependencies,Assignee,Complete
|
||||
| `[tuple.syn] <https://wg21.link/tuple.syn>`_, "`[tuple] basic_common_reference, common_type <https://reviews.llvm.org/D116538>`_", None, Nikolas Klauser, |In Progress|
|
||||
| `[tuple.tuple] <https://wg21.link/tuple.tuple>`_, "`[tuple] constructor, assignment and swap overloads <https://reviews.llvm.org/D116621>`_", None, Nikolas Klauser, |In Progress|
|
||||
| `[utility.syn] <https://wg21.link/utility.syn>`_, "[pair] basic_common_reference, common_type", None, Nikolas Klauser, |Not Started|
|
||||
| `[pairs.pair] <https://wg21.link/pairs.pair>`_, "[pair] constructor, assignment and swap overloads", None, Nikolas Klauser, |Not Started|
|
||||
"| `[memory.syn] <https://wg21.link/memory.syn>`_
|
||||
| `[allocator.uses.construction] <https://wg21.link/allocator.uses.construction>`_", "[pair] uses_allocator_construction_args overloads", None, Unassigned, |Not Started|
|
||||
| `[vector.bool] <https://wg21.link/vector.bool>`_, "[vector<bool>::reference] add const operator= overload", None, Nikolas Klauser, |Not Started|
|
||||
| `[iterator.concept.winc] <https://wg21.link/iterator.concept.winc>`_, "Update weakly_comparable", None, Unassigned, |Not Started|
|
||||
| `[range.zip] <https://wg21.link/ranges.syn>`_, "zip_view", "| `zip_view::iterator`
|
||||
| `zip_view::sentinel`", Unassigned, |Not Started|
|
||||
| `[range.zip.iterator] <https://wg21.link/range.zip.transform>`_, "zip_view::iterator", None, Unassigned, |Not Started|
|
||||
| `[range.zip.sentinel] <https://wg21.link/range.zip.sentinel>`_, "zip_view::sentinel", None, Unassigned, |Not Started|
|
||||
| `[range.zip.transform.view] <https://wg21.link/range.zip.transform.view>`_, "zip_transform_view", "| `zip_transform_view::iterator`
|
||||
| `zip_transform_view::sentinel`", Unassigned, |Not Started|
|
||||
| `[range.zip.transform.iterator] <https://wg21.link/range.zip.transform.iterator>`_, "zip_transform_view::iterator", None, Unassigned, |Not Started|
|
||||
| `[range.zip.transform.sentinel] <https://wg21.link/range.zip.transform.sentinel>`_, "zip_transform_view::sentinel", None, Unassigned, |Not Started|
|
||||
| `[range.adjacent.view] <https://wg21.link/range.adjacent.view>`_, "adjacent_view", "| `adjacent_view::iterator`
|
||||
| `adjacent_view::sentinel`", Unassigned, |Not Started|
|
||||
| `[range.adjacent.iterator] <https://wg21.link/range.adjacent.iterator>`_, "adjacent_view::iterator", None, Unassigned, |Not Started|
|
||||
| `[range.adjacent.sentinel] <https://wg21.link/range.adjacent.sentinel>`_, "adjacent_view::sentinel", None, Unassigned, |Not Started|
|
||||
| `[range.adjacent.transform.view] <https://wg21.link/range.adjacent.transform.view>`_, "adjacent_transform_view", "| `adjacent_transform_view::iterator`,
|
||||
| `adjacent_transform_view::sentinel`", Unassigned, |Not Started|
|
||||
| `[range.adjacent.transform.iterator] <https://wg21.link/range.adjacent.transform.iterator>`_, "adjacent_transform_view::iterator", None, Unassigned, |Not Started|
|
||||
| `[range.adjacent.transform.sentinel] <https://wg21.link/range.adjacent.transform.sentinel>`_, "adjacent_transform_view::sentinel", None, Unassigned, |Not Started|
|
||||
| `[ranges.syn] <https://wg21.link/ranges.syn>`_, "enable_borrowed_range zip_view and adjacent_view", "| `zip_view`
|
||||
| `adjacent_view`", Unassigned, |Not Started|
|
|
@ -227,11 +227,12 @@ An example build would look like:
|
||||
.. code-block:: bash
|
||||
|
||||
$ cd build
|
||||
$ ninja cxx-benchmarks
|
||||
$ cmake [options] <path to libcxx sources>
|
||||
$ make cxx-benchmarks
|
||||
|
||||
This will build all of the benchmarks under ``<libcxx-src>/benchmarks`` to be
|
||||
built against the just-built libc++. The compiled tests are output into
|
||||
``build/projects/libcxx/benchmarks``.
|
||||
``build/benchmarks``.
|
||||
|
||||
The benchmarks can also be built against the platforms native standard library
|
||||
using the ``-DLIBCXX_BUILD_BENCHMARKS_NATIVE_STDLIB=ON`` CMake option. This
|
||||
@ -254,7 +255,8 @@ For example:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ cd build/projects/libcxx/benchmarks
|
||||
$ cd build/benchmarks
|
||||
$ make cxx-benchmarks
|
||||
$ ./algorithms.libcxx.out # Runs all the benchmarks
|
||||
$ ./algorithms.libcxx.out --benchmark_filter=BM_Sort.* # Only runs the sort benchmarks
|
||||
|
||||
|
@ -338,7 +338,6 @@ which no dialect declares as such (See the second form described above).
|
||||
* ``upper_bound``
|
||||
* ``lock_guard``'s constructors
|
||||
* ``as_const``
|
||||
* ``bit_cast``
|
||||
* ``forward``
|
||||
* ``move``
|
||||
* ``move_if_noexcept``
|
||||
|
@ -48,9 +48,9 @@ copyright = u'2011-%d, LLVM Project' % date.today().year
|
||||
# built documents.
|
||||
#
|
||||
# The short X.Y version.
|
||||
version = '14.0'
|
||||
version = '13.0'
|
||||
# The full version, including alpha/beta/rc tags.
|
||||
release = '14.0'
|
||||
release = '13.0'
|
||||
|
||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||
# for a list of supported languages.
|
||||
|
@ -43,10 +43,8 @@ Getting Started with libc++
|
||||
Status/Cxx17
|
||||
Status/Cxx20
|
||||
Status/Cxx2b
|
||||
Status/Format
|
||||
Status/Ranges
|
||||
Status/Spaceship
|
||||
Status/Zip
|
||||
Status/Format
|
||||
|
||||
|
||||
.. toctree::
|
||||
@ -93,6 +91,7 @@ reasons, but some of the major ones are:
|
||||
Further, both projects are apparently abandoned: STLport 5.2.1 was
|
||||
released in Oct'08, and STDCXX 4.2.1 in May'08.
|
||||
|
||||
.. _platform_and_compiler_support:
|
||||
|
||||
Platform and Compiler Support
|
||||
=============================
|
||||
@ -104,9 +103,8 @@ velocity, libc++ drops support for older compilers as newer ones are released.
|
||||
============ =============== ========================== =====================
|
||||
Compiler Versions Restrictions Support policy
|
||||
============ =============== ========================== =====================
|
||||
Clang 12, 13 latest two stable releases per `LLVM's release page <https://releases.llvm.org>`_
|
||||
Clang 11, 12 latest two stable releases per `LLVM's release page <https://releases.llvm.org>`_
|
||||
AppleClang 12 latest stable release per `Xcode's release page <https://developer.apple.com/documentation/xcode-release-notes>`_
|
||||
Open XL 17.1 (AIX) latest stable release per `Open XL's documentation page <https://www.ibm.com/docs/en/openxl-c-and-cpp-aix>`_
|
||||
GCC 11 In C++11 or later only latest stable release per `GCC's release page <https://gcc.gnu.org/releases.html>`_
|
||||
============ =============== ========================== =====================
|
||||
|
||||
@ -118,8 +116,7 @@ Target platform Target architecture Notes
|
||||
macOS 10.9+ i386, x86_64, arm64 Building the shared library itself requires targetting macOS 10.11+
|
||||
FreeBSD 10+ i386, x86_64, arm
|
||||
Linux i386, x86_64, arm, arm64
|
||||
Windows x86_64 Both MSVC and MinGW style environments
|
||||
AIX powerpc, powerpc64
|
||||
Windows x86_64
|
||||
=============== ========================= ============================
|
||||
|
||||
Generally speaking, libc++ should work on any platform that provides a fairly complete
|
||||
@ -132,8 +129,8 @@ for all the platforms and compilers that we claim to support. If a platform or c
|
||||
is not listed here, it is not officially supported. It may happen to work, and
|
||||
in practice the library is known to work on some platforms not listed here, but
|
||||
we don't make any guarantees. If you would like your compiler and/or platform
|
||||
to be formally supported and listed here, please work with the libc++ team to set
|
||||
up testing for your configuration.
|
||||
to be formally supported and listed here,
|
||||
please work with the libc++ team to set up testing for your configuration.
|
||||
|
||||
|
||||
C++ Dialect Support
|
||||
@ -158,7 +155,7 @@ This list contains known issues with libc++
|
||||
|
||||
A full list of currently open libc++ bugs can be `found here`__.
|
||||
|
||||
.. __: https://github.com/llvm/llvm-project/labels/libc%2B%2B
|
||||
.. __: https://bugs.llvm.org/buglist.cgi?component=All%20Bugs&product=libc%2B%2B&query_format=advanced&resolution=---&order=changeddate%20DESC%2Cassigned_to%20DESC%2Cbug_status%2Cpriority%2Cbug_id&list_id=74184
|
||||
|
||||
|
||||
Design Documents
|
||||
@ -178,7 +175,6 @@ Design Documents
|
||||
DesignDocs/NoexceptPolicy
|
||||
DesignDocs/ThreadingSupportAPI
|
||||
DesignDocs/UniquePtrTrivialAbi
|
||||
DesignDocs/UnspecifiedBehaviorRandomization
|
||||
DesignDocs/VisibilityMacros
|
||||
|
||||
|
||||
@ -199,7 +195,7 @@ and `Getting started with LLVM <https://llvm.org/docs/GettingStarted.html>`__.
|
||||
**Bug Reports**
|
||||
|
||||
If you think you've found a bug in libc++, please report it using
|
||||
the `LLVM bug tracker`_. If you're not sure, you
|
||||
the `LLVM Bugzilla`_. If you're not sure, you
|
||||
can post a message to the `libcxx-dev mailing list`_ or on IRC.
|
||||
|
||||
**Patches**
|
||||
@ -218,7 +214,7 @@ Quick Links
|
||||
===========
|
||||
* `LLVM Homepage <https://llvm.org/>`_
|
||||
* `libc++abi Homepage <http://libcxxabi.llvm.org/>`_
|
||||
* `LLVM bug tracker <https://github.com/llvm/llvm-project/labels/libc++/>`_
|
||||
* `LLVM Bugzilla <https://bugs.llvm.org/>`_
|
||||
* `libcxx-commits Mailing List`_
|
||||
* `libcxx-dev Mailing List`_
|
||||
* `Browse libc++ Sources <https://github.com/llvm/llvm-project/tree/main/libcxx/>`_
|
||||
|
@ -4,79 +4,76 @@ set(files
|
||||
__algorithm/any_of.h
|
||||
__algorithm/binary_search.h
|
||||
__algorithm/clamp.h
|
||||
__algorithm/comp.h
|
||||
__algorithm/comp_ref_type.h
|
||||
__algorithm/copy.h
|
||||
__algorithm/comp.h
|
||||
__algorithm/copy_backward.h
|
||||
__algorithm/copy_if.h
|
||||
__algorithm/copy_n.h
|
||||
__algorithm/count.h
|
||||
__algorithm/copy.h
|
||||
__algorithm/count_if.h
|
||||
__algorithm/equal.h
|
||||
__algorithm/count.h
|
||||
__algorithm/equal_range.h
|
||||
__algorithm/fill.h
|
||||
__algorithm/equal.h
|
||||
__algorithm/fill_n.h
|
||||
__algorithm/find.h
|
||||
__algorithm/fill.h
|
||||
__algorithm/find_end.h
|
||||
__algorithm/find_first_of.h
|
||||
__algorithm/find_if.h
|
||||
__algorithm/find_if_not.h
|
||||
__algorithm/for_each.h
|
||||
__algorithm/find_if.h
|
||||
__algorithm/find.h
|
||||
__algorithm/for_each_n.h
|
||||
__algorithm/generate.h
|
||||
__algorithm/for_each.h
|
||||
__algorithm/generate_n.h
|
||||
__algorithm/generate.h
|
||||
__algorithm/half_positive.h
|
||||
__algorithm/in_in_out_result.h
|
||||
__algorithm/in_in_result.h
|
||||
__algorithm/in_out_result.h
|
||||
__algorithm/includes.h
|
||||
__algorithm/inplace_merge.h
|
||||
__algorithm/is_heap.h
|
||||
__algorithm/is_heap_until.h
|
||||
__algorithm/is_heap.h
|
||||
__algorithm/is_partitioned.h
|
||||
__algorithm/is_permutation.h
|
||||
__algorithm/is_sorted.h
|
||||
__algorithm/is_sorted_until.h
|
||||
__algorithm/is_sorted.h
|
||||
__algorithm/iter_swap.h
|
||||
__algorithm/lexicographical_compare.h
|
||||
__algorithm/lower_bound.h
|
||||
__algorithm/make_heap.h
|
||||
__algorithm/max.h
|
||||
__algorithm/max_element.h
|
||||
__algorithm/max.h
|
||||
__algorithm/merge.h
|
||||
__algorithm/min.h
|
||||
__algorithm/min_element.h
|
||||
__algorithm/minmax.h
|
||||
__algorithm/min.h
|
||||
__algorithm/minmax_element.h
|
||||
__algorithm/minmax.h
|
||||
__algorithm/mismatch.h
|
||||
__algorithm/move.h
|
||||
__algorithm/move_backward.h
|
||||
__algorithm/move.h
|
||||
__algorithm/next_permutation.h
|
||||
__algorithm/none_of.h
|
||||
__algorithm/nth_element.h
|
||||
__algorithm/partial_sort.h
|
||||
__algorithm/partial_sort_copy.h
|
||||
__algorithm/partition.h
|
||||
__algorithm/partial_sort.h
|
||||
__algorithm/partition_copy.h
|
||||
__algorithm/partition_point.h
|
||||
__algorithm/partition.h
|
||||
__algorithm/pop_heap.h
|
||||
__algorithm/prev_permutation.h
|
||||
__algorithm/push_heap.h
|
||||
__algorithm/remove.h
|
||||
__algorithm/remove_copy.h
|
||||
__algorithm/remove_copy_if.h
|
||||
__algorithm/remove_copy.h
|
||||
__algorithm/remove_if.h
|
||||
__algorithm/replace.h
|
||||
__algorithm/replace_copy.h
|
||||
__algorithm/remove.h
|
||||
__algorithm/replace_copy_if.h
|
||||
__algorithm/replace_copy.h
|
||||
__algorithm/replace_if.h
|
||||
__algorithm/reverse.h
|
||||
__algorithm/replace.h
|
||||
__algorithm/reverse_copy.h
|
||||
__algorithm/rotate.h
|
||||
__algorithm/reverse.h
|
||||
__algorithm/rotate_copy.h
|
||||
__algorithm/rotate.h
|
||||
__algorithm/sample.h
|
||||
__algorithm/search.h
|
||||
__algorithm/search_n.h
|
||||
__algorithm/search.h
|
||||
__algorithm/set_difference.h
|
||||
__algorithm/set_intersection.h
|
||||
__algorithm/set_symmetric_difference.h
|
||||
@ -85,117 +82,34 @@ set(files
|
||||
__algorithm/shift_right.h
|
||||
__algorithm/shuffle.h
|
||||
__algorithm/sift_down.h
|
||||
__algorithm/sort.h
|
||||
__algorithm/sort_heap.h
|
||||
__algorithm/sort.h
|
||||
__algorithm/stable_partition.h
|
||||
__algorithm/stable_sort.h
|
||||
__algorithm/swap_ranges.h
|
||||
__algorithm/transform.h
|
||||
__algorithm/unique.h
|
||||
__algorithm/unique_copy.h
|
||||
__algorithm/unique.h
|
||||
__algorithm/unwrap_iter.h
|
||||
__algorithm/upper_bound.h
|
||||
__availability
|
||||
__bit/bit_cast.h
|
||||
__bit/byteswap.h
|
||||
__bit_reference
|
||||
__bits
|
||||
__bsd_locale_defaults.h
|
||||
__bsd_locale_fallbacks.h
|
||||
__charconv/chars_format.h
|
||||
__charconv/from_chars_result.h
|
||||
__charconv/to_chars_result.h
|
||||
__chrono/calendar.h
|
||||
__chrono/convert_to_timespec.h
|
||||
__chrono/duration.h
|
||||
__chrono/file_clock.h
|
||||
__chrono/high_resolution_clock.h
|
||||
__chrono/steady_clock.h
|
||||
__chrono/system_clock.h
|
||||
__chrono/time_point.h
|
||||
__compare/common_comparison_category.h
|
||||
__compare/compare_partial_order_fallback.h
|
||||
__compare/compare_strong_order_fallback.h
|
||||
__compare/compare_three_way.h
|
||||
__compare/compare_three_way_result.h
|
||||
__compare/compare_weak_order_fallback.h
|
||||
__compare/is_eq.h
|
||||
__compare/ordering.h
|
||||
__compare/partial_order.h
|
||||
__compare/strong_order.h
|
||||
__compare/synth_three_way.h
|
||||
__compare/three_way_comparable.h
|
||||
__compare/weak_order.h
|
||||
__concepts/arithmetic.h
|
||||
__concepts/assignable.h
|
||||
__concepts/boolean_testable.h
|
||||
__concepts/class_or_enum.h
|
||||
__concepts/common_reference_with.h
|
||||
__concepts/common_with.h
|
||||
__concepts/constructible.h
|
||||
__concepts/convertible_to.h
|
||||
__concepts/copyable.h
|
||||
__concepts/derived_from.h
|
||||
__concepts/destructible.h
|
||||
__concepts/different_from.h
|
||||
__concepts/equality_comparable.h
|
||||
__concepts/invocable.h
|
||||
__concepts/movable.h
|
||||
__concepts/predicate.h
|
||||
__concepts/regular.h
|
||||
__concepts/relation.h
|
||||
__concepts/same_as.h
|
||||
__concepts/semiregular.h
|
||||
__concepts/swappable.h
|
||||
__concepts/totally_ordered.h
|
||||
__config
|
||||
__coroutine/coroutine_handle.h
|
||||
__coroutine/coroutine_traits.h
|
||||
__coroutine/noop_coroutine_handle.h
|
||||
__coroutine/trivial_awaitables.h
|
||||
__debug
|
||||
__errc
|
||||
__filesystem/copy_options.h
|
||||
__filesystem/directory_entry.h
|
||||
__filesystem/directory_iterator.h
|
||||
__filesystem/directory_options.h
|
||||
__filesystem/file_status.h
|
||||
__filesystem/file_time_type.h
|
||||
__filesystem/file_type.h
|
||||
__filesystem/filesystem_error.h
|
||||
__filesystem/operations.h
|
||||
__filesystem/path.h
|
||||
__filesystem/path_iterator.h
|
||||
__filesystem/perm_options.h
|
||||
__filesystem/perms.h
|
||||
__filesystem/recursive_directory_iterator.h
|
||||
__filesystem/space_info.h
|
||||
__filesystem/u8path.h
|
||||
__format/format_arg.h
|
||||
__format/format_args.h
|
||||
__format/format_context.h
|
||||
__format/format_error.h
|
||||
__format/format_fwd.h
|
||||
__format/format_parse_context.h
|
||||
__format/format_string.h
|
||||
__format/format_to_n_result.h
|
||||
__format/formatter.h
|
||||
__format/formatter_bool.h
|
||||
__format/formatter_char.h
|
||||
__format/formatter_floating_point.h
|
||||
__format/formatter_integer.h
|
||||
__format/formatter_integral.h
|
||||
__format/formatter_pointer.h
|
||||
__format/formatter_string.h
|
||||
__format/parser_std_format_spec.h
|
||||
__function_like.h
|
||||
__functional_base
|
||||
__functional/binary_function.h
|
||||
__functional/binary_negate.h
|
||||
__functional/bind.h
|
||||
__functional/bind_back.h
|
||||
__functional/bind_front.h
|
||||
__functional/bind.h
|
||||
__functional/binder1st.h
|
||||
__functional/binder2nd.h
|
||||
__functional/compose.h
|
||||
__functional/default_searcher.h
|
||||
__functional/function.h
|
||||
__functional/hash.h
|
||||
@ -215,7 +129,6 @@ set(files
|
||||
__functional/unary_negate.h
|
||||
__functional/unwrap_ref.h
|
||||
__functional/weak_result_type.h
|
||||
__functional_base
|
||||
__hash_table
|
||||
__iterator/access.h
|
||||
__iterator/advance.h
|
||||
@ -230,14 +143,13 @@ set(files
|
||||
__iterator/erase_if_container.h
|
||||
__iterator/front_insert_iterator.h
|
||||
__iterator/incrementable_traits.h
|
||||
__iterator/indirectly_comparable.h
|
||||
__iterator/insert_iterator.h
|
||||
__iterator/istream_iterator.h
|
||||
__iterator/istreambuf_iterator.h
|
||||
__iterator/iter_move.h
|
||||
__iterator/iter_swap.h
|
||||
__iterator/iterator.h
|
||||
__iterator/iterator_traits.h
|
||||
__iterator/iterator.h
|
||||
__iterator/move_iterator.h
|
||||
__iterator/next.h
|
||||
__iterator/ostream_iterator.h
|
||||
@ -248,109 +160,47 @@ set(files
|
||||
__iterator/reverse_access.h
|
||||
__iterator/reverse_iterator.h
|
||||
__iterator/size.h
|
||||
__iterator/unreachable_sentinel.h
|
||||
__iterator/wrap_iter.h
|
||||
__libcpp_version
|
||||
__locale
|
||||
__mbstate_t.h
|
||||
__memory/addressof.h
|
||||
__memory/allocation_guard.h
|
||||
__memory/allocator.h
|
||||
__memory/allocator_arg_t.h
|
||||
__memory/allocator_traits.h
|
||||
__memory/allocator.h
|
||||
__memory/auto_ptr.h
|
||||
__memory/compressed_pair.h
|
||||
__memory/concepts.h
|
||||
__memory/construct_at.h
|
||||
__memory/pointer_safety.h
|
||||
__memory/pointer_traits.h
|
||||
__memory/ranges_construct_at.h
|
||||
__memory/ranges_uninitialized_algorithms.h
|
||||
__memory/raw_storage_iterator.h
|
||||
__memory/shared_ptr.h
|
||||
__memory/temporary_buffer.h
|
||||
__memory/uninitialized_algorithms.h
|
||||
__memory/unique_ptr.h
|
||||
__memory/uses_allocator.h
|
||||
__memory/voidify.h
|
||||
__mutex_base
|
||||
__node_handle
|
||||
__nullptr
|
||||
__numeric/accumulate.h
|
||||
__numeric/adjacent_difference.h
|
||||
__numeric/exclusive_scan.h
|
||||
__numeric/gcd_lcm.h
|
||||
__numeric/inclusive_scan.h
|
||||
__numeric/inner_product.h
|
||||
__numeric/iota.h
|
||||
__numeric/midpoint.h
|
||||
__numeric/partial_sum.h
|
||||
__numeric/reduce.h
|
||||
__numeric/transform_exclusive_scan.h
|
||||
__numeric/transform_inclusive_scan.h
|
||||
__numeric/transform_reduce.h
|
||||
__random/bernoulli_distribution.h
|
||||
__random/binomial_distribution.h
|
||||
__random/cauchy_distribution.h
|
||||
__random/chi_squared_distribution.h
|
||||
__random/clamp_to_integral.h
|
||||
__random/default_random_engine.h
|
||||
__random/discard_block_engine.h
|
||||
__random/discrete_distribution.h
|
||||
__random/exponential_distribution.h
|
||||
__random/extreme_value_distribution.h
|
||||
__random/fisher_f_distribution.h
|
||||
__random/gamma_distribution.h
|
||||
__random/generate_canonical.h
|
||||
__random/geometric_distribution.h
|
||||
__random/independent_bits_engine.h
|
||||
__random/is_seed_sequence.h
|
||||
__random/knuth_b.h
|
||||
__random/linear_congruential_engine.h
|
||||
__random/log2.h
|
||||
__random/lognormal_distribution.h
|
||||
__random/mersenne_twister_engine.h
|
||||
__random/negative_binomial_distribution.h
|
||||
__random/normal_distribution.h
|
||||
__random/piecewise_constant_distribution.h
|
||||
__random/piecewise_linear_distribution.h
|
||||
__random/poisson_distribution.h
|
||||
__random/random_device.h
|
||||
__random/ranlux.h
|
||||
__random/seed_seq.h
|
||||
__random/shuffle_order_engine.h
|
||||
__random/student_t_distribution.h
|
||||
__random/subtract_with_carry_engine.h
|
||||
__random/uniform_int_distribution.h
|
||||
__random/uniform_random_bit_generator.h
|
||||
__random/uniform_real_distribution.h
|
||||
__random/weibull_distribution.h
|
||||
__ranges/access.h
|
||||
__ranges/all.h
|
||||
__ranges/common_view.h
|
||||
__ranges/concepts.h
|
||||
__ranges/copyable_box.h
|
||||
__ranges/counted.h
|
||||
__ranges/dangling.h
|
||||
__ranges/data.h
|
||||
__ranges/drop_view.h
|
||||
__ranges/empty.h
|
||||
__ranges/empty_view.h
|
||||
__ranges/empty.h
|
||||
__ranges/enable_borrowed_range.h
|
||||
__ranges/enable_view.h
|
||||
__ranges/iota_view.h
|
||||
__ranges/join_view.h
|
||||
__ranges/non_propagating_cache.h
|
||||
__ranges/owning_view.h
|
||||
__ranges/range_adaptor.h
|
||||
__ranges/ref_view.h
|
||||
__ranges/reverse_view.h
|
||||
__ranges/single_view.h
|
||||
__ranges/size.h
|
||||
__ranges/subrange.h
|
||||
__ranges/take_view.h
|
||||
__ranges/transform_view.h
|
||||
__ranges/view_interface.h
|
||||
__ranges/views.h
|
||||
__split_buffer
|
||||
__std_stream
|
||||
__string
|
||||
@ -358,12 +208,14 @@ set(files
|
||||
__support/fuchsia/xlocale.h
|
||||
__support/ibm/gettod_zos.h
|
||||
__support/ibm/limits.h
|
||||
__support/ibm/locale_mgmt_aix.h
|
||||
__support/ibm/locale_mgmt_zos.h
|
||||
__support/ibm/nanosleep.h
|
||||
__support/ibm/support.h
|
||||
__support/ibm/xlocale.h
|
||||
__support/musl/xlocale.h
|
||||
__support/newlib/xlocale.h
|
||||
__support/nuttx/xlocale.h
|
||||
__support/openbsd/xlocale.h
|
||||
__support/solaris/floatingpoint.h
|
||||
__support/solaris/wchar.h
|
||||
@ -373,14 +225,12 @@ set(files
|
||||
__support/xlocale/__nop_locale_mgmt.h
|
||||
__support/xlocale/__posix_l_fallback.h
|
||||
__support/xlocale/__strtonum_fallback.h
|
||||
__thread/poll_with_backoff.h
|
||||
__thread/timed_backoff_policy.h
|
||||
__threading_support
|
||||
__tree
|
||||
__tuple
|
||||
__undef_macros
|
||||
__utility/__decay_copy.h
|
||||
__utility/as_const.h
|
||||
__utility/auto_cast.h
|
||||
__utility/cmp.h
|
||||
__utility/declval.h
|
||||
__utility/exchange.h
|
||||
@ -390,11 +240,9 @@ set(files
|
||||
__utility/move.h
|
||||
__utility/pair.h
|
||||
__utility/piecewise_construct.h
|
||||
__utility/priority_tag.h
|
||||
__utility/rel_ops.h
|
||||
__utility/swap.h
|
||||
__utility/to_underlying.h
|
||||
__utility/transaction.h
|
||||
__variant/monostate.h
|
||||
algorithm
|
||||
any
|
||||
@ -422,7 +270,6 @@ set(files
|
||||
complex.h
|
||||
concepts
|
||||
condition_variable
|
||||
coroutine
|
||||
csetjmp
|
||||
csignal
|
||||
cstdarg
|
||||
@ -501,6 +348,7 @@ set(files
|
||||
queue
|
||||
random
|
||||
ranges
|
||||
ranges
|
||||
ratio
|
||||
regex
|
||||
scoped_allocator
|
||||
@ -519,8 +367,8 @@ set(files
|
||||
stdlib.h
|
||||
streambuf
|
||||
string
|
||||
string.h
|
||||
string_view
|
||||
string.h
|
||||
strstream
|
||||
system_error
|
||||
tgmath.h
|
||||
@ -570,7 +418,7 @@ if (LIBCXX_INSTALL_HEADERS)
|
||||
foreach(file ${files})
|
||||
get_filename_component(dir ${file} DIRECTORY)
|
||||
install(FILES ${file}
|
||||
DESTINATION "${LIBCXX_INSTALL_INCLUDE_DIR}/${dir}"
|
||||
DESTINATION ${LIBCXX_INSTALL_INCLUDE_DIR}/${dir}
|
||||
COMPONENT cxx-headers
|
||||
PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
|
||||
)
|
||||
@ -578,7 +426,7 @@ if (LIBCXX_INSTALL_HEADERS)
|
||||
|
||||
# Install the generated __config_site.
|
||||
install(FILES ${LIBCXX_GENERATED_INCLUDE_TARGET_DIR}/__config_site
|
||||
DESTINATION "${LIBCXX_INSTALL_INCLUDE_TARGET_DIR}"
|
||||
DESTINATION ${LIBCXX_INSTALL_INCLUDE_TARGET_DIR}
|
||||
PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
|
||||
COMPONENT cxx-headers)
|
||||
|
||||
|
@ -10,14 +10,17 @@
|
||||
#ifndef _LIBCPP___ALGORITHM_ADJACENT_FIND_H
|
||||
#define _LIBCPP___ALGORITHM_ADJACENT_FIND_H
|
||||
|
||||
#include <__algorithm/comp.h>
|
||||
#include <__config>
|
||||
#include <__algorithm/comp.h>
|
||||
#include <__iterator/iterator_traits.h>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_PUSH_MACROS
|
||||
#include <__undef_macros>
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _ForwardIterator, class _BinaryPredicate>
|
||||
@ -43,4 +46,6 @@ adjacent_find(_ForwardIterator __first, _ForwardIterator __last) {
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
_LIBCPP_POP_MACROS
|
||||
|
||||
#endif // _LIBCPP___ALGORITHM_ADJACENT_FIND_H
|
||||
|
@ -16,6 +16,9 @@
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_PUSH_MACROS
|
||||
#include <__undef_macros>
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _InputIterator, class _Predicate>
|
||||
@ -29,4 +32,6 @@ all_of(_InputIterator __first, _InputIterator __last, _Predicate __pred) {
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
_LIBCPP_POP_MACROS
|
||||
|
||||
#endif // _LIBCPP___ALGORITHM_ALL_OF_H
|
||||
|
@ -16,6 +16,9 @@
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_PUSH_MACROS
|
||||
#include <__undef_macros>
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _InputIterator, class _Predicate>
|
||||
@ -29,4 +32,6 @@ any_of(_InputIterator __first, _InputIterator __last, _Predicate __pred) {
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
_LIBCPP_POP_MACROS
|
||||
|
||||
#endif // _LIBCPP___ALGORITHM_ANY_OF_H
|
||||
|
@ -9,16 +9,19 @@
|
||||
#ifndef _LIBCPP___ALGORITHM_BINARY_SEARCH_H
|
||||
#define _LIBCPP___ALGORITHM_BINARY_SEARCH_H
|
||||
|
||||
#include <__algorithm/comp.h>
|
||||
#include <__algorithm/comp_ref_type.h>
|
||||
#include <__algorithm/lower_bound.h>
|
||||
#include <__config>
|
||||
#include <__algorithm/comp.h>
|
||||
#include <__algorithm/lower_bound.h>
|
||||
#include <__algorithm/comp_ref_type.h>
|
||||
#include <__iterator/iterator_traits.h>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_PUSH_MACROS
|
||||
#include <__undef_macros>
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _Compare, class _ForwardIterator, class _Tp>
|
||||
@ -50,6 +53,9 @@ binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __va
|
||||
__less<typename iterator_traits<_ForwardIterator>::value_type, _Tp>());
|
||||
}
|
||||
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
_LIBCPP_POP_MACROS
|
||||
|
||||
#endif // _LIBCPP___ALGORITHM_BINARY_SEARCH_H
|
||||
|
@ -9,17 +9,21 @@
|
||||
#ifndef _LIBCPP___ALGORITHM_CLAMP_H
|
||||
#define _LIBCPP___ALGORITHM_CLAMP_H
|
||||
|
||||
#include <__algorithm/comp.h>
|
||||
#include <__config>
|
||||
#include <__debug>
|
||||
#include <__algorithm/comp.h>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_PUSH_MACROS
|
||||
#include <__undef_macros>
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
#if _LIBCPP_STD_VER > 14
|
||||
// clamp
|
||||
template<class _Tp, class _Compare>
|
||||
_LIBCPP_NODISCARD_EXT inline
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||
@ -43,4 +47,6 @@ clamp(const _Tp& __v, const _Tp& __lo, const _Tp& __hi)
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
_LIBCPP_POP_MACROS
|
||||
|
||||
#endif // _LIBCPP___ALGORITHM_CLAMP_H
|
||||
|
@ -15,6 +15,9 @@
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_PUSH_MACROS
|
||||
#include <__undef_macros>
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
// I'd like to replace these with _VSTD::equal_to<void>, but can't because:
|
||||
@ -89,4 +92,6 @@ struct __less<_T1, const _T1>
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
_LIBCPP_POP_MACROS
|
||||
|
||||
#endif // _LIBCPP___ALGORITHM_COMP_H
|
||||
|
@ -10,16 +10,15 @@
|
||||
#define _LIBCPP___ALGORITHM_COMP_REF_TYPE_H
|
||||
|
||||
#include <__config>
|
||||
|
||||
#ifdef _LIBCPP_DEBUG
|
||||
# include <__debug>
|
||||
# include <__utility/declval.h>
|
||||
#endif
|
||||
#include <type_traits>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_PUSH_MACROS
|
||||
#include <__undef_macros>
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
#ifdef _LIBCPP_DEBUG
|
||||
@ -28,11 +27,11 @@ template <class _Compare>
|
||||
struct __debug_less
|
||||
{
|
||||
_Compare &__comp_;
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
__debug_less(_Compare& __c) : __comp_(__c) {}
|
||||
|
||||
template <class _Tp, class _Up>
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
bool operator()(const _Tp& __x, const _Up& __y)
|
||||
{
|
||||
bool __r = __comp_(__x, __y);
|
||||
@ -42,7 +41,7 @@ struct __debug_less
|
||||
}
|
||||
|
||||
template <class _Tp, class _Up>
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
bool operator()(_Tp& __x, _Up& __y)
|
||||
{
|
||||
bool __r = __comp_(__x, __y);
|
||||
@ -52,7 +51,7 @@ struct __debug_less
|
||||
}
|
||||
|
||||
template <class _LHS, class _RHS>
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
decltype((void)declval<_Compare&>()(
|
||||
declval<_LHS &>(), declval<_RHS &>()))
|
||||
@ -62,7 +61,7 @@ struct __debug_less
|
||||
}
|
||||
|
||||
template <class _LHS, class _RHS>
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void __do_compare_assert(long, _LHS &, _RHS &) {}
|
||||
};
|
||||
@ -74,12 +73,15 @@ struct __comp_ref_type {
|
||||
// Pass the comparator by lvalue reference. Or in debug mode, using a
|
||||
// debugging wrapper that stores a reference.
|
||||
#ifndef _LIBCPP_DEBUG
|
||||
typedef _Comp& type;
|
||||
typedef typename add_lvalue_reference<_Comp>::type type;
|
||||
#else
|
||||
typedef __debug_less<_Comp> type;
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
_LIBCPP_POP_MACROS
|
||||
|
||||
#endif // _LIBCPP___ALGORITHM_COMP_REF_TYPE_H
|
||||
|
@ -9,8 +9,8 @@
|
||||
#ifndef _LIBCPP___ALGORITHM_COPY_H
|
||||
#define _LIBCPP___ALGORITHM_COPY_H
|
||||
|
||||
#include <__algorithm/unwrap_iter.h>
|
||||
#include <__config>
|
||||
#include <__algorithm/unwrap_iter.h>
|
||||
#include <__iterator/iterator_traits.h>
|
||||
#include <cstring>
|
||||
#include <type_traits>
|
||||
@ -19,6 +19,9 @@
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_PUSH_MACROS
|
||||
#include <__undef_macros>
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
// copy
|
||||
@ -74,4 +77,6 @@ copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
_LIBCPP_POP_MACROS
|
||||
|
||||
#endif // _LIBCPP___ALGORITHM_COPY_H
|
||||
|
@ -9,8 +9,8 @@
|
||||
#ifndef _LIBCPP___ALGORITHM_COPY_BACKWARD_H
|
||||
#define _LIBCPP___ALGORITHM_COPY_BACKWARD_H
|
||||
|
||||
#include <__algorithm/unwrap_iter.h>
|
||||
#include <__config>
|
||||
#include <__algorithm/unwrap_iter.h>
|
||||
#include <__iterator/iterator_traits.h>
|
||||
#include <cstring>
|
||||
#include <type_traits>
|
||||
@ -19,6 +19,9 @@
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_PUSH_MACROS
|
||||
#include <__undef_macros>
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _BidirectionalIterator, class _OutputIterator>
|
||||
@ -76,4 +79,6 @@ copy_backward(_BidirectionalIterator1 __first, _BidirectionalIterator1 __last,
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
_LIBCPP_POP_MACROS
|
||||
|
||||
#endif // _LIBCPP___ALGORITHM_COPY_BACKWARD_H
|
||||
|
@ -10,11 +10,18 @@
|
||||
#define _LIBCPP___ALGORITHM_COPY_IF_H
|
||||
|
||||
#include <__config>
|
||||
#include <__algorithm/unwrap_iter.h>
|
||||
#include <__iterator/iterator_traits.h>
|
||||
#include <cstring>
|
||||
#include <type_traits>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_PUSH_MACROS
|
||||
#include <__undef_macros>
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template<class _InputIterator, class _OutputIterator, class _Predicate>
|
||||
@ -36,4 +43,6 @@ copy_if(_InputIterator __first, _InputIterator __last,
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
_LIBCPP_POP_MACROS
|
||||
|
||||
#endif // _LIBCPP___ALGORITHM_COPY_IF_H
|
||||
|
@ -9,15 +9,20 @@
|
||||
#ifndef _LIBCPP___ALGORITHM_COPY_N_H
|
||||
#define _LIBCPP___ALGORITHM_COPY_N_H
|
||||
|
||||
#include <__algorithm/copy.h>
|
||||
#include <__config>
|
||||
#include <__algorithm/copy.h>
|
||||
#include <__algorithm/unwrap_iter.h>
|
||||
#include <__iterator/iterator_traits.h>
|
||||
#include <cstring>
|
||||
#include <type_traits>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_PUSH_MACROS
|
||||
#include <__undef_macros>
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template<class _InputIterator, class _Size, class _OutputIterator>
|
||||
@ -55,12 +60,13 @@ typename enable_if
|
||||
>::type
|
||||
copy_n(_InputIterator __first, _Size __orig_n, _OutputIterator __result)
|
||||
{
|
||||
typedef typename iterator_traits<_InputIterator>::difference_type difference_type;
|
||||
typedef decltype(_VSTD::__convert_to_integral(__orig_n)) _IntegralSize;
|
||||
_IntegralSize __n = __orig_n;
|
||||
return _VSTD::copy(__first, __first + difference_type(__n), __result);
|
||||
return _VSTD::copy(__first, __first + __n, __result);
|
||||
}
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
_LIBCPP_POP_MACROS
|
||||
|
||||
#endif // _LIBCPP___ALGORITHM_COPY_N_H
|
||||
|
@ -17,6 +17,9 @@
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_PUSH_MACROS
|
||||
#include <__undef_macros>
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _InputIterator, class _Tp>
|
||||
@ -32,4 +35,6 @@ _LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_C
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
_LIBCPP_POP_MACROS
|
||||
|
||||
#endif // _LIBCPP___ALGORITHM_COUNT_H
|
||||
|
@ -17,6 +17,9 @@
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_PUSH_MACROS
|
||||
#include <__undef_macros>
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _InputIterator, class _Predicate>
|
||||
@ -32,4 +35,6 @@ _LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_C
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
_LIBCPP_POP_MACROS
|
||||
|
||||
#endif // _LIBCPP___ALGORITHM_COUNT_IF_H
|
||||
|
@ -10,15 +10,18 @@
|
||||
#ifndef _LIBCPP___ALGORITHM_EQUAL_H
|
||||
#define _LIBCPP___ALGORITHM_EQUAL_H
|
||||
|
||||
#include <__algorithm/comp.h>
|
||||
#include <__config>
|
||||
#include <__iterator/distance.h>
|
||||
#include <__algorithm/comp.h>
|
||||
#include <__iterator/iterator_traits.h>
|
||||
#include <iterator> // FIXME: replace with <__iterator/distance.h> when it lands
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_PUSH_MACROS
|
||||
#include <__undef_macros>
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
|
||||
@ -57,14 +60,14 @@ __equal(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1, _Random
|
||||
if (_VSTD::distance(__first1, __last1) != _VSTD::distance(__first2, __last2))
|
||||
return false;
|
||||
return _VSTD::equal<_RandomAccessIterator1, _RandomAccessIterator2,
|
||||
_BinaryPredicate&>(__first1, __last1, __first2, __pred);
|
||||
typename add_lvalue_reference<_BinaryPredicate>::type>(__first1, __last1, __first2, __pred);
|
||||
}
|
||||
|
||||
template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 bool
|
||||
equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2,
|
||||
_BinaryPredicate __pred) {
|
||||
return _VSTD::__equal<_BinaryPredicate&>(
|
||||
return _VSTD::__equal<typename add_lvalue_reference<_BinaryPredicate>::type>(
|
||||
__first1, __last1, __first2, __last2, __pred, typename iterator_traits<_InputIterator1>::iterator_category(),
|
||||
typename iterator_traits<_InputIterator2>::iterator_category());
|
||||
}
|
||||
@ -82,4 +85,6 @@ equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
_LIBCPP_POP_MACROS
|
||||
|
||||
#endif // _LIBCPP___ALGORITHM_EQUAL_H
|
||||
|
@ -9,18 +9,21 @@
|
||||
#ifndef _LIBCPP___ALGORITHM_EQUAL_RANGE_H
|
||||
#define _LIBCPP___ALGORITHM_EQUAL_RANGE_H
|
||||
|
||||
#include <__config>
|
||||
#include <__algorithm/comp.h>
|
||||
#include <__algorithm/comp_ref_type.h>
|
||||
#include <__algorithm/half_positive.h>
|
||||
#include <__algorithm/lower_bound.h>
|
||||
#include <__algorithm/upper_bound.h>
|
||||
#include <__config>
|
||||
#include <iterator>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_PUSH_MACROS
|
||||
#include <__undef_macros>
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _Compare, class _ForwardIterator, class _Tp>
|
||||
@ -79,4 +82,6 @@ equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __valu
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
_LIBCPP_POP_MACROS
|
||||
|
||||
#endif // _LIBCPP___ALGORITHM_EQUAL_RANGE_H
|
||||
|
@ -9,8 +9,8 @@
|
||||
#ifndef _LIBCPP___ALGORITHM_FILL_H
|
||||
#define _LIBCPP___ALGORITHM_FILL_H
|
||||
|
||||
#include <__algorithm/fill_n.h>
|
||||
#include <__config>
|
||||
#include <__algorithm/fill_n.h>
|
||||
#include <__iterator/iterator_traits.h>
|
||||
#include <type_traits>
|
||||
|
||||
@ -18,6 +18,9 @@
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_PUSH_MACROS
|
||||
#include <__undef_macros>
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _ForwardIterator, class _Tp>
|
||||
@ -47,4 +50,6 @@ fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
_LIBCPP_POP_MACROS
|
||||
|
||||
#endif // _LIBCPP___ALGORITHM_FILL_H
|
||||
|
@ -17,6 +17,9 @@
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_PUSH_MACROS
|
||||
#include <__undef_macros>
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _OutputIterator, class _Size, class _Tp>
|
||||
@ -39,4 +42,6 @@ fill_n(_OutputIterator __first, _Size __n, const _Tp& __value_)
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
_LIBCPP_POP_MACROS
|
||||
|
||||
#endif // _LIBCPP___ALGORITHM_FILL_N_H
|
||||
|
@ -16,6 +16,9 @@
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_PUSH_MACROS
|
||||
#include <__undef_macros>
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _InputIterator, class _Tp>
|
||||
@ -29,4 +32,6 @@ find(_InputIterator __first, _InputIterator __last, const _Tp& __value_) {
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
_LIBCPP_POP_MACROS
|
||||
|
||||
#endif // _LIBCPP___ALGORITHM_FIND_H
|
||||
|
@ -10,14 +10,18 @@
|
||||
#ifndef _LIBCPP___ALGORITHM_FIND_END_OF_H
|
||||
#define _LIBCPP___ALGORITHM_FIND_END_OF_H
|
||||
|
||||
#include <__algorithm/comp.h>
|
||||
#include <__config>
|
||||
#include <__algorithm/comp.h>
|
||||
#include <__iterator/iterator_traits.h>
|
||||
#include <type_traits>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_PUSH_MACROS
|
||||
#include <__undef_macros>
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _BinaryPredicate, class _ForwardIterator1, class _ForwardIterator2>
|
||||
@ -95,16 +99,14 @@ template <class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAcc
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX11 _RandomAccessIterator1 __find_end(
|
||||
_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1, _RandomAccessIterator2 __first2,
|
||||
_RandomAccessIterator2 __last2, _BinaryPredicate __pred, random_access_iterator_tag, random_access_iterator_tag) {
|
||||
typedef typename iterator_traits<_RandomAccessIterator1>::difference_type _D1;
|
||||
typedef typename iterator_traits<_RandomAccessIterator2>::difference_type _D2;
|
||||
// Take advantage of knowing source and pattern lengths. Stop short when source is smaller than pattern
|
||||
_D2 __len2 = __last2 - __first2;
|
||||
typename iterator_traits<_RandomAccessIterator2>::difference_type __len2 = __last2 - __first2;
|
||||
if (__len2 == 0)
|
||||
return __last1;
|
||||
_D1 __len1 = __last1 - __first1;
|
||||
typename iterator_traits<_RandomAccessIterator1>::difference_type __len1 = __last1 - __first1;
|
||||
if (__len1 < __len2)
|
||||
return __last1;
|
||||
const _RandomAccessIterator1 __s = __first1 + _D1(__len2 - 1); // End of pattern match can't go before here
|
||||
const _RandomAccessIterator1 __s = __first1 + (__len2 - 1); // End of pattern match can't go before here
|
||||
_RandomAccessIterator1 __l1 = __last1;
|
||||
_RandomAccessIterator2 __l2 = __last2;
|
||||
--__l2;
|
||||
@ -132,7 +134,7 @@ template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredica
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator1
|
||||
find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2, _ForwardIterator2 __last2,
|
||||
_BinaryPredicate __pred) {
|
||||
return _VSTD::__find_end<_BinaryPredicate&>(
|
||||
return _VSTD::__find_end<typename add_lvalue_reference<_BinaryPredicate>::type>(
|
||||
__first1, __last1, __first2, __last2, __pred, typename iterator_traits<_ForwardIterator1>::iterator_category(),
|
||||
typename iterator_traits<_ForwardIterator2>::iterator_category());
|
||||
}
|
||||
@ -147,4 +149,6 @@ find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
_LIBCPP_POP_MACROS
|
||||
|
||||
#endif // _LIBCPP___ALGORITHM_FIND_END_OF_H
|
||||
|
@ -10,14 +10,17 @@
|
||||
#ifndef _LIBCPP___ALGORITHM_FIND_FIRST_OF_H
|
||||
#define _LIBCPP___ALGORITHM_FIND_FIRST_OF_H
|
||||
|
||||
#include <__algorithm/comp.h>
|
||||
#include <__config>
|
||||
#include <__algorithm/comp.h>
|
||||
#include <__iterator/iterator_traits.h>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_PUSH_MACROS
|
||||
#include <__undef_macros>
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
|
||||
@ -49,4 +52,6 @@ _LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_C
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
_LIBCPP_POP_MACROS
|
||||
|
||||
#endif // _LIBCPP___ALGORITHM_FIND_FIRST_OF_H
|
||||
|
@ -16,6 +16,9 @@
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_PUSH_MACROS
|
||||
#include <__undef_macros>
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _InputIterator, class _Predicate>
|
||||
@ -29,4 +32,6 @@ find_if(_InputIterator __first, _InputIterator __last, _Predicate __pred) {
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
_LIBCPP_POP_MACROS
|
||||
|
||||
#endif // _LIBCPP___ALGORITHM_FIND_IF_H
|
||||
|
@ -16,6 +16,9 @@
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_PUSH_MACROS
|
||||
#include <__undef_macros>
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _InputIterator, class _Predicate>
|
||||
@ -29,4 +32,6 @@ find_if_not(_InputIterator __first, _InputIterator __last, _Predicate __pred) {
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
_LIBCPP_POP_MACROS
|
||||
|
||||
#endif // _LIBCPP___ALGORITHM_FIND_IF_NOT_H
|
||||
|
@ -16,6 +16,9 @@
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_PUSH_MACROS
|
||||
#include <__undef_macros>
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _InputIterator, class _Function>
|
||||
@ -29,4 +32,6 @@ inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 _Function for_eac
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
_LIBCPP_POP_MACROS
|
||||
|
||||
#endif // _LIBCPP___ALGORITHM_FOR_EACH_H
|
||||
|
@ -17,6 +17,9 @@
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_PUSH_MACROS
|
||||
#include <__undef_macros>
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
#if _LIBCPP_STD_VER > 14
|
||||
@ -39,4 +42,6 @@ inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 _InputIterator fo
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
_LIBCPP_POP_MACROS
|
||||
|
||||
#endif // _LIBCPP___ALGORITHM_FOR_EACH_N_H
|
||||
|
@ -15,6 +15,9 @@
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_PUSH_MACROS
|
||||
#include <__undef_macros>
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _ForwardIterator, class _Generator>
|
||||
@ -28,4 +31,6 @@ generate(_ForwardIterator __first, _ForwardIterator __last, _Generator __gen)
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
_LIBCPP_POP_MACROS
|
||||
|
||||
#endif // _LIBCPP___ALGORITHM_GENERATE_H
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user