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.
*/