diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2025-02-12 19:52:01 +0000 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2025-02-15 10:58:55 +0000 |
commit | 08f70200ce01eea42eed7c6fcdcf300a8812be95 (patch) | |
tree | 85233e9f35e84b8d4f874b95eaaceb44b65b5457 | |
parent | fd00010ba21c04bddb20aef52f62de5636075067 (diff) | |
download | gcc-08f70200ce01eea42eed7c6fcdcf300a8812be95.zip gcc-08f70200ce01eea42eed7c6fcdcf300a8812be95.tar.gz gcc-08f70200ce01eea42eed7c6fcdcf300a8812be95.tar.bz2 |
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.
4 files changed, 107 insertions, 167 deletions
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 0000000..23676ad --- /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 50f5805..0000000 --- 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 6e56927..0000000 --- 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 e6c1c9a..0000000 --- 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)); -} |