https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59655
Jonathan Wakely <redi at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Last reconfirmed|2019-03-08 00:00:00 |2019-12-10 --- Comment #6 from Jonathan Wakely <redi at gcc dot gnu.org> --- This is now blocking the implementation of std::ranges algorithms, because this error is given for types that are only used in concept satisfaction (and never actually odr-used): #include <iterator> template<typename T, std::indirect_unary_predicate<std::projected<T*, std::identity>> Pred> constexpr void all_of(T*, Pred) { } void test01() { struct X { }; X x; all_of(&x, [](X&) { return false; }); } Compiled with -std=gnu++2a and current trunk: In file included from /home/jwakely/gcc/10/include/c++/10.0.0/bits/stl_iterator_base_types.h:71, from /home/jwakely/gcc/10/include/c++/10.0.0/iterator:61, from proj.cc:1: /home/jwakely/gcc/10/include/c++/10.0.0/bits/iterator_concepts.h:669:40: error: 'std::indirect_result_t<_Proj&, _Iter> std::projected<_Iter, _Proj>::operator*() const [with _Iter = test01()::X*; _Proj = std::identity; std::indirect_result_t<_Proj&, _Iter> = test01()::X&]', declared using local type 'test01()::X', is used but never defined [-fpermissive] 669 | indirect_result_t<_Proj&, _Iter> operator*() const; // not defined | ^~~~~~~~