Skip to content

Commit 7b00e9f

Browse files
author
Arthur O'Dwyer
committed
[libc++] [P1065] Constexpr invoke, reference_wrapper, mem_fn, not_fn, default_searcher.
This completes the implementation of P1065 "constexpr INVOKE": http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1065r2.html This doesn't yet complete the implementation of P1032 "Misc constexpr bits," http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1032r1.html but it does complete all of the <functional> bits, which means that we can now set `__cpp_lib_constexpr_functional` for C++20. This could use more constexpr tests for `std::reference_wrapper<T>`, but the existing tests are extremely non-constexpr-friendly and so I don't want to get into that rabbit-hole today. Differential Revision: https://reviews.llvm.org/D93815
1 parent 30f589c commit 7b00e9f

21 files changed

+538
-319
lines changed

libcxx/docs/Cxx2aStatusPaperStatus.csv

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@
109109
"`P0980 <https://wg21.link/P0980>`__","LWG","Making std::string constexpr","Cologne","",""
110110
"`P1004 <https://wg21.link/P1004>`__","LWG","Making std::vector constexpr","Cologne","",""
111111
"`P1035 <https://wg21.link/P1035>`__","LWG","Input Range Adaptors","Cologne","",""
112-
"`P1065 <https://wg21.link/P1065>`__","LWG","Constexpr INVOKE","Cologne","",""
112+
"`P1065 <https://wg21.link/P1065>`__","LWG","Constexpr INVOKE","Cologne","|Complete|","12.0"
113113
"`P1135 <https://wg21.link/P1135>`__","LWG","The C++20 Synchronization Library","Cologne","|Complete|","11.0"
114114
"`P1207 <https://wg21.link/P1207>`__","LWG","Movability of Single-pass Iterators","Cologne","",""
115115
"`P1208 <https://wg21.link/P1208>`__","LWG","Adopt source_location for C++20","Cologne","",""

libcxx/docs/FeatureTestMacroTable.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ Status
194194
------------------------------------------------- -----------------
195195
``__cpp_lib_constexpr_dynamic_alloc`` ``201907L``
196196
------------------------------------------------- -----------------
197-
``__cpp_lib_constexpr_misc`` *unimplemented*
197+
``__cpp_lib_constexpr_functional`` ``201907L``
198198
------------------------------------------------- -----------------
199199
``__cpp_lib_constexpr_numeric`` ``201911L``
200200
------------------------------------------------- -----------------

libcxx/include/__functional_base

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -382,20 +382,23 @@ private:
382382

383383
public:
384384
// construct/copy/destroy
385-
_LIBCPP_INLINE_VISIBILITY reference_wrapper(type& __f) _NOEXCEPT
385+
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
386+
reference_wrapper(type& __f) _NOEXCEPT
386387
: __f_(_VSTD::addressof(__f)) {}
387388
#ifndef _LIBCPP_CXX03_LANG
388389
private: reference_wrapper(type&&); public: // = delete; // do not bind to temps
389390
#endif
390391

391392
// access
392-
_LIBCPP_INLINE_VISIBILITY operator type& () const _NOEXCEPT {return *__f_;}
393-
_LIBCPP_INLINE_VISIBILITY type& get() const _NOEXCEPT {return *__f_;}
393+
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
394+
operator type&() const _NOEXCEPT {return *__f_;}
395+
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
396+
type& get() const _NOEXCEPT {return *__f_;}
394397

