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.
This commit is contained in:
Jonathan Wakely 2025-02-12 19:52:01 +00:00 committed by Jonathan Wakely
parent fd00010ba2
commit 08f70200ce
No known key found for this signature in database
4 changed files with 107 additions and 167 deletions

View file

@ -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
}

View file

@ -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;
}

View file

@ -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));
}

View file

@ -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));
}