Skip to content
Snippets Groups Projects
Unverified Commit 08f70200 authored by Jonathan Wakely's avatar Jonathan Wakely Committed by Jonathan Wakely
Browse files

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.
parent fd00010b
No related branches found
No related tags found
No related merge requests found
// { dg-do compile { target c++17 } } // { dg-do compile { target c++11 } }
// Copyright (C) 2016-2025 Free Software Foundation, Inc. // Copyright (C) 2010-2025 Free Software Foundation, Inc.
// //
// This file is part of the GNU ISO C++ Library. This library is free // 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 // software; you can redistribute it and/or modify it under the
...@@ -26,38 +26,82 @@ ...@@ -26,38 +26,82 @@
# define NOTHROW(F) # define NOTHROW(F)
#endif #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 namespace std
{ {
template<class C> constexpr auto begin(C& c) NOTHROW(begin) -> decltype(c.begin()); template<class C>
template<class C> constexpr auto begin(const C& c) NOTHROW(begin) -> decltype(c.begin()); 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 auto end(C& c) NOTHROW(end) -> decltype(c.end()); template<class C>
template<class C> constexpr auto end(const C& c) NOTHROW(end) -> decltype(c.end()); 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 T* begin(T (&array)[N]) noexcept; template<class T, size_t N>
template<class T, size_t N> constexpr T* end(T (&array)[N]) noexcept; CONSTEXPR_14 T*
begin(T (&array)[N]) noexcept;
template<class T, size_t N>
CONSTEXPR_14 T*
end(T (&array)[N]) noexcept;
template<class C> constexpr auto cbegin(const C& c) -> decltype(c.begin()); #if __cplusplus >= 201402L
template<class C> constexpr auto cend(const C& c) -> decltype(c.end()); 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 auto rbegin(C& c) -> decltype(c.rbegin()); template<class C>
template<class C> constexpr auto rbegin(const C& c) -> decltype(c.rbegin()); 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 auto rend(C& c) -> decltype(c.rend()); template<class C>
template<class C> constexpr auto rend(const C& c) -> decltype(c.rend()); 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> template<class T, size_t N>
constexpr reverse_iterator<T*> rbegin(T (&array)[N]) noexcept; CONSTEXPR_17 reverse_iterator<T*>
rbegin(T (&array)[N]) noexcept;
template<class T, size_t N> template<class T, size_t N>
constexpr reverse_iterator<T*> rend(T (&array)[N]) noexcept; CONSTEXPR_17 reverse_iterator<T*>
rend(T (&array)[N]) noexcept;
template<class E> template<class E>
constexpr reverse_iterator<const E*> rbegin(initializer_list<E>) noexcept; CONSTEXPR_17 reverse_iterator<const E*>
rbegin(initializer_list<E>) noexcept;
template<class E> template<class E>
constexpr reverse_iterator<const E*> rend(initializer_list<E>) noexcept; CONSTEXPR_17 reverse_iterator<const E*>
rend(initializer_list<E>) noexcept;
template<class C> template<class C>
constexpr auto crbegin(const C& c) -> decltype(std::rbegin(c)); CONSTEXPR_17 auto
crbegin(const C& c) -> decltype(std::rbegin(c));
template<class C> template<class C>
constexpr auto cend(const C& c) -> decltype(std::rend(c)); CONSTEXPR_17 auto
cend(const C& c) -> decltype(std::rend(c));
#endif // C++14
} }
// { 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;
}
// { 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));
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment