https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108393
--- Comment #1 from Jonathan Wakely <redi at gcc dot gnu.org> --- The concept C checks whether S<unreachable_sentinel_t> satisfies the constraint for the iterator_traits specialization. That performs ADL for operator== with S<unreachable_sentinel_t> and unreachable_sentinel_t as associated classes. That finds the hidden friend function, and then performs overload resolution to see if it's viable for S<unreachable_sentinel_t> arguments. Overload resolution checks whether the arguments satisfy the constraints, which means checking if C is satisfied, which creates the cycle. The question is whether GCC is correct to check constraint satisfaction for one argument when the other argument cannot be converted to unreachable_sentinel_t.