On Sun, 6 Jul 2025 at 19:53, Stephan Bergmann <sberg....@gmail.com> wrote:
>
> On 6/12/25 10:46, Jonathan Wakely wrote:
> > It now says:
> >
> >     I also had to reorder the __attribute__((always_inline)) and
> >     [[nodiscard]] attributes on the pre-c++20 operators, because Clang won't
> >     allow [[foo]] after __attribute__((bar)) on a friend function:
> >
> >     <source>:4:36: error: an attribute list cannot appear here
> >         4 |     __attribute__((always_inline)) [[nodiscard]] friend bool
> >           |                                    ^~~~~~~~~~~~~
>
> Just noting that at least with recent Clang 21 trunk,

Yes, this is https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120949

>
> > $ cat test.cc
> > #include <iterator>
>
> > $ clang++ -std=c++17 -fsyntax-only test.cc
> > In file included from test.cc:1:
> > In file included from 
> > ~/gcc/inst/lib/gcc/x86_64-pc-linux-gnu/16.0.0/../../../../include/c++/16.0.0/iterator:65:
> > ~/gcc/inst/lib/gcc/x86_64-pc-linux-gnu/16.0.0/../../../../include/c++/16.0.0/bits/stl_iterator.h:1252:37:
> >  error:
> >       an attribute list cannot appear here
> >  1252 |         __attribute__((__always_inline__)) _GLIBCXX_NODISCARD 
> > _GLIBCXX_CONSTEXPR
> >       |                                            ^~~~~~~~~~~~~~~~~~
> > ~/gcc/inst/lib/gcc/x86_64-pc-linux-gnu/16.0.0/../../../../include/c++/16.0.0/x86_64-pc-linux-gnu/bits/c++config.h:173:29:
> >  note:
> >       expanded from macro '_GLIBCXX_NODISCARD'
> >   173 | # define _GLIBCXX_NODISCARD [[__nodiscard__]]
> >       |                             ^~~~~~~~~~~~~~~~~
> > In file included from test.cc:1:
> > In file included from 
> > ~/gcc/inst/lib/gcc/x86_64-pc-linux-gnu/16.0.0/../../../../include/c++/16.0.0/iterator:65:
> > ~/gcc/inst/lib/gcc/x86_64-pc-linux-gnu/16.0.0/../../../../include/c++/16.0.0/bits/stl_iterator.h:1269:37:
> >  error:
> >       an attribute list cannot appear here
> >  1269 |         __attribute__((__always_inline__)) _GLIBCXX_NODISCARD 
> > _GLIBCXX_CONSTEXPR
> >       |                                            ^~~~~~~~~~~~~~~~~~
> > ~/gcc/inst/lib/gcc/x86_64-pc-linux-gnu/16.0.0/../../../../include/c++/16.0.0/x86_64-pc-linux-gnu/bits/c++config.h:173:29:
> >  note:
> >       expanded from macro '_GLIBCXX_NODISCARD'
> >   173 | # define _GLIBCXX_NODISCARD [[__nodiscard__]]
> >       |                             ^~~~~~~~~~~~~~~~~
> > 2 errors generated.
>
> now fails (while with --std=c++20) it works, where something like
>
> > diff --git a/libstdc++-v3/include/bits/stl_iterator.h 
> > b/libstdc++-v3/include/bits/stl_iterator.h
> > index a7188f46f6d..26bb0206375 100644
> > --- a/libstdc++-v3/include/bits/stl_iterator.h
> > +++ b/libstdc++-v3/include/bits/stl_iterator.h
> > @@ -1248,8 +1248,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> >
> >        // Random access iterator requirements
> >        template<typename _Iter>
> > +       __attribute__((__always_inline__)) _GLIBCXX_NODISCARD
> >         friend
> > -       __attribute__((__always_inline__)) _GLIBCXX_NODISCARD 
> > _GLIBCXX_CONSTEXPR
> > +       _GLIBCXX_CONSTEXPR
> >         inline bool
> >         operator<(const __normal_iterator& __lhs,
> >                   const __normal_iterator<_Iter, _Container>& __rhs)
> > @@ -1265,8 +1266,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> >        { return __lhs.base() < __rhs.base(); }
> >
> >        template<typename _Iter>
> > +       __attribute__((__always_inline__)) _GLIBCXX_NODISCARD
> >         friend
> > -       __attribute__((__always_inline__)) _GLIBCXX_NODISCARD 
> > _GLIBCXX_CONSTEXPR
> > +       _GLIBCXX_CONSTEXPR
> >         bool
> >         operator>(const __normal_iterator& __lhs,
> >                   const __normal_iterator<_Iter, _Container>& __rhs)
>
> would fix that.
>

Reply via email to