https://gcc.gnu.org/g:0598e2f98d28f3ddbf1a4bbced8177ea6b58ad93
commit r15-5831-g0598e2f98d28f3ddbf1a4bbced8177ea6b58ad93 Author: Jonathan Wakely <jwak...@redhat.com> Date: Mon Nov 25 15:06:13 2024 +0000 libstdc++: Improve test for <utility> synopsis libstdc++-v3/ChangeLog: * testsuite/20_util/headers/utility/synopsis.cc: Add declarations from C++11 and later. Diff: --- .../testsuite/20_util/headers/utility/synopsis.cc | 108 +++++++++++++++++++-- 1 file changed, 102 insertions(+), 6 deletions(-) diff --git a/libstdc++-v3/testsuite/20_util/headers/utility/synopsis.cc b/libstdc++-v3/testsuite/20_util/headers/utility/synopsis.cc index dddb54fd48a0..51e88b70f514 100644 --- a/libstdc++-v3/testsuite/20_util/headers/utility/synopsis.cc +++ b/libstdc++-v3/testsuite/20_util/headers/utility/synopsis.cc @@ -20,6 +20,36 @@ #include <utility> +#if __cplusplus < 201103L +# define CONSTEXPR +#else +# define CONSTEXPR constexpr +#endif + +#if __cplusplus < 201402L && ! defined(_GLIBCXX_RELEASE) +# define CONSTEXPR11x +#else +# define CONSTEXPR11x constexpr +#endif + +#if __cplusplus < 201402L +# define CONSTEXPR14 +#else +# define CONSTEXPR14 constexpr +#endif + +#if __cplusplus < 201703L +# define CONSTEXPR17 +#else +# define CONSTEXPR17 constexpr +#endif + +#if __cplusplus < 202002L +# define CONSTEXPR20 +#else +# define CONSTEXPR20 constexpr +#endif + namespace std { // lib.operators, operators: namespace rel_ops { @@ -29,18 +59,84 @@ namespace std { template<class T> bool operator>=(const T&, const T&); } +#if __cplusplus >= 201103L +#if 0 + // N.B. our std::swap doesn't actually match this due to constraints on + // the template parameter. + template<class T> + CONSTEXPR20 + void swap(T&, T&) noexcept(is_nothrow_move_constructible<T>::value + && is_nothrow_move_assignable<T>::value); +#endif + + template<class T, size_t N> + CONSTEXPR20 + void swap(T (&a)[N], T (&b)[N]) noexcept(noexcept(swap(*a, *b))); + +#if __cplusplus >= 201703L + template <class T, class U /* = T */> + CONSTEXPR20 + T exchange(T& obj, U&& new_val) +#if defined _GLIBCXX_RELEASE // This noexcept is a libstdc++ extension. + noexcept(__and_<is_nothrow_move_constructible<T>, + is_nothrow_assignable<T&, U>>::value) +#endif + ; +#endif + + template<class T> + CONSTEXPR11x + T&& forward(typename remove_reference<T>::type& t) noexcept; + template<class T> + CONSTEXPR11x + T&& forward(typename remove_reference<T>::type&& t) noexcept; + + template<class T> + CONSTEXPR11x + typename remove_reference<T>::type&& move(T&& t) noexcept; + + template<class T> + CONSTEXPR17 + typename conditional< ! is_nothrow_move_constructible<T>::value + && is_copy_constructible<T>::value, + const T&, T&&>::type + move_if_noexcept(T& x) noexcept; + +#if __cplusplus >= 201703L + template<class T> + constexpr add_const_t<T>& as_const(T& t) noexcept; +#endif + + template <class T> + typename add_rvalue_reference<T>::type declval() noexcept; + +#if __cplusplus >= 201402L + template<class T, T...> struct integer_sequence; +#endif + +#endif // C++11 + // lib.pairs, pairs: template <class T1, class T2> struct pair; template <class T1, class T2> - _GLIBCXX_CONSTEXPR bool operator==(const pair<T1,T2>&, const pair<T1,T2>&); + CONSTEXPR bool operator==(const pair<T1,T2>&, const pair<T1,T2>&); template <class T1, class T2> - _GLIBCXX_CONSTEXPR bool operator< (const pair<T1,T2>&, const pair<T1,T2>&); + CONSTEXPR bool operator< (const pair<T1,T2>&, const pair<T1,T2>&); template <class T1, class T2> - _GLIBCXX_CONSTEXPR bool operator!=(const pair<T1,T2>&, const pair<T1,T2>&); + CONSTEXPR bool operator!=(const pair<T1,T2>&, const pair<T1,T2>&); template <class T1, class T2> - _GLIBCXX_CONSTEXPR bool operator> (const pair<T1,T2>&, const pair<T1,T2>&); + CONSTEXPR bool operator> (const pair<T1,T2>&, const pair<T1,T2>&); template <class T1, class T2> - _GLIBCXX_CONSTEXPR bool operator>=(const pair<T1,T2>&, const pair<T1,T2>&); + CONSTEXPR bool operator>=(const pair<T1,T2>&, const pair<T1,T2>&); template <class T1, class T2> - _GLIBCXX_CONSTEXPR bool operator<=(const pair<T1,T2>&, const pair<T1,T2>&); + CONSTEXPR bool operator<=(const pair<T1,T2>&, const pair<T1,T2>&); + +#if __cplusplus >= 201103L + struct piecewise_construct_t; +#if __cplusplus >= 201703L + struct in_place_t; + template<class> struct in_place_type_t; + template<size_t> struct in_place_index_t; +#endif +#endif }