395398
#ifndef _LIBCPP_CXX03_LANG
396399
// invoke
397400
template <class... _ArgTypes>
398-
_LIBCPP_INLINE_VISIBILITY
401+
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
399402
typename __invoke_of<type&, _ArgTypes...>::type
400403
operator() (_ArgTypes&&... __args) const {
401404
return _VSTD::__invoke(get(), _VSTD::forward<_ArgTypes>(__args)...);
@@ -510,31 +513,31 @@ public:
510513

511514

512515
template <class _Tp>
513-
inline _LIBCPP_INLINE_VISIBILITY
516+
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
514517
reference_wrapper<_Tp>
515518
ref(_Tp& __t) _NOEXCEPT
516519
{
517520
return reference_wrapper<_Tp>(__t);
518521
}
519522

520523
template <class _Tp>
521-
inline _LIBCPP_INLINE_VISIBILITY
524+
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
522525
reference_wrapper<_Tp>
523526
ref(reference_wrapper<_Tp> __t) _NOEXCEPT
524527
{
525528
return _VSTD::ref(__t.get());
526529
}
527530

528531
template <class _Tp>
529-
inline _LIBCPP_INLINE_VISIBILITY
532+
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
530533
reference_wrapper<const _Tp>
531534
cref(const _Tp& __t) _NOEXCEPT
532535
{
533536
return reference_wrapper<const _Tp>(__t);
534537
}
535538

536539
template <class _Tp>
537-
inline _LIBCPP_INLINE_VISIBILITY
540+
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
538541
reference_wrapper<const _Tp>
539542
cref(reference_wrapper<_Tp> __t) _NOEXCEPT
540543
{

libcxx/include/functional

Lines changed: 29 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,8 @@ public:
213213
template <class Predicate> // deprecated in C++17
214214
binary_negate<Predicate> not2(const Predicate& pred);
215215
216-
template <class F> unspecified not_fn(F&& f); // C++17
216+
template <class F>
217+
constexpr unspecified not_fn(F&& f); // C++17, constexpr in C++20
217218
218219
template<class T> struct is_bind_expression;
219220
template<class T> struct is_placeholder;
@@ -226,11 +227,12 @@ template <class T> inline constexpr int is_placeholder_v
226227
227228
228229
template<class Fn, class... BoundArgs>
229-
unspecified bind(Fn&&, BoundArgs&&...);
230+
constexpr unspecified bind(Fn&&, BoundArgs&&...); // constexpr in C++20
230231
template<class R, class Fn, class... BoundArgs>
231-
unspecified bind(Fn&&, BoundArgs&&...);
232+
constexpr unspecified bind(Fn&&, BoundArgs&&...); // constexpr in C++20
232233
233234
template<class F, class... Args>
235+
constexpr // constexpr in C++20
234236
invoke_result_t<F, Args...> invoke(F&& f, Args&&... args) // C++17
235237
noexcept(is_nothrow_invocable_v<F, Args...>);
236238
@@ -376,7 +378,8 @@ public:
376378
template <class S, class T> const_mem_fun_ref_t<S,T> mem_fun_ref(S (T::*f)() const); // deprecated in C++11, removed in C++17
377379
template <class S, class T, class A> const_mem_fun1_ref_t<S,T,A> mem_fun_ref(S (T::*f)(A) const); // deprecated in C++11, removed in C++17
378380
379-
template<class R, class T> unspecified mem_fn(R T::*);
381+
template<class R, class T>
382+
constexpr unspecified mem_fn(R T::*); // constexpr in C++20
380383
381384
class bad_function_call
382385
: public exception
@@ -1288,12 +1291,13 @@ private:
12881291
type __f_;
12891292

12901293
public:
1291-
_LIBCPP_INLINE_VISIBILITY __mem_fn(type __f) _NOEXCEPT : __f_(__f) {}
1294+
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
1295+
__mem_fn(type __f) _NOEXCEPT : __f_(__f) {}
12921296

12931297
#ifndef _LIBCPP_CXX03_LANG
12941298
// invoke
12951299
template <class... _ArgTypes>
1296-
_LIBCPP_INLINE_VISIBILITY
1300+
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
12971301
typename __invoke_return<type, _ArgTypes...>::type
12981302
operator() (_ArgTypes&&... __args) const {
12991303
return _VSTD::__invoke(__f_, _VSTD::forward<_ArgTypes>(__args)...);
@@ -1401,7 +1405,7 @@ public:
14011405
};
14021406

14031407
template<class _Rp, class _Tp>
1404-
inline _LIBCPP_INLINE_VISIBILITY
1408+
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
14051409
__mem_fn<_Rp _Tp::*>
14061410
mem_fn(_Rp _Tp::* __pm) _NOEXCEPT
14071411
{
@@ -2873,13 +2877,13 @@ public:
28732877
!is_same<typename remove_reference<_Gp>::type,
28742878
__bind>::value
28752879
>::type>
2876-
_LIBCPP_INLINE_VISIBILITY
2880+
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
28772881
explicit __bind(_Gp&& __f, _BA&& ...__bound_args)
28782882
: __f_(_VSTD::forward<_Gp>(__f)),
28792883
__bound_args_(_VSTD::forward<_BA>(__bound_args)...) {}
28802884

28812885
template <class ..._Args>
2882-
_LIBCPP_INLINE_VISIBILITY
2886+
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
28832887
typename __bind_return<_Fd, _Td, tuple<_Args&&...> >::type
28842888
operator()(_Args&& ...__args)
28852889
{
@@ -2888,7 +2892,7 @@ public:
28882892
}
28892893

28902894
template <class ..._Args>
2891-
_LIBCPP_INLINE_VISIBILITY
2895+
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
28922896
typename __bind_return<const _Fd, const _Td, tuple<_Args&&...> >::type
28932897
operator()(_Args&& ...__args) const
28942898
{
@@ -2918,13 +2922,13 @@ public:
29182922
!is_same<typename remove_reference<_Gp>::type,
29192923
__bind_r>::value
29202924
>::type>
2921-
_LIBCPP_INLINE_VISIBILITY
2925+
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
29222926
explicit __bind_r(_Gp&& __f, _BA&& ...__bound_args)
29232927
: base(_VSTD::forward<_Gp>(__f),
29242928
_VSTD::forward<_BA>(__bound_args)...) {}
29252929

29262930
template <class ..._Args>
2927-
_LIBCPP_INLINE_VISIBILITY
2931+
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
29282932
typename enable_if
29292933
<
29302934
is_convertible<typename __bind_return<_Fd, _Td, tuple<_Args&&...> >::type,
@@ -2938,7 +2942,7 @@ public:
29382942
}
29392943

29402944
template <class ..._Args>
2941-
_LIBCPP_INLINE_VISIBILITY
2945+
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
29422946
typename enable_if
29432947
<
29442948
is_convertible<typename __bind_return<const _Fd, const _Td, tuple<_Args&&...> >::type,
@@ -2956,7 +2960,7 @@ template<class _Rp, class _Fp, class ..._BoundArgs>
29562960
struct __is_bind_expression<__bind_r<_Rp, _Fp, _BoundArgs...> > : public true_type {};
29572961

29582962
template<class _Fp, class ..._BoundArgs>
2959-
inline _LIBCPP_INLINE_VISIBILITY
2963+
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
29602964
__bind<_Fp, _BoundArgs...>
29612965
bind(_Fp&& __f, _BoundArgs&&... __bound_args)
29622966
{
@@ -2965,7 +2969,7 @@ bind(_Fp&& __f, _BoundArgs&&... __bound_args)
29652969
}
29662970

29672971
template<class _Rp, class _Fp, class ..._BoundArgs>
2968-
inline _LIBCPP_INLINE_VISIBILITY
2972+
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
29692973
__bind_r<_Rp, _Fp, _BoundArgs...>
29702974
bind(_Fp&& __f, _BoundArgs&&... __bound_args)
29712975
{
@@ -2978,7 +2982,7 @@ bind(_Fp&& __f, _BoundArgs&&... __bound_args)
29782982
#if _LIBCPP_STD_VER > 14
29792983

29802984
template <class _Fn, class ..._Args>
2981-
invoke_result_t<_Fn, _Args...>
2985+
_LIBCPP_CONSTEXPR_AFTER_CXX17 invoke_result_t<_Fn, _Args...>
29822986
invoke(_Fn&& __f, _Args&&... __args)
29832987
noexcept(is_nothrow_invocable_v<_Fn, _Args...>)
29842988
{
@@ -2993,29 +2997,29 @@ public:
29932997
__not_fn_imp() = delete;
29942998

29952999
template <class ..._Args>
2996-
_LIBCPP_INLINE_VISIBILITY
3000+
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
29973001
auto operator()(_Args&& ...__args) &
29983002
noexcept(noexcept(!_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...)))
29993003
-> decltype( !_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...))
30003004
{ return !_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...); }
30013005

30023006
template <class ..._Args>
3003-
_LIBCPP_INLINE_VISIBILITY
3007+
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
30043008
auto operator()(_Args&& ...__args) &&
30053009
noexcept(noexcept(!_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...)))
30063010
-> decltype( !_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...))
30073011
{ return !_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...); }
30083012

