https://gcc.gnu.org/g:ed912b1ee5ad0f241f968d5fd1a54a7e9e0e20dd

commit r16-2078-ged912b1ee5ad0f241f968d5fd1a54a7e9e0e20dd
Author: Jonathan Wakely <jwak...@redhat.com>
Date:   Fri Jul 4 21:19:52 2025 +0100

    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.

Diff:
---
 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

Reply via email to