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