On Tue, 8 Jul 2025 at 13:26, Tomasz Kaminski <tkami...@redhat.com> wrote: > > > > On Sat, Jul 5, 2025 at 1:27 AM Jonathan Wakely <jwak...@redhat.com> wrote: >> >> 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. >> >> libstdc++-v3/ChangeLog: >> >> PR libstdc++/120949 >> * include/bits/stl_iterator.h (__normal_iterator): Fix order of >> always_inline and nodiscard attributes for Clang compatibility. >> --- >> >> Tested x86_64-linux, and tested lightly with Clang. > > LGTM. > I have also checked that this is indeed an order that is accepted by clang. > The fact that this restriction is only put on hidden friends is strange.
I think they've fixed it on Clang trunk. But Clang trunk still complains about attributes after the 'friend' keyword, and it might be correct about that. >> >> >> 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 >>