<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote gmail_quote_container"><div dir="ltr" class="gmail_attr">On Sat, Jul 5, 2025 at 1:27 AM Jonathan Wakely <<a href="mailto:jwakely@redhat.com">jwakely@redhat.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">In r16-1911-g6596f5ab746533 I claimed to have reordered some attributes<br>
for compatibility with Clang, but it looks like I got the Clang<br>
restriction backwards and put them all in the wrong order.<br>
<br>
libstdc++-v3/ChangeLog:<br>
<br>
PR libstdc++/120949<br>
* include/bits/stl_iterator.h (__normal_iterator): Fix order of<br>
always_inline and nodiscard attributes for Clang compatibility.<br>
---<br>
<br>
Tested x86_64-linux, and tested lightly with Clang.<br></blockquote><div>LGTM.<br></div><div>I have also checked that this is indeed an order that is accepted by clang.<br></div><div>The fact that this restriction is only put on hidden friends is strange.</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
libstdc++-v3/include/bits/stl_iterator.h | 30 +++++++++++++-----------<br>
1 file changed, 16 insertions(+), 14 deletions(-)<br>
<br>
diff --git a/libstdc++-v3/include/bits/stl_iterator.h b/libstdc++-v3/include/bits/stl_iterator.h<br>
index a7188f46f6db..75e794f6c020 100644<br>
--- a/libstdc++-v3/include/bits/stl_iterator.h<br>
+++ b/libstdc++-v3/include/bits/stl_iterator.h<br>
@@ -1211,7 +1211,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION<br>
#else<br>
// Forward iterator requirements<br>
template<typename _Iter><br>
- __attribute__((__always_inline__)) _GLIBCXX_NODISCARD<br>
+ _GLIBCXX_NODISCARD __attribute__((__always_inline__))<br>
friend<br>
_GLIBCXX_CONSTEXPR<br>
bool<br>
@@ -1220,7 +1220,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION<br>
_GLIBCXX_NOEXCEPT<br>
{ return __lhs.base() == __rhs.base(); }<br>
<br>
- __attribute__((__always_inline__)) _GLIBCXX_NODISCARD<br>
+ _GLIBCXX_NODISCARD __attribute__((__always_inline__))<br>
friend<br>
_GLIBCXX_CONSTEXPR<br>
bool<br>
@@ -1229,7 +1229,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION<br>
{ return __lhs.base() == __rhs.base(); }<br>
<br>
template<typename _Iter><br>
- __attribute__((__always_inline__)) _GLIBCXX_NODISCARD<br>
+ _GLIBCXX_NODISCARD __attribute__((__always_inline__))<br>
friend<br>
_GLIBCXX_CONSTEXPR<br>
bool<br>
@@ -1238,7 +1238,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION<br>
_GLIBCXX_NOEXCEPT<br>
{ return __lhs.base() != __rhs.base(); }<br>
<br>
- __attribute__((__always_inline__)) _GLIBCXX_NODISCARD<br>
+ _GLIBCXX_NODISCARD __attribute__((__always_inline__))<br>
friend<br>
_GLIBCXX_CONSTEXPR<br>
bool<br>
@@ -1248,15 +1248,16 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION<br>
<br>
// Random access iterator requirements<br>
template<typename _Iter><br>
+ _GLIBCXX_NODISCARD __attribute__((__always_inline__))<br>
friend<br>
- __attribute__((__always_inline__)) _GLIBCXX_NODISCARD _GLIBCXX_CONSTEXPR<br>
+ _GLIBCXX_CONSTEXPR<br>
inline bool<br>
operator<(const __normal_iterator& __lhs,<br>
const __normal_iterator<_Iter, _Container>& __rhs)<br>
_GLIBCXX_NOEXCEPT<br>
{ return __lhs.base() < __rhs.base(); }<br>
<br>
- __attribute__((__always_inline__)) _GLIBCXX_NODISCARD<br>
+ _GLIBCXX_NODISCARD __attribute__((__always_inline__))<br>
friend<br>
_GLIBCXX20_CONSTEXPR<br>
bool<br>
@@ -1265,15 +1266,16 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION<br>
{ return __lhs.base() < __rhs.base(); }<br>
<br>
template<typename _Iter><br>
+ _GLIBCXX_NODISCARD __attribute__((__always_inline__))<br>
friend<br>
- __attribute__((__always_inline__)) _GLIBCXX_NODISCARD _GLIBCXX_CONSTEXPR<br>
+ _GLIBCXX_CONSTEXPR<br>
bool<br>
operator>(const __normal_iterator& __lhs,<br>
const __normal_iterator<_Iter, _Container>& __rhs)<br>
_GLIBCXX_NOEXCEPT<br>
{ return __lhs.base() > __rhs.base(); }<br>
<br>
- __attribute__((__always_inline__)) _GLIBCXX_NODISCARD<br>
+ _GLIBCXX_NODISCARD __attribute__((__always_inline__))<br>
friend<br>
_GLIBCXX_CONSTEXPR<br>
bool<br>
@@ -1282,7 +1284,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION<br>
{ return __lhs.base() > __rhs.base(); }<br>
<br>
template<typename _Iter><br>
- __attribute__((__always_inline__)) _GLIBCXX_NODISCARD<br>
+ _GLIBCXX_NODISCARD __attribute__((__always_inline__))<br>
friend<br>
_GLIBCXX_CONSTEXPR<br>
bool<br>
@@ -1291,7 +1293,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION<br>
_GLIBCXX_NOEXCEPT<br>
{ return __lhs.base() <= __rhs.base(); }<br>
<br>
- __attribute__((__always_inline__)) _GLIBCXX_NODISCARD<br>
+ _GLIBCXX_NODISCARD __attribute__((__always_inline__))<br>
friend<br>
_GLIBCXX_CONSTEXPR<br>
bool<br>
@@ -1300,7 +1302,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION<br>
{ return __lhs.base() <= __rhs.base(); }<br>
<br>
template<typename _Iter><br>
- __attribute__((__always_inline__)) _GLIBCXX_NODISCARD<br>
+ _GLIBCXX_NODISCARD __attribute__((__always_inline__))<br>
friend<br>
_GLIBCXX_CONSTEXPR<br>
bool<br>
@@ -1309,7 +1311,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION<br>
_GLIBCXX_NOEXCEPT<br>
{ return __lhs.base() >= __rhs.base(); }<br>
<br>
- __attribute__((__always_inline__)) _GLIBCXX_NODISCARD<br>
+ _GLIBCXX_NODISCARD __attribute__((__always_inline__))<br>
friend<br>
_GLIBCXX_CONSTEXPR<br>
bool<br>
@@ -1341,7 +1343,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION<br>
#endif<br>
{ return __lhs.base() - __rhs.base(); }<br>
<br>
- __attribute__((__always_inline__)) _GLIBCXX_NODISCARD<br>
+ _GLIBCXX_NODISCARD __attribute__((__always_inline__))<br>
friend<br>
_GLIBCXX_CONSTEXPR<br>
difference_type<br>
@@ -1349,7 +1351,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION<br>
_GLIBCXX_NOEXCEPT<br>
{ return __lhs.base() - __rhs.base(); }<br>
<br>
- __attribute__((__always_inline__)) _GLIBCXX_NODISCARD<br>
+ _GLIBCXX_NODISCARD __attribute__((__always_inline__))<br>
friend<br>
_GLIBCXX_CONSTEXPR<br>
__normal_iterator<br>
-- <br>
2.50.0<br>
<br>
</blockquote></div></div>