https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119469
Bug ID: 119469 Summary: iter_rvalue_reference_t is wrong for function types Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: libstdc++ Assignee: unassigned at gcc dot gnu.org Reporter: blubban at gmail dot com Target Milestone: --- #include <type_traits> #include <iterator> bool a1() { return std::is_same_v<std::iter_rvalue_reference_t<int(int)>, int(&)(int)>; } bool a2() { return std::is_same_v<std::iter_rvalue_reference_t<int(int)>, int(&&)(int)>; } bool a3() { return std::is_same_v<std::iter_rvalue_reference_t<int(int)>, int(int)>; } bool a4() { return std::is_same_v<std::iter_rvalue_reference_t<int(int)>, int(*)(int)>; } template<typename T> using alt_iter_rvalue_reference_t = decltype(std::ranges::iter_move(std::declval<T&>())); bool b1() { return std::is_same_v<alt_iter_rvalue_reference_t<int(int)>, int(&)(int)>; } bool b2() { return std::is_same_v<alt_iter_rvalue_reference_t<int(int)>, int(&&)(int)>; } bool b3() { return std::is_same_v<alt_iter_rvalue_reference_t<int(int)>, int(int)>; } bool b4() { return std::is_same_v<alt_iter_rvalue_reference_t<int(int)>, int(*)(int)>; } Expected: Since the spec defines iter_rvalue_reference_t as decltype(std::ranges::iter_move(std::declval<T&>())), the two sets of functions should be identical (according to Clang and the MSVC STL head maintainer, the correct answer is a1/b1) Actual: a2 and b1 are true (it's a4/b4 on MSVC, due to a compiler bug) https://godbolt.org/z/bTGbKr3ee