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

Reply via email to