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. > > 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 > >