By changing __cust_access::__decay_copy from a function template to a function object we avoid ADL. That means it's fine to call it unqualified (the compiler won't waste time doing ADL in associated namespaces, and won't try to complete associated types). This also makes some other minor simplications to other concepts for the [range.access] CPOs. Signed-off-by: Jonathan Wakely libstdc++-v3/ChangeLog: * include/bits/iterator_concepts.h (__cust_access::__decay_copy): Replace with function object. (__cust_access::__member_begin, ___cust_access::_adl_begin): Use __decay_copy unqualified. * include/bits/ranges_base.h (__member_end, __adl_end): Likewise. Use __range_iter_t for type of ranges::begin. (__member_rend): Use correct value category for rbegin argument. (__member_data): Use __decay_copy unqualified. (__begin_data): Use __range_iter_t for type of ranges::begin. Tested powerpc64le-linux. Committed to trunk.