https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94049
Bug ID: 94049
Summary: For better diagnostics CPOs should not use concepts
for operator()
Product: gcc
Version: 10.0
Status: UNCONFIRMED
Keywords: diagnostic
Severity: normal
Priority: P3
Component: libstdc++
Assignee: unassigned at gcc dot gnu.org
Reporter: antoshkka at gmail dot com
Target Milestone: ---
Consider the following code:
#include <algorithm>
void foo0() {
int t = 0;
std::ranges::begin(t);
}
Diagnostics for it is mostly unreadable and points to the internals of
libstdc++ https://godbolt.org/z/c-RwuY .
This could be significantly improved. Right now the `requires` clause on
`std::ranges::__cust_access::_Begin::operator()` duplicates the body of the
function. So instead of such duplication all the requirements could be just
asserted in the body:
template<typename _Tp>
constexpr auto
operator()(_Tp&& __t) const noexcept(_S_noexcept<_Tp>()) {
static_assert(__maybe_borrowed_range<_Tp>, "Not a borrowed range or
lvalue");
if constexpr (is_array_v<remove_reference_t<_Tp>>) {
...
} else if constexpr (__member_begin<_Tp>)
return __t.begin();
else if constexpr (__adl_begin<_Tp>)
return begin(__t);
else
static_assert(!sizeof(_Tp), "_Tp should have either a member begin() or an
begin(_Tp&) should be in the namespace of _Tp");
}
This gives a much better diagnostics: https://godbolt.org/z/kmLGb7
All the CPOs could be improved in that manner