30093013
template <class ..._Args>
3010-
_LIBCPP_INLINE_VISIBILITY
3014+
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
30113015
auto operator()(_Args&& ...__args) const&
30123016
noexcept(noexcept(!_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...)))
30133017
-> decltype( !_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...))
30143018
{ return !_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...); }
30153019

30163020

30173021
template <class ..._Args>
3018-
_LIBCPP_INLINE_VISIBILITY
3022+
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
30193023
auto operator()(_Args&& ...__args) const&&
30203024
noexcept(noexcept(!_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...)))
30213025
-> decltype( !_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...))
@@ -3024,17 +3028,17 @@ public:
30243028
private:
30253029
template <class _RawFunc,
30263030
class = enable_if_t<!is_same<decay_t<_RawFunc>, __not_fn_imp>::value>>
3027-
_LIBCPP_INLINE_VISIBILITY
3031+
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
30283032
explicit __not_fn_imp(_RawFunc&& __rf)
30293033
: __fd(_VSTD::forward<_RawFunc>(__rf)) {}
30303034

30313035
template <class _RawFunc>
3032-
friend inline _LIBCPP_INLINE_VISIBILITY
3036+
friend inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
30333037
__not_fn_imp<decay_t<_RawFunc>> not_fn(_RawFunc&&);
30343038
};
30353039

