https://gcc.gnu.org/PR120949
https://bugs.gentoo.org/959695
https://bugs.gentoo.org/959697
https://bugs.gentoo.org/959700
https://bugs.gentoo.org/959704

From ed912b1ee5ad0f241f968d5fd1a54a7e9e0e20dd Mon Sep 17 00:00:00 2001
Message-ID: <ed912b1ee5ad0f241f968d5fd1a54a7e9e0e20dd.1751999555.git.sam@gentoo.org>
From: Jonathan Wakely <jwakely@redhat.com>
Date: Fri, 4 Jul 2025 21:19:52 +0100
Subject: [PATCH] libstdc++: Fix attribute order on __normal_iterator friends
 [PR120949]

In r16-1911-g6596f5ab746533 I claimed to have reordered some attributes
for compatibility with Clang, but it looks like I got the Clang
restriction backwards and put them all in the wrong order. Clang trunk
accepts either order (probably since the llvm/llvm-project#133107 fix)
but released versions still require a particular order.

There were also some cases where the attributes were after the friend
keyword, which Clang trunk still rejects.

libstdc++-v3/ChangeLog:

	PR libstdc++/120949
	* include/bits/stl_iterator.h (__normal_iterator): Fix order of
	always_inline and nodiscard attributes for Clang compatibility.
---
 libstdc++-v3/include/bits/stl_iterator.h | 30 +++++++++++++-----------
 1 file changed, 16 insertions(+), 14 deletions(-)

diff --git a/libstdc++-v3/include/bits/stl_iterator.h b/libstdc++-v3/include/bits/stl_iterator.h
index a7188f46f6db..75e794f6c020 100644
--- a/libstdc++-v3/include/bits/stl_iterator.h
+++ b/libstdc++-v3/include/bits/stl_iterator.h
@@ -1211,7 +1211,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 #else
        // Forward iterator requirements
       template<typename _Iter>
-	__attribute__((__always_inline__)) _GLIBCXX_NODISCARD
+	_GLIBCXX_NODISCARD __attribute__((__always_inline__))
 	friend
 	_GLIBCXX_CONSTEXPR
 	bool
@@ -1220,7 +1220,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	_GLIBCXX_NOEXCEPT
 	{ return __lhs.base() == __rhs.base(); }
 
-      __attribute__((__always_inline__)) _GLIBCXX_NODISCARD
+      _GLIBCXX_NODISCARD __attribute__((__always_inline__))
       friend
       _GLIBCXX_CONSTEXPR
       bool
@@ -1229,7 +1229,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       { return __lhs.base() == __rhs.base(); }
 
       template<typename _Iter>
-	__attribute__((__always_inline__)) _GLIBCXX_NODISCARD
+	_GLIBCXX_NODISCARD __attribute__((__always_inline__))
 	friend
 	_GLIBCXX_CONSTEXPR
 	bool
@@ -1238,7 +1238,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	_GLIBCXX_NOEXCEPT
 	{ return __lhs.base() != __rhs.base(); }
 
-      __attribute__((__always_inline__)) _GLIBCXX_NODISCARD
+      _GLIBCXX_NODISCARD __attribute__((__always_inline__))
       friend
       _GLIBCXX_CONSTEXPR
       bool
@@ -1248,15 +1248,16 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
       // Random access iterator requirements
       template<typename _Iter>
+	_GLIBCXX_NODISCARD __attribute__((__always_inline__))
 	friend
-	__attribute__((__always_inline__)) _GLIBCXX_NODISCARD _GLIBCXX_CONSTEXPR
+	_GLIBCXX_CONSTEXPR
 	inline bool
 	operator<(const __normal_iterator& __lhs,
 		  const __normal_iterator<_Iter, _Container>& __rhs)
 	_GLIBCXX_NOEXCEPT
 	{ return __lhs.base() < __rhs.base(); }
 
-      __attribute__((__always_inline__)) _GLIBCXX_NODISCARD
+      _GLIBCXX_NODISCARD __attribute__((__always_inline__))
       friend
       _GLIBCXX20_CONSTEXPR
       bool
@@ -1265,15 +1266,16 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       { return __lhs.base() < __rhs.base(); }
 
       template<typename _Iter>
+	_GLIBCXX_NODISCARD __attribute__((__always_inline__))
 	friend
-	__attribute__((__always_inline__)) _GLIBCXX_NODISCARD _GLIBCXX_CONSTEXPR
+	_GLIBCXX_CONSTEXPR
 	bool
 	operator>(const __normal_iterator& __lhs,
 		  const __normal_iterator<_Iter, _Container>& __rhs)
 	_GLIBCXX_NOEXCEPT
 	{ return __lhs.base() > __rhs.base(); }
 
-      __attribute__((__always_inline__)) _GLIBCXX_NODISCARD
+      _GLIBCXX_NODISCARD __attribute__((__always_inline__))
       friend
       _GLIBCXX_CONSTEXPR
       bool
@@ -1282,7 +1284,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       { return __lhs.base() > __rhs.base(); }
 
       template<typename _Iter>
-	__attribute__((__always_inline__)) _GLIBCXX_NODISCARD
+	_GLIBCXX_NODISCARD __attribute__((__always_inline__))
 	friend
 	_GLIBCXX_CONSTEXPR
 	bool
@@ -1291,7 +1293,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	_GLIBCXX_NOEXCEPT
 	{ return __lhs.base() <= __rhs.base(); }
 
-      __attribute__((__always_inline__)) _GLIBCXX_NODISCARD
+      _GLIBCXX_NODISCARD __attribute__((__always_inline__))
       friend
       _GLIBCXX_CONSTEXPR
       bool
@@ -1300,7 +1302,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       { return __lhs.base() <= __rhs.base(); }
 
       template<typename _Iter>
-	__attribute__((__always_inline__)) _GLIBCXX_NODISCARD
+	_GLIBCXX_NODISCARD __attribute__((__always_inline__))
 	friend
 	_GLIBCXX_CONSTEXPR
 	bool
@@ -1309,7 +1311,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	_GLIBCXX_NOEXCEPT
 	{ return __lhs.base() >= __rhs.base(); }
 
-      __attribute__((__always_inline__)) _GLIBCXX_NODISCARD
+      _GLIBCXX_NODISCARD __attribute__((__always_inline__))
       friend
       _GLIBCXX_CONSTEXPR
       bool
@@ -1341,7 +1343,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 #endif
 	{ return __lhs.base() - __rhs.base(); }
 
-      __attribute__((__always_inline__)) _GLIBCXX_NODISCARD
+      _GLIBCXX_NODISCARD __attribute__((__always_inline__))
       friend
       _GLIBCXX_CONSTEXPR
       difference_type
@@ -1349,7 +1351,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	_GLIBCXX_NOEXCEPT
       { return __lhs.base() - __rhs.base(); }
 
-      __attribute__((__always_inline__)) _GLIBCXX_NODISCARD
+      _GLIBCXX_NODISCARD __attribute__((__always_inline__))
       friend
       _GLIBCXX_CONSTEXPR
       __normal_iterator
-- 
2.50.0

