https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119469
--- Comment #8 from GCC Commits <cvs-commit at gcc dot gnu.org> --- The master branch has been updated by Jonathan Wakely <r...@gcc.gnu.org>: https://gcc.gnu.org/g:3e52eb28c537aaa03afb78ef9dff8325c5f41f78 commit r15-8966-g3e52eb28c537aaa03afb78ef9dff8325c5f41f78 Author: Jonathan Wakely <jwak...@redhat.com> Date: Wed Mar 26 11:21:32 2025 +0000 libstdc++: Fix std::ranges::iter_move for function references [PR119469] The result of std::move (or a cast to an rvalue reference) on a function reference is always an lvalue. Because std::ranges::iter_move was using the type std::remove_reference_t<X>&& as the result of std::move, it was giving the wrong type for function references. Use a decltype-specifier with declval<remove_reference_t<X>>() instead of just using the remove_reference_t<X>&& type directly. This gives the right result, while still avoiding the cost of doing overload resolution for std::move. libstdc++-v3/ChangeLog: PR libstdc++/119469 * include/bits/iterator_concepts.h (_IterMove::__result): Use decltype-specifier instead of an explicit type. * testsuite/24_iterators/customization_points/iter_move.cc: Check results for function references. Reviewed-by: Tomasz KamiÅski <tkami...@redhat.com>