From f877f580a574491111ceac6f35b6ca6dd0a2585f Mon Sep 17 00:00:00 2001 From: Patrick Palka Date: Mon, 21 Sep 2020 20:48:17 -0400 Subject: [PATCH] libstdc++: Mark some more algorithms constexpr for C++20 As per P0202. libstdc++-v3/ChangeLog: * include/bits/stl_algo.h (for_each_n): Mark constexpr for C++20. (search): Likewise for the overload that takes a searcher. * testsuite/25_algorithms/for_each/constexpr.cc: Test constexpr std::for_each_n. * testsuite/25_algorithms/search/constexpr.cc: Test constexpr std::search overload that takes a searcher. (cherry picked from commit f017952d31ba8fa965106505bed5844cc1a63b4b) --- libstdc++-v3/include/bits/stl_algo.h | 2 ++ .../testsuite/25_algorithms/for_each/constexpr.cc | 12 ++++++++++++ .../testsuite/25_algorithms/search/constexpr.cc | 4 ++++ 3 files changed, 18 insertions(+) diff --git a/libstdc++-v3/include/bits/stl_algo.h b/libstdc++-v3/include/bits/stl_algo.h index 778a14be97f0..bfab5a06cdaa 100644 --- a/libstdc++-v3/include/bits/stl_algo.h +++ b/libstdc++-v3/include/bits/stl_algo.h @@ -3854,6 +3854,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO * If `__f` has a return value it is ignored. */ template + _GLIBCXX20_CONSTEXPR _InputIterator for_each_n(_InputIterator __first, _Size __n, _Function __f) { @@ -4273,6 +4274,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO * @return @p __searcher(__first,__last).first */ template + _GLIBCXX20_CONSTEXPR inline _ForwardIterator search(_ForwardIterator __first, _ForwardIterator __last, const _Searcher& __searcher) diff --git a/libstdc++-v3/testsuite/25_algorithms/for_each/constexpr.cc b/libstdc++-v3/testsuite/25_algorithms/for_each/constexpr.cc index 1bece35a0d9d..b3aca23eccc3 100644 --- a/libstdc++-v3/testsuite/25_algorithms/for_each/constexpr.cc +++ b/libstdc++-v3/testsuite/25_algorithms/for_each/constexpr.cc @@ -34,3 +34,15 @@ test() } static_assert(test()); + +constexpr bool +test_n() +{ + int tot = 0; + auto sum = [&total = tot](int i){ total += i; }; + auto sum2 = std::for_each_n(ca0.begin(), std::size(ca0)-1, sum); + + return tot == 55; +} + +static_assert(test_n()); diff --git a/libstdc++-v3/testsuite/25_algorithms/search/constexpr.cc b/libstdc++-v3/testsuite/25_algorithms/search/constexpr.cc index ba9437eced7b..e34194cfc5db 100644 --- a/libstdc++-v3/testsuite/25_algorithms/search/constexpr.cc +++ b/libstdc++-v3/testsuite/25_algorithms/search/constexpr.cc @@ -31,6 +31,10 @@ test() cam.begin(), cam.end(), std::equal_to()); + const auto outtt2 + = std::search(ca0.begin(), ca0.end(), + std::default_searcher(cam.begin(), cam.end())); + return true; } -- 2.47.2