From 08f70200ce01eea42eed7c6fcdcf300a8812be95 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely <jwakely@redhat.com> Date: Wed, 12 Feb 2025 19:52:01 +0000 Subject: [PATCH] libstdc++: Combine three tests into one Instead of a test with { target c++11_only } and another with c++14_only and another with c++17 we can have a single test that uses { target c++11 }. This avoids needing to make edits to three very similar tests. Also fix the signatures for std::cbegin and std::cend which had the wrong expression in the trailing-return-type and were missing their constexpr and conditional noexcept (which were always present even in C++14). That was wrong in two files, but now only needs to be fixed in one place! libstdc++-v3/ChangeLog: * testsuite/24_iterators/headers/iterator/range_access_c++11.cc: Removed. * testsuite/24_iterators/headers/iterator/range_access_c++14.cc: Removed. * testsuite/24_iterators/headers/iterator/range_access_c++17.cc: Removed. * testsuite/24_iterators/headers/iterator/range_access.cc: New test. --- .../headers/iterator/range_access.cc | 107 ++++++++++++++++++ .../headers/iterator/range_access_c++11.cc | 40 ------- .../headers/iterator/range_access_c++14.cc | 64 ----------- .../headers/iterator/range_access_c++17.cc | 63 ----------- 4 files changed, 107 insertions(+), 167 deletions(-) create mode 100644 libstdc++-v3/testsuite/24_iterators/headers/iterator/range_access.cc delete mode 100644 libstdc++-v3/testsuite/24_iterators/headers/iterator/range_access_c++11.cc delete mode 100644 libstdc++-v3/testsuite/24_iterators/headers/iterator/range_access_c++14.cc delete mode 100644 libstdc++-v3/testsuite/24_iterators/headers/iterator/range_access_c++17.cc diff --git a/libstdc++-v3/testsuite/24_iterators/headers/iterator/range_access.cc b/libstdc++-v3/testsuite/24_iterators/headers/iterator/range_access.cc new file mode 100644 index 000000000000..23676ad1d7a3 --- /dev/null +++ b/libstdc++-v3/testsuite/24_iterators/headers/iterator/range_access.cc @@ -0,0 +1,107 @@ +// { dg-do compile { target c++11 } } + +// Copyright (C) 2010-2025 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 <iterator> + +#ifdef _GLIBCXX_RELEASE +// Conditional noexcept on these functions is a libstdc++ extension +# define NOTHROW(F) noexcept(noexcept(c.F())) +#else +# define NOTHROW(F) +#endif + +#if __cplusplus >= 201703L +# define CONSTEXPR_17 constexpr +#else +# define CONSTEXPR_17 +#endif + +#if __cplusplus >= 201402L +# define CONSTEXPR_14 constexpr +#else +# define CONSTEXPR_14 +#endif + +namespace std +{ + template<class C> + CONSTEXPR_17 auto + begin(C& c) NOTHROW(begin) -> decltype(c.begin()); + template<class C> + CONSTEXPR_17 auto + begin(const C& c) NOTHROW(begin) -> decltype(c.begin()); + + template<class C> + CONSTEXPR_17 auto + end(C& c) NOTHROW(end) -> decltype(c.end()); + template<class C> + CONSTEXPR_17 auto + end(const C& c) NOTHROW(end) -> decltype(c.end()); + + template<class T, size_t N> + CONSTEXPR_14 T* + begin(T (&array)[N]) noexcept; + template<class T, size_t N> + CONSTEXPR_14 T* + end(T (&array)[N]) noexcept; + +#if __cplusplus >= 201402L + template<class C> + constexpr auto + cbegin(const C& c) noexcept(noexcept(std::begin(c))) -> decltype(c.begin()); + template<class C> + constexpr auto + cend(const C& c) noexcept(noexcept(std::end(c)))-> decltype(c.end()); + + template<class C> + CONSTEXPR_17 auto + rbegin(C& c) -> decltype(c.rbegin()); + template<class C> + CONSTEXPR_17 auto + rbegin(const C& c) -> decltype(c.rbegin()); + + template<class C> + CONSTEXPR_17 auto + rend(C& c) -> decltype(c.rend()); + template<class C> + CONSTEXPR_17 auto + rend(const C& c) -> decltype(c.rend()); + + template<class T, size_t N> + CONSTEXPR_17 reverse_iterator<T*> + rbegin(T (&array)[N]) noexcept; + template<class T, size_t N> + CONSTEXPR_17 reverse_iterator<T*> + rend(T (&array)[N]) noexcept; + + template<class E> + CONSTEXPR_17 reverse_iterator<const E*> + rbegin(initializer_list<E>) noexcept; + template<class E> + CONSTEXPR_17 reverse_iterator<const E*> + rend(initializer_list<E>) noexcept; + + template<class C> + CONSTEXPR_17 auto + crbegin(const C& c) -> decltype(std::rbegin(c)); + template<class C> + CONSTEXPR_17 auto + cend(const C& c) -> decltype(std::rend(c)); +#endif // C++14 +} diff --git a/libstdc++-v3/testsuite/24_iterators/headers/iterator/range_access_c++11.cc b/libstdc++-v3/testsuite/24_iterators/headers/iterator/range_access_c++11.cc deleted file mode 100644 index 50f580531120..000000000000 --- a/libstdc++-v3/testsuite/24_iterators/headers/iterator/range_access_c++11.cc +++ /dev/null @@ -1,40 +0,0 @@ -// { dg-options "-std=gnu++11" } -// { dg-do compile { target c++11_only } } - -// Copyright (C) 2010-2025 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 <iterator> - -#ifdef _GLIBCXX_RELEASE -// Conditional noexcept on these functions is a libstdc++ extension -# define NOTHROW(F) noexcept(noexcept(c.F())) -#else -# define NOTHROW(F) -#endif - -namespace std -{ - template<class C> auto begin(C& c) NOTHROW(begin) -> decltype(c.begin()); - template<class C> auto begin(const C& c) NOTHROW(begin) -> decltype(c.begin()); - - template<class C> auto end(C& c) NOTHROW(end) -> decltype(c.end()); - template<class C> auto end(const C& c) NOTHROW(end) -> decltype(c.end()); - - template<class T, size_t N> T* begin(T (&array)[N]) noexcept; - template<class T, size_t N> T* end(T (&array)[N]) noexcept; -} diff --git a/libstdc++-v3/testsuite/24_iterators/headers/iterator/range_access_c++14.cc b/libstdc++-v3/testsuite/24_iterators/headers/iterator/range_access_c++14.cc deleted file mode 100644 index 6e56927c6a4e..000000000000 --- a/libstdc++-v3/testsuite/24_iterators/headers/iterator/range_access_c++14.cc +++ /dev/null @@ -1,64 +0,0 @@ -// { dg-options "-std=gnu++14" } -// { dg-do compile { target c++14_only } } - -// Copyright (C) 2016-2025 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 <iterator> - -#ifdef _GLIBCXX_RELEASE -// Conditional noexcept on these functions is a libstdc++ extension -# define NOTHROW(F) noexcept(noexcept(c.F())) -#else -# define NOTHROW(F) -#endif - -namespace std -{ - template<class C> auto begin(C& c) NOTHROW(begin) -> decltype(c.begin()); - template<class C> auto begin(const C& c) NOTHROW(begin) -> decltype(c.begin()); - - template<class C> auto end(C& c) NOTHROW(end) -> decltype(c.end()); - template<class C> auto end(const C& c) NOTHROW(end) -> decltype(c.end()); - - template<class T, size_t N> constexpr T* begin(T (&array)[N]) noexcept; - template<class T, size_t N> constexpr T* end(T (&array)[N]) noexcept; - - template<class C> auto cbegin(const C& c) -> decltype(c.begin()); - template<class C> auto cend(const C& c) -> decltype(c.end()); - - template<class C> auto rbegin(C& c) -> decltype(c.rbegin()); - template<class C> auto rbegin(const C& c) -> decltype(c.rbegin()); - - template<class C> auto rend(C& c) -> decltype(c.rend()); - template<class C> auto rend(const C& c) -> decltype(c.rend()); - - template<class T, size_t N> - reverse_iterator<T*> rbegin(T (&array)[N]) noexcept; - template<class T, size_t N> - reverse_iterator<T*> rend(T (&array)[N]) noexcept; - - template<class E> - reverse_iterator<const E*> rbegin(initializer_list<E>) noexcept; - template<class E> - reverse_iterator<const E*> rend(initializer_list<E>) noexcept; - - template<class C> - auto crbegin(const C& c) -> decltype(std::rbegin(c)); - template<class C> - auto cend(const C& c) -> decltype(std::rend(c)); -} diff --git a/libstdc++-v3/testsuite/24_iterators/headers/iterator/range_access_c++17.cc b/libstdc++-v3/testsuite/24_iterators/headers/iterator/range_access_c++17.cc deleted file mode 100644 index e6c1c9a9496c..000000000000 --- a/libstdc++-v3/testsuite/24_iterators/headers/iterator/range_access_c++17.cc +++ /dev/null @@ -1,63 +0,0 @@ -// { dg-do compile { target c++17 } } - -// Copyright (C) 2016-2025 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 <iterator> - -#ifdef _GLIBCXX_RELEASE -// Conditional noexcept on these functions is a libstdc++ extension -# define NOTHROW(F) noexcept(noexcept(c.F())) -#else -# define NOTHROW(F) -#endif - -namespace std -{ - template<class C> constexpr auto begin(C& c) NOTHROW(begin) -> decltype(c.begin()); - template<class C> constexpr auto begin(const C& c) NOTHROW(begin) -> decltype(c.begin()); - - template<class C> constexpr auto end(C& c) NOTHROW(end) -> decltype(c.end()); - template<class C> constexpr auto end(const C& c) NOTHROW(end) -> decltype(c.end()); - - template<class T, size_t N> constexpr T* begin(T (&array)[N]) noexcept; - template<class T, size_t N> constexpr T* end(T (&array)[N]) noexcept; - - template<class C> constexpr auto cbegin(const C& c) -> decltype(c.begin()); - template<class C> constexpr auto cend(const C& c) -> decltype(c.end()); - - template<class C> constexpr auto rbegin(C& c) -> decltype(c.rbegin()); - template<class C> constexpr auto rbegin(const C& c) -> decltype(c.rbegin()); - - template<class C> constexpr auto rend(C& c) -> decltype(c.rend()); - template<class C> constexpr auto rend(const C& c) -> decltype(c.rend()); - - template<class T, size_t N> - constexpr reverse_iterator<T*> rbegin(T (&array)[N]) noexcept; - template<class T, size_t N> - constexpr reverse_iterator<T*> rend(T (&array)[N]) noexcept; - - template<class E> - constexpr reverse_iterator<const E*> rbegin(initializer_list<E>) noexcept; - template<class E> - constexpr reverse_iterator<const E*> rend(initializer_list<E>) noexcept; - - template<class C> - constexpr auto crbegin(const C& c) -> decltype(std::rbegin(c)); - template<class C> - constexpr auto cend(const C& c) -> decltype(std::rend(c)); -} -- GitLab