diff options
author | Ville Voutilainen <ville.voutilainen@gmail.com> | 2014-12-22 18:00:16 +0200 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2014-12-22 16:00:16 +0000 |
commit | 8dff34fe8e008344876bfc299203381000b5d6f7 (patch) | |
tree | b5cd8e6aea671c3f1c0fd2c4280e643555c216fb | |
parent | 3f5f101874330bf40011e95800ba4c753c631a43 (diff) | |
download | gcc-8dff34fe8e008344876bfc299203381000b5d6f7.zip gcc-8dff34fe8e008344876bfc299203381000b5d6f7.tar.gz gcc-8dff34fe8e008344876bfc299203381000b5d6f7.tar.bz2 |
re PR libstdc++/60271 ([DR2369] [C++1y] std::max(initializer_list<T>) cannot use std::max_element)
2014-12-22 Ville Voutilainen <ville.voutilainen@gmail.com>
PR libstdc++/60271
C++14 constexpr min, max, minmax, min_element, max_element
and minmax_element. Also constexpr for 20.9.5-20.9.9,
aka various library functors.
* include/bits/c++config: Add _GLIBCXX14_CONSTEXPR.
* include/bits/algorithmfwd.h (min, max, minmax, min_element,
max_element): Use it.
* include/bits/predefined_ops.h (_Iter_less_iter, __iter_less_iter,
_Iter_comp_iter, __iter_comp_iter): Likewise.
* include/bits/stl_algo.h (minmax, __minmax_element, minmax_element,
min, max, __min_element, min_element, __max_element, max_element)
Likewise.
* include/bits/stl_algobase.h (min, max): Likewise.
* include/bits/stl_function.h (plus, minus, multiplies, divides,
modulus, negate, equal_to, not_equal_to, greater, less, greater_equal,
less_equal, logical_and, logical_or, logical_not, bit_and, bit_or,
bit_xor, bit_not, unary_negate, not1, binary_negate, not2): Likewise.
* testsuite/20_util/function_objects/constexpr.cc: New.
* testsuite/25_algorithms/max/constexpr.cc: Likewise.
* testsuite/25_algorithms/max_element/constexpr.cc: Likewise.
* testsuite/25_algorithms/min/constexpr.cc: Likewise.
* testsuite/25_algorithms/min_element/constexpr.cc: Likewise.
* testsuite/25_algorithms/minmax/constexpr.cc: Likewise.
* testsuite/25_algorithms/minmax_element/constexpr.cc: Likewise.
* testsuite/ext/profile/mutex_extensions_neg.cc: Adjust dg-error.
From-SVN: r219015
-rw-r--r-- | libstdc++-v3/ChangeLog | 28 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/algorithmfwd.h | 18 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/c++config | 8 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/predefined_ops.h | 7 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/stl_algo.h | 19 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/stl_algobase.h | 4 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/stl_function.h | 44 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/20_util/function_objects/constexpr.cc | 77 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/25_algorithms/max/constexpr.cc | 28 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/25_algorithms/max_element/constexpr.cc | 29 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/25_algorithms/min/constexpr.cc | 28 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/25_algorithms/min_element/constexpr.cc | 29 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/25_algorithms/minmax/constexpr.cc | 32 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/25_algorithms/minmax_element/constexpr.cc | 33 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/ext/profile/mutex_extensions_neg.cc | 2 |
15 files changed, 382 insertions, 4 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 8a201eb..4fe8283 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,31 @@ +2014-12-22 Ville Voutilainen <ville.voutilainen@gmail.com> + + PR libstdc++/60271 + C++14 constexpr min, max, minmax, min_element, max_element + and minmax_element. Also constexpr for 20.9.5-20.9.9, + aka various library functors. + * include/bits/c++config: Add _GLIBCXX14_CONSTEXPR. + * include/bits/algorithmfwd.h (min, max, minmax, min_element, + max_element): Use it. + * include/bits/predefined_ops.h (_Iter_less_iter, __iter_less_iter, + _Iter_comp_iter, __iter_comp_iter): Likewise. + * include/bits/stl_algo.h (minmax, __minmax_element, minmax_element, + min, max, __min_element, min_element, __max_element, max_element) + Likewise. + * include/bits/stl_algobase.h (min, max): Likewise. + * include/bits/stl_function.h (plus, minus, multiplies, divides, + modulus, negate, equal_to, not_equal_to, greater, less, greater_equal, + less_equal, logical_and, logical_or, logical_not, bit_and, bit_or, + bit_xor, bit_not, unary_negate, not1, binary_negate, not2): Likewise. + * testsuite/20_util/function_objects/constexpr.cc: New. + * testsuite/25_algorithms/max/constexpr.cc: Likewise. + * testsuite/25_algorithms/max_element/constexpr.cc: Likewise. + * testsuite/25_algorithms/min/constexpr.cc: Likewise. + * testsuite/25_algorithms/min_element/constexpr.cc: Likewise. + * testsuite/25_algorithms/minmax/constexpr.cc: Likewise. + * testsuite/25_algorithms/minmax_element/constexpr.cc: Likewise. + * testsuite/ext/profile/mutex_extensions_neg.cc: Adjust dg-error. + 2014-12-22 Jonathan Wakely <jwakely@redhat.com> * doc/xml/manual/status_cxx2011.xml: Update. diff --git a/libstdc++-v3/include/bits/algorithmfwd.h b/libstdc++-v3/include/bits/algorithmfwd.h index aee1eec..b45828e 100644 --- a/libstdc++-v3/include/bits/algorithmfwd.h +++ b/libstdc++-v3/include/bits/algorithmfwd.h @@ -352,10 +352,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION make_heap(_RAIter, _RAIter, _Compare); template<typename _Tp> + _GLIBCXX14_CONSTEXPR const _Tp& max(const _Tp&, const _Tp&); template<typename _Tp, typename _Compare> + _GLIBCXX14_CONSTEXPR const _Tp& max(const _Tp&, const _Tp&, _Compare); @@ -363,10 +365,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // merge template<typename _Tp> + _GLIBCXX14_CONSTEXPR const _Tp& min(const _Tp&, const _Tp&); template<typename _Tp, typename _Compare> + _GLIBCXX14_CONSTEXPR const _Tp& min(const _Tp&, const _Tp&, _Compare); @@ -374,42 +378,52 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION #if __cplusplus >= 201103L template<typename _Tp> + _GLIBCXX14_CONSTEXPR pair<const _Tp&, const _Tp&> minmax(const _Tp&, const _Tp&); template<typename _Tp, typename _Compare> + _GLIBCXX14_CONSTEXPR pair<const _Tp&, const _Tp&> minmax(const _Tp&, const _Tp&, _Compare); template<typename _FIter> + _GLIBCXX14_CONSTEXPR pair<_FIter, _FIter> minmax_element(_FIter, _FIter); template<typename _FIter, typename _Compare> + _GLIBCXX14_CONSTEXPR pair<_FIter, _FIter> minmax_element(_FIter, _FIter, _Compare); template<typename _Tp> + _GLIBCXX14_CONSTEXPR _Tp min(initializer_list<_Tp>); template<typename _Tp, typename _Compare> + _GLIBCXX14_CONSTEXPR _Tp min(initializer_list<_Tp>, _Compare); template<typename _Tp> + _GLIBCXX14_CONSTEXPR _Tp max(initializer_list<_Tp>); template<typename _Tp, typename _Compare> + _GLIBCXX14_CONSTEXPR _Tp max(initializer_list<_Tp>, _Compare); template<typename _Tp> + _GLIBCXX14_CONSTEXPR pair<_Tp, _Tp> minmax(initializer_list<_Tp>); template<typename _Tp, typename _Compare> + _GLIBCXX14_CONSTEXPR pair<_Tp, _Tp> minmax(initializer_list<_Tp>, _Compare); #endif @@ -655,10 +669,12 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO lexicographical_compare(_IIter1, _IIter1, _IIter2, _IIter2, _Compare); template<typename _FIter> + _GLIBCXX14_CONSTEXPR _FIter max_element(_FIter, _FIter); template<typename _FIter, typename _Compare> + _GLIBCXX14_CONSTEXPR _FIter max_element(_FIter, _FIter, _Compare); @@ -672,10 +688,12 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO merge(_IIter1, _IIter1, _IIter2, _IIter2, _OIter, _Compare); template<typename _FIter> + _GLIBCXX14_CONSTEXPR _FIter min_element(_FIter, _FIter); template<typename _FIter, typename _Compare> + _GLIBCXX14_CONSTEXPR _FIter min_element(_FIter, _FIter, _Compare); diff --git a/libstdc++-v3/include/bits/c++config b/libstdc++-v3/include/bits/c++config index ec7414d..356a526 100644 --- a/libstdc++-v3/include/bits/c++config +++ b/libstdc++-v3/include/bits/c++config @@ -103,6 +103,14 @@ # endif #endif +#ifndef _GLIBCXX14_CONSTEXPR +# if __cplusplus >= 201402L +# define _GLIBCXX14_CONSTEXPR constexpr +# else +# define _GLIBCXX14_CONSTEXPR +# endif +#endif + // Macro for noexcept, to support in mixed 03/0x mode. #ifndef _GLIBCXX_NOEXCEPT # if __cplusplus >= 201103L diff --git a/libstdc++-v3/include/bits/predefined_ops.h b/libstdc++-v3/include/bits/predefined_ops.h index 78f5e37..e31d8c3 100644 --- a/libstdc++-v3/include/bits/predefined_ops.h +++ b/libstdc++-v3/include/bits/predefined_ops.h @@ -37,11 +37,12 @@ namespace __ops struct _Iter_less_iter { template<typename _Iterator1, typename _Iterator2> + _GLIBCXX14_CONSTEXPR bool operator()(_Iterator1 __it1, _Iterator2 __it2) const { return *__it1 < *__it2; } }; - + _GLIBCXX14_CONSTEXPR inline _Iter_less_iter __iter_less_iter() { return _Iter_less_iter(); } @@ -110,18 +111,20 @@ namespace __ops struct _Iter_comp_iter { _Compare _M_comp; - + _GLIBCXX14_CONSTEXPR _Iter_comp_iter(_Compare __comp) : _M_comp(__comp) { } template<typename _Iterator1, typename _Iterator2> + _GLIBCXX14_CONSTEXPR bool operator()(_Iterator1 __it1, _Iterator2 __it2) { return bool(_M_comp(*__it1, *__it2)); } }; template<typename _Compare> + _GLIBCXX14_CONSTEXPR inline _Iter_comp_iter<_Compare> __iter_comp_iter(_Compare __comp) { return _Iter_comp_iter<_Compare>(__comp); } diff --git a/libstdc++-v3/include/bits/stl_algo.h b/libstdc++-v3/include/bits/stl_algo.h index 0ce73c1..dfbb9fa 100644 --- a/libstdc++-v3/include/bits/stl_algo.h +++ b/libstdc++-v3/include/bits/stl_algo.h @@ -3271,6 +3271,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * __b) otherwise. */ template<typename _Tp> + _GLIBCXX14_CONSTEXPR inline pair<const _Tp&, const _Tp&> minmax(const _Tp& __a, const _Tp& __b) { @@ -3291,6 +3292,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * __b) otherwise. */ template<typename _Tp, typename _Compare> + _GLIBCXX14_CONSTEXPR inline pair<const _Tp&, const _Tp&> minmax(const _Tp& __a, const _Tp& __b, _Compare __comp) { @@ -3299,6 +3301,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } template<typename _ForwardIterator, typename _Compare> + _GLIBCXX14_CONSTEXPR pair<_ForwardIterator, _ForwardIterator> __minmax_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp) @@ -3308,7 +3311,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION || ++__next == __last) return std::make_pair(__first, __first); - _ForwardIterator __min, __max; + _ForwardIterator __min{}, __max{}; if (__comp(__next, __first)) { __min = __next; @@ -3369,6 +3372,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * such that no other element in the range is larger. */ template<typename _ForwardIterator> + _GLIBCXX14_CONSTEXPR inline pair<_ForwardIterator, _ForwardIterator> minmax_element(_ForwardIterator __first, _ForwardIterator __last) { @@ -3395,6 +3399,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * such that no other element in the range is larger. */ template<typename _ForwardIterator, typename _Compare> + _GLIBCXX14_CONSTEXPR inline pair<_ForwardIterator, _ForwardIterator> minmax_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp) @@ -3412,26 +3417,31 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // N2722 + DR 915. template<typename _Tp> + _GLIBCXX14_CONSTEXPR inline _Tp min(initializer_list<_Tp> __l) { return *std::min_element(__l.begin(), __l.end()); } template<typename _Tp, typename _Compare> + _GLIBCXX14_CONSTEXPR inline _Tp min(initializer_list<_Tp> __l, _Compare __comp) { return *std::min_element(__l.begin(), __l.end(), __comp); } template<typename _Tp> + _GLIBCXX14_CONSTEXPR inline _Tp max(initializer_list<_Tp> __l) { return *std::max_element(__l.begin(), __l.end()); } template<typename _Tp, typename _Compare> + _GLIBCXX14_CONSTEXPR inline _Tp max(initializer_list<_Tp> __l, _Compare __comp) { return *std::max_element(__l.begin(), __l.end(), __comp); } template<typename _Tp> + _GLIBCXX14_CONSTEXPR inline pair<_Tp, _Tp> minmax(initializer_list<_Tp> __l) { @@ -3441,6 +3451,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } template<typename _Tp, typename _Compare> + _GLIBCXX14_CONSTEXPR inline pair<_Tp, _Tp> minmax(initializer_list<_Tp> __l, _Compare __comp) { @@ -5381,6 +5392,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO } template<typename _ForwardIterator, typename _Compare> + _GLIBCXX14_CONSTEXPR _ForwardIterator __min_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp) @@ -5402,6 +5414,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO * @return Iterator referencing the first instance of the smallest value. */ template<typename _ForwardIterator> + _GLIBCXX14_CONSTEXPR _ForwardIterator inline min_element(_ForwardIterator __first, _ForwardIterator __last) { @@ -5425,6 +5438,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO * according to __comp. */ template<typename _ForwardIterator, typename _Compare> + _GLIBCXX14_CONSTEXPR inline _ForwardIterator min_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp) @@ -5441,6 +5455,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO } template<typename _ForwardIterator, typename _Compare> + _GLIBCXX14_CONSTEXPR _ForwardIterator __max_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp) @@ -5461,6 +5476,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO * @return Iterator referencing the first instance of the largest value. */ template<typename _ForwardIterator> + _GLIBCXX14_CONSTEXPR inline _ForwardIterator max_element(_ForwardIterator __first, _ForwardIterator __last) { @@ -5484,6 +5500,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO * according to __comp. */ template<typename _ForwardIterator, typename _Compare> + _GLIBCXX14_CONSTEXPR inline _ForwardIterator max_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp) diff --git a/libstdc++-v3/include/bits/stl_algobase.h b/libstdc++-v3/include/bits/stl_algobase.h index f7c11e9..15ee820 100644 --- a/libstdc++-v3/include/bits/stl_algobase.h +++ b/libstdc++-v3/include/bits/stl_algobase.h @@ -190,6 +190,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * preprocessor macro. */ template<typename _Tp> + _GLIBCXX14_CONSTEXPR inline const _Tp& min(const _Tp& __a, const _Tp& __b) { @@ -213,6 +214,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * preprocessor macro. */ template<typename _Tp> + _GLIBCXX14_CONSTEXPR inline const _Tp& max(const _Tp& __a, const _Tp& __b) { @@ -236,6 +238,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * once, unlike a preprocessor macro. */ template<typename _Tp, typename _Compare> + _GLIBCXX14_CONSTEXPR inline const _Tp& min(const _Tp& __a, const _Tp& __b, _Compare __comp) { @@ -257,6 +260,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * once, unlike a preprocessor macro. */ template<typename _Tp, typename _Compare> + _GLIBCXX14_CONSTEXPR inline const _Tp& max(const _Tp& __a, const _Tp& __b, _Compare __comp) { diff --git a/libstdc++-v3/include/bits/stl_function.h b/libstdc++-v3/include/bits/stl_function.h index 71215b8..79f7959 100644 --- a/libstdc++-v3/include/bits/stl_function.h +++ b/libstdc++-v3/include/bits/stl_function.h @@ -166,6 +166,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template<typename _Tp> struct plus : public binary_function<_Tp, _Tp, _Tp> { + _GLIBCXX14_CONSTEXPR _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x + __y; } @@ -175,6 +176,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template<typename _Tp> struct minus : public binary_function<_Tp, _Tp, _Tp> { + _GLIBCXX14_CONSTEXPR _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x - __y; } @@ -184,6 +186,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template<typename _Tp> struct multiplies : public binary_function<_Tp, _Tp, _Tp> { + _GLIBCXX14_CONSTEXPR _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x * __y; } @@ -193,6 +196,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template<typename _Tp> struct divides : public binary_function<_Tp, _Tp, _Tp> { + _GLIBCXX14_CONSTEXPR _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x / __y; } @@ -202,6 +206,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template<typename _Tp> struct modulus : public binary_function<_Tp, _Tp, _Tp> { + _GLIBCXX14_CONSTEXPR _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x % __y; } @@ -211,6 +216,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template<typename _Tp> struct negate : public unary_function<_Tp, _Tp> { + _GLIBCXX14_CONSTEXPR _Tp operator()(const _Tp& __x) const { return -__x; } @@ -225,6 +231,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION struct plus<void> { template <typename _Tp, typename _Up> + _GLIBCXX14_CONSTEXPR auto operator()(_Tp&& __t, _Up&& __u) const noexcept(noexcept(std::forward<_Tp>(__t) + std::forward<_Up>(__u))) @@ -239,6 +246,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION struct minus<void> { template <typename _Tp, typename _Up> + _GLIBCXX14_CONSTEXPR auto operator()(_Tp&& __t, _Up&& __u) const noexcept(noexcept(std::forward<_Tp>(__t) - std::forward<_Up>(__u))) @@ -253,6 +261,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION struct multiplies<void> { template <typename _Tp, typename _Up> + _GLIBCXX14_CONSTEXPR auto operator()(_Tp&& __t, _Up&& __u) const noexcept(noexcept(std::forward<_Tp>(__t) * std::forward<_Up>(__u))) @@ -267,6 +276,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION struct divides<void> { template <typename _Tp, typename _Up> + _GLIBCXX14_CONSTEXPR auto operator()(_Tp&& __t, _Up&& __u) const noexcept(noexcept(std::forward<_Tp>(__t) / std::forward<_Up>(__u))) @@ -281,6 +291,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION struct modulus<void> { template <typename _Tp, typename _Up> + _GLIBCXX14_CONSTEXPR auto operator()(_Tp&& __t, _Up&& __u) const noexcept(noexcept(std::forward<_Tp>(__t) % std::forward<_Up>(__u))) @@ -295,6 +306,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION struct negate<void> { template <typename _Tp> + _GLIBCXX14_CONSTEXPR auto operator()(_Tp&& __t) const noexcept(noexcept(-std::forward<_Tp>(__t))) @@ -339,6 +351,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template<typename _Tp> struct equal_to : public binary_function<_Tp, _Tp, bool> { + _GLIBCXX14_CONSTEXPR bool operator()(const _Tp& __x, const _Tp& __y) const { return __x == __y; } @@ -348,6 +361,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template<typename _Tp> struct not_equal_to : public binary_function<_Tp, _Tp, bool> { + _GLIBCXX14_CONSTEXPR bool operator()(const _Tp& __x, const _Tp& __y) const { return __x != __y; } @@ -357,6 +371,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template<typename _Tp> struct greater : public binary_function<_Tp, _Tp, bool> { + _GLIBCXX14_CONSTEXPR bool operator()(const _Tp& __x, const _Tp& __y) const { return __x > __y; } @@ -366,6 +381,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template<typename _Tp> struct less : public binary_function<_Tp, _Tp, bool> { + _GLIBCXX14_CONSTEXPR bool operator()(const _Tp& __x, const _Tp& __y) const { return __x < __y; } @@ -375,6 +391,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template<typename _Tp> struct greater_equal : public binary_function<_Tp, _Tp, bool> { + _GLIBCXX14_CONSTEXPR bool operator()(const _Tp& __x, const _Tp& __y) const { return __x >= __y; } @@ -384,6 +401,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template<typename _Tp> struct less_equal : public binary_function<_Tp, _Tp, bool> { + _GLIBCXX14_CONSTEXPR bool operator()(const _Tp& __x, const _Tp& __y) const { return __x <= __y; } @@ -395,6 +413,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION struct equal_to<void> { template <typename _Tp, typename _Up> + _GLIBCXX14_CONSTEXPR auto operator()(_Tp&& __t, _Up&& __u) const noexcept(noexcept(std::forward<_Tp>(__t) == std::forward<_Up>(__u))) @@ -409,6 +428,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION struct not_equal_to<void> { template <typename _Tp, typename _Up> + _GLIBCXX14_CONSTEXPR auto operator()(_Tp&& __t, _Up&& __u) const noexcept(noexcept(std::forward<_Tp>(__t) != std::forward<_Up>(__u))) @@ -423,6 +443,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION struct greater<void> { template <typename _Tp, typename _Up> + _GLIBCXX14_CONSTEXPR auto operator()(_Tp&& __t, _Up&& __u) const noexcept(noexcept(std::forward<_Tp>(__t) > std::forward<_Up>(__u))) @@ -437,6 +458,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION struct less<void> { template <typename _Tp, typename _Up> + _GLIBCXX14_CONSTEXPR auto operator()(_Tp&& __t, _Up&& __u) const noexcept(noexcept(std::forward<_Tp>(__t) < std::forward<_Up>(__u))) @@ -451,6 +473,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION struct greater_equal<void> { template <typename _Tp, typename _Up> + _GLIBCXX14_CONSTEXPR auto operator()(_Tp&& __t, _Up&& __u) const noexcept(noexcept(std::forward<_Tp>(__t) >= std::forward<_Up>(__u))) @@ -465,6 +488,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION struct less_equal<void> { template <typename _Tp, typename _Up> + _GLIBCXX14_CONSTEXPR auto operator()(_Tp&& __t, _Up&& __u) const noexcept(noexcept(std::forward<_Tp>(__t) <= std::forward<_Up>(__u))) @@ -500,6 +524,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template<typename _Tp> struct logical_and : public binary_function<_Tp, _Tp, bool> { + _GLIBCXX14_CONSTEXPR bool operator()(const _Tp& __x, const _Tp& __y) const { return __x && __y; } @@ -509,6 +534,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template<typename _Tp> struct logical_or : public binary_function<_Tp, _Tp, bool> { + _GLIBCXX14_CONSTEXPR bool operator()(const _Tp& __x, const _Tp& __y) const { return __x || __y; } @@ -518,6 +544,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template<typename _Tp> struct logical_not : public unary_function<_Tp, bool> { + _GLIBCXX14_CONSTEXPR bool operator()(const _Tp& __x) const { return !__x; } @@ -529,6 +556,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION struct logical_and<void> { template <typename _Tp, typename _Up> + _GLIBCXX14_CONSTEXPR auto operator()(_Tp&& __t, _Up&& __u) const noexcept(noexcept(std::forward<_Tp>(__t) && std::forward<_Up>(__u))) @@ -543,6 +571,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION struct logical_or<void> { template <typename _Tp, typename _Up> + _GLIBCXX14_CONSTEXPR auto operator()(_Tp&& __t, _Up&& __u) const noexcept(noexcept(std::forward<_Tp>(__t) || std::forward<_Up>(__u))) @@ -557,6 +586,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION struct logical_not<void> { template <typename _Tp> + _GLIBCXX14_CONSTEXPR auto operator()(_Tp&& __t) const noexcept(noexcept(!std::forward<_Tp>(__t))) @@ -587,6 +617,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template<typename _Tp> struct bit_and : public binary_function<_Tp, _Tp, _Tp> { + _GLIBCXX14_CONSTEXPR _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x & __y; } @@ -595,6 +626,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template<typename _Tp> struct bit_or : public binary_function<_Tp, _Tp, _Tp> { + _GLIBCXX14_CONSTEXPR _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x | __y; } @@ -603,6 +635,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template<typename _Tp> struct bit_xor : public binary_function<_Tp, _Tp, _Tp> { + _GLIBCXX14_CONSTEXPR _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x ^ __y; } @@ -611,6 +644,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template<typename _Tp> struct bit_not : public unary_function<_Tp, _Tp> { + _GLIBCXX14_CONSTEXPR _Tp operator()(const _Tp& __x) const { return ~__x; } @@ -621,6 +655,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION struct bit_and<void> { template <typename _Tp, typename _Up> + _GLIBCXX14_CONSTEXPR auto operator()(_Tp&& __t, _Up&& __u) const noexcept(noexcept(std::forward<_Tp>(__t) & std::forward<_Up>(__u))) @@ -634,6 +669,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION struct bit_or<void> { template <typename _Tp, typename _Up> + _GLIBCXX14_CONSTEXPR auto operator()(_Tp&& __t, _Up&& __u) const noexcept(noexcept(std::forward<_Tp>(__t) | std::forward<_Up>(__u))) @@ -647,6 +683,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION struct bit_xor<void> { template <typename _Tp, typename _Up> + _GLIBCXX14_CONSTEXPR auto operator()(_Tp&& __t, _Up&& __u) const noexcept(noexcept(std::forward<_Tp>(__t) ^ std::forward<_Up>(__u))) @@ -660,6 +697,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION struct bit_not<void> { template <typename _Tp> + _GLIBCXX14_CONSTEXPR auto operator()(_Tp&& __t) const noexcept(noexcept(~std::forward<_Tp>(__t))) @@ -708,9 +746,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _Predicate _M_pred; public: + _GLIBCXX14_CONSTEXPR explicit unary_negate(const _Predicate& __x) : _M_pred(__x) { } + _GLIBCXX14_CONSTEXPR bool operator()(const typename _Predicate::argument_type& __x) const { return !_M_pred(__x); } @@ -718,6 +758,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION /// One of the @link negators negation functors@endlink. template<typename _Predicate> + _GLIBCXX14_CONSTEXPR inline unary_negate<_Predicate> not1(const _Predicate& __pred) { return unary_negate<_Predicate>(__pred); } @@ -732,9 +773,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _Predicate _M_pred; public: + _GLIBCXX14_CONSTEXPR explicit binary_negate(const _Predicate& __x) : _M_pred(__x) { } + _GLIBCXX14_CONSTEXPR bool operator()(const typename _Predicate::first_argument_type& __x, const typename _Predicate::second_argument_type& __y) const @@ -743,6 +786,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION /// One of the @link negators negation functors@endlink. template<typename _Predicate> + _GLIBCXX14_CONSTEXPR inline binary_negate<_Predicate> not2(const _Predicate& __pred) { return binary_negate<_Predicate>(__pred); } diff --git a/libstdc++-v3/testsuite/20_util/function_objects/constexpr.cc b/libstdc++-v3/testsuite/20_util/function_objects/constexpr.cc new file mode 100644 index 0000000..3ad7e0d --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/function_objects/constexpr.cc @@ -0,0 +1,77 @@ +// { dg-options "-std=gnu++14" } +// { dg-do compile } + +// Copyright (C) 2014 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// <http://www.gnu.org/licenses/>. + +// 20.9.5-20.9.9 + +#include <functional> + +static_assert(std::plus<int>()(1,2)==3, ""); +static_assert(std::minus<int>()(3,2)==1, ""); +static_assert(std::multiplies<int>()(3,2)==6, ""); +static_assert(std::divides<int>()(6,2)==3, ""); +static_assert(std::modulus<int>()(7,2)==1, ""); +static_assert(std::negate<int>()(-5)==5, ""); + +static_assert(std::plus<void>()(1,2)==3, ""); +static_assert(std::minus<void>()(3,2)==1, ""); +static_assert(std::multiplies<void>()(3,2)==6, ""); +static_assert(std::divides<void>()(6,2)==3, ""); +static_assert(std::modulus<void>()(7,2)==1, ""); +static_assert(std::negate<void>()(-5)==5, ""); + +static_assert(std::equal_to<int>()(2,2), ""); +static_assert(std::not_equal_to<int>()(1,2), ""); +static_assert(std::greater<int>()(2,1), ""); +static_assert(std::less<int>()(1,2), ""); +static_assert(std::greater_equal<int>()(2,2), ""); +static_assert(std::less_equal<int>()(2,2), ""); + +static_assert(std::equal_to<void>()(2,2), ""); +static_assert(std::not_equal_to<void>()(1,2), ""); +static_assert(std::greater<void>()(2,1), ""); +static_assert(std::less<void>()(1,2), ""); +static_assert(std::greater_equal<void>()(2,2), ""); +static_assert(std::less_equal<void>()(2,2), ""); + +static_assert(std::logical_and<int>()(1,1), ""); +static_assert(std::logical_or<int>()(0,1), ""); +static_assert(std::logical_not<int>()(0), ""); + +static_assert(std::logical_and<void>()(1,1), ""); +static_assert(std::logical_or<void>()(0,1), ""); +static_assert(std::logical_not<void>()(0), ""); + +static_assert(std::bit_and<int>()(3,2)==2, ""); +static_assert(std::bit_or<int>()(1,2)==3, ""); +static_assert(std::bit_xor<int>()(1,1)==0, ""); +static_assert(std::bit_not<int>()(std::bit_not<int>()(0))==0, ""); + +static_assert(std::bit_and<void>()(3,2)==2, ""); +static_assert(std::bit_or<void>()(1,2)==3, ""); +static_assert(std::bit_xor<void>()(1,1)==0, ""); +static_assert(std::bit_not<void>()(std::bit_not<void>()(0))==0, ""); + +static_assert(std::unary_negate<std::logical_not<int>> + (std::logical_not<int>())(1), ""); +static_assert(std::not1(std::logical_not<int>())(1), ""); + +static_assert(std::binary_negate<std::logical_and<int>> + (std::logical_and<int>())(0,0), ""); +static_assert(std::not2(std::logical_and<int>())(0,0), ""); diff --git a/libstdc++-v3/testsuite/25_algorithms/max/constexpr.cc b/libstdc++-v3/testsuite/25_algorithms/max/constexpr.cc new file mode 100644 index 0000000..3db6d8f --- /dev/null +++ b/libstdc++-v3/testsuite/25_algorithms/max/constexpr.cc @@ -0,0 +1,28 @@ +// { dg-options "-std=gnu++14" } +// { dg-do compile } + +// Copyright (C) 2014 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// <http://www.gnu.org/licenses/>. + +#include <algorithm> +#include <functional> + +static_assert(std::max(1, 2) == 2, ""); +static_assert(std::max(2, 1, std::greater<int>()) == 1, ""); +static_assert(std::max({1, 2}) == 2, ""); +static_assert(std::max({2, 1}, std::greater<int>())==1, ""); + diff --git a/libstdc++-v3/testsuite/25_algorithms/max_element/constexpr.cc b/libstdc++-v3/testsuite/25_algorithms/max_element/constexpr.cc new file mode 100644 index 0000000..666dad8 --- /dev/null +++ b/libstdc++-v3/testsuite/25_algorithms/max_element/constexpr.cc @@ -0,0 +1,29 @@ +// { dg-options "-std=gnu++14" } +// { dg-do compile } + +// Copyright (C) 2014 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// <http://www.gnu.org/licenses/>. + +#include <algorithm> +#include <functional> +#include <utility> + +constexpr std::initializer_list<int> test{1, 2}; + +static_assert(*std::max_element(test.begin(), test.end()) == 2, ""); +static_assert(*std::max_element(test.begin(), test.end(), + std::greater<int>()) == 1, ""); diff --git a/libstdc++-v3/testsuite/25_algorithms/min/constexpr.cc b/libstdc++-v3/testsuite/25_algorithms/min/constexpr.cc new file mode 100644 index 0000000..615b18c --- /dev/null +++ b/libstdc++-v3/testsuite/25_algorithms/min/constexpr.cc @@ -0,0 +1,28 @@ +// { dg-options "-std=gnu++14" } +// { dg-do compile } + +// Copyright (C) 2014 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// <http://www.gnu.org/licenses/>. + +#include <algorithm> +#include <functional> + +static_assert(std::min(2, 1) == 1, ""); +static_assert(std::min(2, 1, std::greater<int>()) == 2, ""); +static_assert(std::min({2, 1}) == 1, ""); +static_assert(std::min({1, 2}, std::greater<int>())==2, ""); + diff --git a/libstdc++-v3/testsuite/25_algorithms/min_element/constexpr.cc b/libstdc++-v3/testsuite/25_algorithms/min_element/constexpr.cc new file mode 100644 index 0000000..376be83 --- /dev/null +++ b/libstdc++-v3/testsuite/25_algorithms/min_element/constexpr.cc @@ -0,0 +1,29 @@ +// { dg-options "-std=gnu++14" } +// { dg-do compile } + +// Copyright (C) 2014 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// <http://www.gnu.org/licenses/>. + +#include <algorithm> +#include <functional> +#include <utility> + +constexpr std::initializer_list<int> test{2, 1}; + +static_assert(*std::min_element(test.begin(), test.end()) == 1, ""); +static_assert(*std::min_element(test.begin(), test.end(), + std::greater<int>()) == 2, ""); diff --git a/libstdc++-v3/testsuite/25_algorithms/minmax/constexpr.cc b/libstdc++-v3/testsuite/25_algorithms/minmax/constexpr.cc new file mode 100644 index 0000000..cd5d95e --- /dev/null +++ b/libstdc++-v3/testsuite/25_algorithms/minmax/constexpr.cc @@ -0,0 +1,32 @@ +// { dg-options "-std=gnu++14" } +// { dg-do compile } + +// Copyright (C) 2014 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// <http://www.gnu.org/licenses/>. + +#include <algorithm> +#include <functional> +#include <utility> + +static_assert(std::minmax(2, 1) == + std::pair<const int&, const int&>(1, 2), ""); +static_assert(std::minmax(2, 1, std::greater<int>()) == + std::pair<const int&, const int&>(2, 1), ""); +static_assert(std::minmax({2, 1}) == + std::pair<int, int>(1, 2), ""); +static_assert(std::minmax({2, 1}, std::greater<int>())== + std::pair<int, int>(2, 1), ""); diff --git a/libstdc++-v3/testsuite/25_algorithms/minmax_element/constexpr.cc b/libstdc++-v3/testsuite/25_algorithms/minmax_element/constexpr.cc new file mode 100644 index 0000000..9a79bc1 --- /dev/null +++ b/libstdc++-v3/testsuite/25_algorithms/minmax_element/constexpr.cc @@ -0,0 +1,33 @@ +// { dg-options "-std=gnu++14" } +// { dg-do compile } + +// Copyright (C) 2014 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// <http://www.gnu.org/licenses/>. + +#include <algorithm> +#include <functional> +#include <utility> + +constexpr std::initializer_list<int> test{2, 1}; +constexpr auto x = std::minmax_element(test.begin(), test.end()); +constexpr auto y = std::minmax_element(test.begin(), test.end(), + std::greater<int>()); +static_assert(x.first == test.begin()+1, ""); +static_assert(x.second == test.begin(), ""); +static_assert(y.first == test.begin(), ""); +static_assert(y.second == test.begin()+1, ""); + diff --git a/libstdc++-v3/testsuite/ext/profile/mutex_extensions_neg.cc b/libstdc++-v3/testsuite/ext/profile/mutex_extensions_neg.cc index 292bee8..f89a106 100644 --- a/libstdc++-v3/testsuite/ext/profile/mutex_extensions_neg.cc +++ b/libstdc++-v3/testsuite/ext/profile/mutex_extensions_neg.cc @@ -25,4 +25,4 @@ #include <vector> -// { dg-error "multiple inlined namespaces" "" { target *-*-* } 310 } +// { dg-error "multiple inlined namespaces" "" { target *-*-* } 318 } |