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:
parent
fd00010ba2
commit
08f70200ce
4 changed files with 107 additions and 167 deletions
|
@ -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
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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));
|
||||
}
|
|
@ -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));
|
||||
}
|
Loading…
Add table
Reference in a new issue