30363040
template <class _RawFunc>
3037-
inline _LIBCPP_INLINE_VISIBILITY
3041+
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
30383042
__not_fn_imp<decay_t<_RawFunc>> not_fn(_RawFunc&& __fn) {
30393043
return __not_fn_imp<decay_t<_RawFunc>>(_VSTD::forward<_RawFunc>(__fn));
30403044
}
@@ -3131,13 +3135,13 @@ __search(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
31313135
template<class _ForwardIterator, class _BinaryPredicate = equal_to<>>
31323136
class _LIBCPP_TYPE_VIS default_searcher {
31333137
public:
3134-
_LIBCPP_INLINE_VISIBILITY
3138+
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
31353139
default_searcher(_ForwardIterator __f, _ForwardIterator __l,
31363140
_BinaryPredicate __p = _BinaryPredicate())
31373141
: __first_(__f), __last_(__l), __pred_(__p) {}
31383142

31393143
template <typename _ForwardIterator2>
3140-
_LIBCPP_INLINE_VISIBILITY
3144+
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
31413145
pair<_ForwardIterator2, _ForwardIterator2>
31423146
operator () (_ForwardIterator2 __f, _ForwardIterator2 __l) const
31433147
{

libcxx/include/type_traits

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3584,7 +3584,7 @@ auto __invoke_constexpr(__any, _Args&& ...__args) -> __nat;
35843584
template <class _Fp, class _A0, class ..._Args,
35853585
class = __enable_if_bullet1<_Fp, _A0>>
35863586
inline _LIBCPP_INLINE_VISIBILITY
3587-
auto
3587+
_LIBCPP_CONSTEXPR_AFTER_CXX17 auto
35883588
__invoke(_Fp&& __f, _A0&& __a0, _Args&& ...__args)
35893589
_LIBCPP_INVOKE_RETURN((_VSTD::forward<_A0>(__a0).*__f)(_VSTD::forward<_Args>(__args)...))
35903590

@@ -3598,7 +3598,7 @@ _LIBCPP_INVOKE_RETURN((_VSTD::forward<_A0>(__a0).*__f)(_VSTD::forward<_Args>(__a
35983598
template <class _Fp, class _A0, class ..._Args,
35993599
class = __enable_if_bullet2<_Fp, _A0>>
36003600
inline _LIBCPP_INLINE_VISIBILITY
3601-
auto
3601+
_LIBCPP_CONSTEXPR_AFTER_CXX17 auto
36023602
__invoke(_Fp&& __f, _A0&& __a0, _Args&& ...__args)
36033603
_LIBCPP_INVOKE_RETURN((__a0.get().*__f)(_VSTD::forward<_Args>(__args)...))
36043604

@@ -3612,7 +3612,7 @@ _LIBCPP_INVOKE_RETURN((__a0.get().*__f)(_VSTD::forward<_Args>(__args)...))
36123612
template <class _Fp, class _A0, class ..._Args,
36133613
class = __enable_if_bullet3<_Fp, _A0>>
36143614
inline _LIBCPP_INLINE_VISIBILITY
3615-
auto
3615+
_LIBCPP_CONSTEXPR_AFTER_CXX17 auto
36163616
__invoke(_Fp&& __f, _A0&& __a0, _Args&& ...__args)
36173617
_LIBCPP_INVOKE_RETURN(((*_VSTD::forward<_A0>(__a0)).*__f)(_VSTD::forward<_Args>(__args)...))
36183618

@@ -3628,7 +3628,7 @@ _LIBCPP_INVOKE_RETURN(((*_VSTD::forward<_A0>(__a0)).*__f)(_VSTD::forward<_Args>(
36283628
template <class _Fp, class _A0,
36293629
class = __enable_if_bullet4<_Fp, _A0>>
36303630
inline _LIBCPP_INLINE_VISIBILITY
3631-
auto
3631+
_LIBCPP_CONSTEXPR_AFTER_CXX17 auto
36323632
__invoke(_Fp&& __f, _A0&& __a0)
36333633
_LIBCPP_INVOKE_RETURN(_VSTD::forward<_A0>(__a0).*__f)
36343634

@@ -3642,7 +3642,7 @@ _LIBCPP_INVOKE_RETURN(_VSTD::forward<_A0>(__a0).*__f)
36423642
template <class _Fp, class _A0,
36433643
class = __enable_if_bullet5<_Fp, _A0>>
36443644
inline _LIBCPP_INLINE_VISIBILITY
3645-
auto
3645+
_LIBCPP_CONSTEXPR_AFTER_CXX17 auto
36463646
__invoke(_Fp&& __f, _A0&& __a0)
36473647
_LIBCPP_INVOKE_RETURN(__a0.get().*__f)
36483648

@@ -3656,7 +3656,7 @@ _LIBCPP_INVOKE_RETURN(__a0.get().*__f)
36563656
template <class _Fp, class _A0,
36573657
class = __enable_if_bullet6<_Fp, _A0>>
36583658
inline _LIBCPP_INLINE_VISIBILITY
3659-
auto
3659+
_LIBCPP_CONSTEXPR_AFTER_CXX17 auto
36603660
__invoke(_Fp&& __f, _A0&& __a0)
36613661
_LIBCPP_INVOKE_RETURN((*_VSTD::forward<_A0>(__a0)).*__f)
36623662

@@ -3671,7 +3671,7 @@ _LIBCPP_INVOKE_RETURN((*_VSTD::forward<_A0>(__a0)).*__f)
36713671

36723672
template <class _Fp, class ..._Args>
36733673
inline _LIBCPP_INLINE_VISIBILITY
3674-
auto
3674+
_LIBCPP_CONSTEXPR_AFTER_CXX17 auto
36753675
__invoke(_Fp&& __f, _Args&& ...__args)
36763676
_LIBCPP_INVOKE_RETURN(_VSTD::forward<_Fp>(__f)(_VSTD::forward<_Args>(__args)...))
36773677

libcxx/include/version

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,7 @@ __cpp_lib_clamp 201603L <algorithm>
4646
__cpp_lib_complex_udls 201309L <complex>
4747
__cpp_lib_concepts 201806L <concepts>
4848
__cpp_lib_constexpr_dynamic_alloc 201907L <memory>
49-
__cpp_lib_constexpr_misc 201811L <array> <functional> <iterator>
50-
<string_view> <tuple> <utility>
49+
__cpp_lib_constexpr_functional 201907L <functional>
5150
__cpp_lib_constexpr_numeric 201911L <numeric>
5251
__cpp_lib_constexpr_swap_algorithms 201806L <algorithm>
5352
__cpp_lib_constexpr_utility 201811L <utility>
@@ -254,7 +253,7 @@ __cpp_lib_void_t 201411L <type_traits>
254253
# endif
255254
// # define __cpp_lib_concepts 201806L
256255
# define __cpp_lib_constexpr_dynamic_alloc 201907L
257-
// # define __cpp_lib_constexpr_misc 201811L
256+
# define __cpp_lib_constexpr_functional 201907L
258257
# define __cpp_lib_constexpr_numeric 201911L
259258
// # define __cpp_lib_constexpr_swap_algorithms 201806L
260259
# define __cpp_lib_constexpr_utility 201811L

0 commit comments

Comments
 (0)