https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118566
Bug ID: 118566 Summary: 'requires' avoids out-class implemention to find inside-class declaration Product: gcc Version: 14.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: shyeyian at petalmail dot com Target Milestone: --- Compilation fails on g++14.2. It is ok on clang++. #include <ranges> struct test { // Declaration test(std::from_range_t, std::ranges::input_range auto&& r) requires std::convertible_to<std::ranges::range_value_t<decltype(r)>, int>; }; // Implemention test::test(std::from_range_t, std::ranges::input_range auto&& r) requires std::convertible_to<std::ranges::range_value_t<decltype(r)>, int> { } // Compilation failed. // Oops! The outside-class implemention cannot find the inside-class declaration! /* GCC Version: 14.2.0(MacOS 15.1.1, Macbook with Apple M2, gcc is installed from brew), 14.2.0(Windows11, Matebook with Intel(x86_64), gcc is installed from MSYS) Compile command: g++ -std=c++23 main.cpp -o main.o Compile output: main.cpp:11:1: error: no declaration matches 'test::test(std::from_range_t, auto:49&&) requires convertible_to<typename std::__detail::__iter_traits_impl<typename std::remove_cvref<decltype(std::ranges::__access::__begin((declval<decltype(test::__ct ::r)&>)()))>::type, std::indirectly_readable_traits<typename std::remove_cvref<decltype(std::ranges::__access::__begin((declval<decltype(test::__ct ::r)&>)()))>::type> >::__iter_traits<typename std::remove_cvref<decltype(std::ranges::__access::__begin((declval<decltype(test::__ct ::r)&>)()))>::type, std::indirectly_readable_traits<typename std::remove_cvref<decltype(std::ranges::__access::__begin((declval<decltype(test::__ct ::r)&>)()))>::type> >::value_type, int>' 11 | test::test(std::from_range_t, std::ranges::input_range auto&& r) | ^~~~ main.cpp:3:8: note: candidates are: 'constexpr test::test(test&&)' 3 | struct test | ^~~~ main.cpp:3:8: note: 'constexpr test::test(const test&)' main.cpp:6:5: note: 'template<class auto:48> requires input_range<auto:48> test::test(std::from_range_t, auto:48&&) requires convertible_to<typename std::__detail::__iter_traits_impl<typename std::remove_cvref<decltype(std::ranges::__access::__begin((declval<decltype(test::__ct ::r)&>)()))>::type, std::indirectly_readable_traits<typename std::remove_cvref<decltype(std::ranges::__access::__begin((declval<decltype(test::__ct ::r)&>)()))>::type> >::__iter_traits<typename std::remove_cvref<decltype(std::ranges::__access::__begin((declval<decltype(test::__ct ::r)&>)()))>::type, std::indirectly_readable_traits<typename std::remove_cvref<decltype(std::ranges::__access::__begin((declval<decltype(test::__ct ::r)&>)()))>::type> >::value_type, int>' 6 | test(std::from_range_t, std::ranges::input_range auto&& r) | ^~~~ main.cpp:3:8: note: 'struct test' defined here 3 | struct test | ^~~~ Expected behavior: command="clang++ -std=c++23 main.cpp -o main.o", compilation is ok. */