]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Fix attribute order on __normal_iterator friends [PR120949]
authorJonathan Wakely <jwakely@redhat.com>
Fri, 4 Jul 2025 20:19:52 +0000 (21:19 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Mon, 7 Jul 2025 20:50:51 +0000 (21:50 +0100)
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

index a7188f46f6db6c82d984408177b7c708934a736b..75e794f6c020431bfef11e089f38535b1b33f0f5 100644 (file)
@@ -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