https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109751

--- Comment #8 from Luke Dalessandro <ldalessandro at gmail dot com> ---
(In reply to Andrew Pinski from comment #7)
> I think the error message is correct.
> 
> In the original code we have:
> ```
> ...
>   template<typename _Iter>
>     concept incrementable = regular<_Iter> && requires(_Iter __i) { { __i++
> } -> same_as<_Iter>; };
> ...
> 
> namespace boost { namespace stl_interfaces { inline namespace v2 {
>     template<      typename D,      typename IteratorConcept,     typename
> DifferenceType>
>     struct iterator_interface
>     {
>       friend constexpr bool operator>=(D lhs, D rhs)
>         requires std::equality_comparable<D> {        }
>     };
> ...
> 
> template<typename T>
> struct iterator : boost::stl_interfaces::iterator_interface<iterator<T>,
> std::forward_iterator_tag, T>
> {
>     bool operator==(iterator) const;
> };
> 
> ```
> iterator<T> is not complete until after the instantiation is finished but we
> have a std::equality_comparable which does the confusion

Right.

I was sort of surprised that that boost code could get away with a requires on
any of those CRTP functions where it uses the CRTP "D" type, but I tested
gcc-12 and all the clangs, and nvc++, and msvc 19, and gcc-13 was the only one
reporting problems here, so I went with consensus.

Reply via email to