Index: libcxx/docs/FeatureTestMacroTable.rst =================================================================== --- libcxx/docs/FeatureTestMacroTable.rst +++ libcxx/docs/FeatureTestMacroTable.rst @@ -196,6 +196,8 @@ ------------------------------------------------- ----------------- ``__cpp_lib_list_remove_return_type`` ``201806L`` ------------------------------------------------- ----------------- + ``__cpp_lib_math_constants`` ``201907L`` + ------------------------------------------------- ----------------- ``__cpp_lib_ranges`` *unimplemented* ------------------------------------------------- ----------------- ``__cpp_lib_three_way_comparison`` *unimplemented* Index: libcxx/include/CMakeLists.txt =================================================================== --- libcxx/include/CMakeLists.txt +++ libcxx/include/CMakeLists.txt @@ -118,6 +118,7 @@ mutex new numeric + numbers optional ostream queue Index: libcxx/include/module.modulemap =================================================================== --- libcxx/include/module.modulemap +++ libcxx/include/module.modulemap @@ -382,6 +382,10 @@ header "numeric" export * } + module numbers { + header "numbers" + export * + } module optional { header "optional" export * Index: libcxx/include/numbers =================================================================== --- /dev/null +++ libcxx/include/numbers @@ -0,0 +1,232 @@ +// -*- C++ -*- +//===---------------------------- numbers ---------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP_NUMBERS +#define _LIBCPP_NUMBERS + +/* + numbers synopsis + +namespace std::numbers +{ + template inline constexpr T e_v = unspecified; + template inline constexpr T log2e_v = unspecified; + template inline constexpr T log10e_v = unspecified; + template inline constexpr T pi_v = unspecified; + template inline constexpr T inv_pi_v = unspecified; + template inline constexpr T inv_sqrtpi_v = unspecified; + template inline constexpr T ln2_v = unspecified; + template inline constexpr T ln10_v = unspecified; + template inline constexpr T sqrt2_v = unspecified; + template inline constexpr T sqrt3_v = unspecified; + template inline constexpr T inv_sqrt3_v = unspecified; + template inline constexpr T egamma_v = unspecified; + template inline constexpr T phi_v = unspecified; + + template inline constexpr T e_v = see below; + template inline constexpr T log2e_v = see below; + template inline constexpr T log10e_v = see below; + template inline constexpr T pi_v = see below; + template inline constexpr T inv_pi_v = see below; + template inline constexpr T inv_sqrtpi_v = see below; + template inline constexpr T ln2_v = see below; + template inline constexpr T ln10_v = see below; + template inline constexpr T sqrt2_v = see below; + template inline constexpr T sqrt3_v = see below; + template inline constexpr T inv_sqrt3_v = see below; + template inline constexpr T egamma_v = see below; + template inline constexpr T phi_v = see below; + + inline constexpr double e = e_v; + inline constexpr double log2e = log2e_v; + inline constexpr double log10e = log10e_v; + inline constexpr double pi = pi_v; + inline constexpr double inv_pi = inv_pi_v; + inline constexpr double inv_sqrtpi = inv_sqrtpi_v; + inline constexpr double ln2 = ln2_v; + inline constexpr double ln10 = ln10_v; + inline constexpr double sqrt2 = sqrt2_v; + inline constexpr double sqrt3 = sqrt3_v; + inline constexpr double inv_sqrt3 = inv_sqrt3_v; + inline constexpr double egamma = egamma_v; + inline constexpr double phi = phi_v; +} // std::numbers + +*/ + +#include <__config> +#include + +#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 > 17 + +namespace numbers { + +template +inline constexpr bool value = false; + +template +constexpr T _AlwaysFalse() { + static_assert(value, "Require Floating Point types"); + return T(); +} + +template +_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR + T e_v = _AlwaysFalse(); +template +_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR + T log2e_v = _AlwaysFalse(); +template +_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR + T log10e_v = _AlwaysFalse(); +template +_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR + T pi_v = _AlwaysFalse(); +template +_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR + T inv_pi_v = _AlwaysFalse(); +template +_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR + T inv_sqrtpi_v = _AlwaysFalse(); +template +_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR + T ln2_v = _AlwaysFalse(); +template +_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR + T ln10_v = _AlwaysFalse(); +template +_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR + T sqrt2_v = _AlwaysFalse(); +template +_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR + T sqrt3_v = _AlwaysFalse(); +template +_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR + T inv_sqrt3_v = _AlwaysFalse(); +template +_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR + T egamma_v = _AlwaysFalse(); +template +_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR + T phi_v = _AlwaysFalse(); + +template +concept floating_point = is_floating_point_v; + +// e +template +_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR +T e_v = T(2.718281828459045235360287471352662498L); + +// log2(e) +template +_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR +T log2e_v = T(1.442695040888963407359924681001892137L); + +// log10(e) +template +_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR +T log10e_v = T(0.434294481903251827651128918916605082L); + +// pi +template +_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR +T pi_v = T(3.141592653589793238462643383279502884L); + +// 1/pi +template +_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR +T inv_pi_v = T(0.318309886183790671537767526745028724L); + +// 1/sqrt(pi) +template +_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR +T inv_sqrtpi_v = T(0.564189583547756286948079451560772586L); + +// log_e(2) +template +_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR +T ln2_v = T(0.693147180559945309417232121458176568L); + +// log_e(10) +template +_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR +T ln10_v = T(2.302585092994045684017991454684364208L); + +// sqrt(2) +template +_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR +T sqrt2_v = T(1.414213562373095048801688724209698078L); + +// sqrt(3) +template +_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR +T sqrt3_v = T(1.732050807568877293527446341505872366L); + +// 1/sqrt(3) +template +_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR +T inv_sqrt3_v = T(0.577350269189625764509148780501957456L); + +// Euler-Mascheroni gama constant +template +_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR +T egamma_v = T(0.577215664901532860606512090082402402431L); + +// Golden ratio phi constant +template +_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR +T phi_v = T(1.618033988749894848204586834365638117L); + + +_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR + double e = e_v; +_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR + double log2e = log2e_v; +_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR + double log10e = log10e_v; +_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR + double pi = pi_v; +_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR + double inv_pi = inv_pi_v; +_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR + double inv_sqrtpi = inv_sqrtpi_v; +_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR + double ln2 = ln2_v; +_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR + double ln10 = ln10_v; +_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR + double sqrt2 = sqrt2_v; +_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR + double sqrt3 = sqrt3_v; +_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR + double inv_sqrt3 = inv_sqrt3_v; +_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR + double egamma = egamma_v; +_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR + double phi = phi_v; + +} //namespace numbers + +#endif //_LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif //_LIBCPP_NUMBERS Index: libcxx/include/version =================================================================== --- libcxx/include/version +++ libcxx/include/version @@ -74,6 +74,7 @@ __cpp_lib_make_reverse_iterator 201402L __cpp_lib_make_unique 201304L __cpp_lib_map_try_emplace 201411L +__cpp_lib_math_constants 201907L __cpp_lib_math_special_functions 201603L __cpp_lib_memory_resource 201603L __cpp_lib_node_extract 201606L @@ -233,9 +234,10 @@ # define __cpp_lib_is_constant_evaluated 201811L # endif # define __cpp_lib_list_remove_return_type 201806L +# define __cpp_lib_math_constants 201907L // # define __cpp_lib_ranges 201811L -# define __cpp_lib_to_array 201907L // # define __cpp_lib_three_way_comparison 201711L +# define __cpp_lib_to_array 201907L #endif #endif // _LIBCPP_VERSIONH Index: libcxx/test/libcxx/double_include.sh.cpp =================================================================== --- libcxx/test/libcxx/double_include.sh.cpp +++ libcxx/test/libcxx/double_include.sh.cpp @@ -99,6 +99,7 @@ #endif #include #include +#include #include #include #include Index: libcxx/test/std/language.support/support.limits/support.limits.general/numbers.version.pass.cpp =================================================================== --- /dev/null +++ libcxx/test/std/language.support/support.limits/support.limits.general/numbers.version.pass.cpp @@ -0,0 +1,52 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// WARNING: This test was generated by generate_feature_test_macro_components.py +// and should not be edited manually. + +// + +// Test the feature test macros defined by + +/* Constant Value + __cpp_lib_math_constants 201907L [C++2a] +*/ + +#include +#include "test_macros.h" + +#if TEST_STD_VER < 14 + +# ifdef __cpp_lib_math_constants +# error "__cpp_lib_math_constants should not be defined before c++2a" +# endif + +#elif TEST_STD_VER == 14 + +# ifdef __cpp_lib_math_constants +# error "__cpp_lib_math_constants should not be defined before c++2a" +# endif + +#elif TEST_STD_VER == 17 + +# ifdef __cpp_lib_math_constants +# error "__cpp_lib_math_constants should not be defined before c++2a" +# endif + +#elif TEST_STD_VER > 17 + +# ifndef __cpp_lib_math_constants +# error "__cpp_lib_math_constants should be defined in c++2a" +# endif +# if __cpp_lib_math_constants != 201907L +# error "__cpp_lib_math_constants should have the value 201907L in c++2a" +# endif + +#endif // TEST_STD_VER > 17 + +int main(int, char**) { return 0; } Index: libcxx/test/std/language.support/support.limits/support.limits.general/version.version.pass.cpp =================================================================== --- libcxx/test/std/language.support/support.limits/support.limits.general/version.version.pass.cpp +++ libcxx/test/std/language.support/support.limits/support.limits.general/version.version.pass.cpp @@ -66,6 +66,7 @@ __cpp_lib_make_reverse_iterator 201402L [C++14] __cpp_lib_make_unique 201304L [C++14] __cpp_lib_map_try_emplace 201411L [C++17] + __cpp_lib_math_constants 201907L [C++2a] __cpp_lib_math_special_functions 201603L [C++17] __cpp_lib_memory_resource 201603L [C++17] __cpp_lib_node_extract 201606L [C++17] @@ -315,6 +316,10 @@ # error "__cpp_lib_map_try_emplace should not be defined before c++17" # endif +# ifdef __cpp_lib_math_constants +# error "__cpp_lib_math_constants should not be defined before c++2a" +# endif + # ifdef __cpp_lib_math_special_functions # error "__cpp_lib_math_special_functions should not be defined before c++17" # endif @@ -687,6 +692,10 @@ # error "__cpp_lib_map_try_emplace should not be defined before c++17" # endif +# ifdef __cpp_lib_math_constants +# error "__cpp_lib_math_constants should not be defined before c++2a" +# endif + # ifdef __cpp_lib_math_special_functions # error "__cpp_lib_math_special_functions should not be defined before c++17" # endif @@ -1215,6 +1224,10 @@ # error "__cpp_lib_map_try_emplace should have the value 201411L in c++17" # endif +# ifdef __cpp_lib_math_constants +# error "__cpp_lib_math_constants should not be defined before c++2a" +# endif + # if !defined(_LIBCPP_VERSION) # ifndef __cpp_lib_math_special_functions # error "__cpp_lib_math_special_functions should be defined in c++17" @@ -1941,6 +1954,13 @@ # error "__cpp_lib_map_try_emplace should have the value 201411L in c++2a" # endif +# ifndef __cpp_lib_math_constants +# error "__cpp_lib_math_constants should be defined in c++2a" +# endif +# if __cpp_lib_math_constants != 201907L +# error "__cpp_lib_math_constants should have the value 201907L in c++2a" +# endif + # if !defined(_LIBCPP_VERSION) # ifndef __cpp_lib_math_special_functions # error "__cpp_lib_math_special_functions should be defined in c++2a" Index: libcxx/test/std/numerics/numbers/numbers.fail.cpp =================================================================== --- /dev/null +++ libcxx/test/std/numerics/numbers/numbers.fail.cpp @@ -0,0 +1,22 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++98, c++03, c++11, c++14, c++17 + + +#include +#include "test_macros.h" +struct S1 { +}; +int main(){ + + constexpr int d = std::numbers::e_v; // expected-error-re@numbers:* {{static_assert failed{{( due to requirement '.*')?}}}} + constexpr S1 s = std::numbers::e_v; // expected-error-re@numbers:* {{static_assert failed{{( due to requirement '.*')?}}}} + return 0; +} + Index: libcxx/test/std/numerics/numbers/numbers.pass.cpp =================================================================== --- /dev/null +++ libcxx/test/std/numerics/numbers/numbers.pass.cpp @@ -0,0 +1,79 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++98, c++03, c++11, c++14, c++17 + + +#include +#include "test_macros.h" + +int main() { + + // float + constexpr float f = std::numbers::e_v; + constexpr float f1 = std::numbers::log2e_v; + constexpr float f2 = std::numbers::log10e_v; + constexpr float f3 = std::numbers::pi_v; + constexpr float f4 = std::numbers::inv_pi_v; + constexpr float f5 = std::numbers::inv_sqrtpi_v; + constexpr float f6 = std::numbers::ln2_v; + constexpr float f7 = std::numbers::ln10_v; + constexpr float f8 = std::numbers::sqrt2_v; + constexpr float f9 = std::numbers::sqrt3_v; + constexpr float f10 = std::numbers::inv_sqrt3_v; + constexpr float f11 = std::numbers::egamma_v; + constexpr float f12 = std::numbers::phi_v; + + // double + constexpr double d = std::numbers::e_v; + constexpr double d1 = std::numbers::log2e_v; + constexpr double d2 = std::numbers::log10e_v; + constexpr double d3 = std::numbers::pi_v; + constexpr double d4 = std::numbers::inv_pi_v; + constexpr double d5 = std::numbers::inv_sqrtpi_v; + constexpr double d6 = std::numbers::ln2_v; + constexpr double d7 = std::numbers::ln10_v; + constexpr double d8 = std::numbers::sqrt2_v; + constexpr double d9 = std::numbers::sqrt3_v; + constexpr double d10 = std::numbers::inv_sqrt3_v; + constexpr double d11 = std::numbers::egamma_v; + constexpr double d12 = std::numbers::phi_v; + // static assert checks + static_assert(d == std::numbers::e, "d != std::numbers::e "); + static_assert(d1 == std::numbers::log2e, "d1 != std::numbers::log2e"); + static_assert(d2 == std::numbers::log10e, "d2 != std::numbers::log10e"); + static_assert(d3 == std::numbers::pi, "d3 != std::numbers::pi"); + static_assert(d4 == std::numbers::inv_pi, "d4 != std::numbers::inv_pi"); + static_assert(d5 == std::numbers::inv_sqrtpi, "d5 != std::numbers::inv_sqrtpi"); + static_assert(d6 == std::numbers::ln2, "d6 != std::numbers::ln2"); + static_assert(d7 == std::numbers::ln10, "d7 != std::numbers::ln10"); + static_assert(d8 == std::numbers::sqrt2, "d8 != std::numbers::sqrt2"); + static_assert(d9 == std::numbers::sqrt3, "d9 != std::numbers::sqrt3"); + static_assert(d10 == std::numbers::inv_sqrt3, "d10 != std::numbers::inv_sqrt3"); + static_assert(d11 == std::numbers::egamma, "d11 != std::numbers::egamma"); + static_assert(d12 == std::numbers::phi, "d12 != std::numbers::phi"); + // long oduble + constexpr long double ld = std::numbers::e_v; + constexpr long double ld1 = std::numbers::log2e_v; + constexpr long double ld2 = std::numbers::log10e_v; + constexpr long double ld3 = std::numbers::pi_v; + constexpr long double ld4 = std::numbers::inv_pi_v; + constexpr long double ld5 = std::numbers::inv_sqrtpi_v; + constexpr long double ld6 = std::numbers::ln2_v; + constexpr long double ld7 = std::numbers::ln10_v; + constexpr long double ld8 = std::numbers::sqrt2_v; + constexpr long double ld9 = std::numbers::sqrt3_v; + constexpr long double ld10 = std::numbers::inv_sqrt3_v; + constexpr long double ld11 = std::numbers::egamma_v; + constexpr long double ld12 = std::numbers::phi_v; + + return 0; + +} + + Index: libcxx/utils/generate_feature_test_macro_components.py =================================================================== --- libcxx/utils/generate_feature_test_macro_components.py +++ libcxx/utils/generate_feature_test_macro_components.py @@ -591,6 +591,12 @@ }, "headers": ["array"], }, + {"name": "__cpp_lib_math_constants", + "values": { + "c++2a": 201907L, + }, + "headers": ["numbers"], + }, ]], key=lambda tc: tc["name"]) def get_std_dialects(): Index: libcxx/www/cxx2a_status.html =================================================================== --- libcxx/www/cxx2a_status.html +++ libcxx/www/cxx2a_status.html @@ -161,7 +161,7 @@ P0408LWGEfficient Access to basic_stringbuf ’s BufferCologne P0466LWGLayout-compatibility and Pointer-interconvertibility TraitsCologne P0553LWGBit operationsCologneComplete9.0 - P0631LWGMath ConstantsCologne + P0631LWGMath ConstantsCologneComplete11.0 P0645LWGText FormattingCologne P0660LWGStop Token and Joining Thread, Rev 10Cologne P0784CWGMore constexpr containersCologne