https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117620

            Bug ID: 117620
           Summary: Problem passing rvalue to co_yield (maybe?)
           Product: gcc
           Version: 14.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: mwd at md5i dot com
  Target Milestone: ---

Created attachment 59606
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=59606&action=edit
Example code

When I compile the attached test code with -std=c++20, I get the following
error:

foo.cpp: In function ‘void get_values_2(get_values_2(int,
int)::_Z12get_values_2ii.Frame*)’:
foo.cpp:218:1: error: use of deleted function ‘constexpr
Generator<int>::Generator(const Generator<int>&)’
  218 | }
      | ^
foo.cpp:15:7: note: ‘constexpr Generator<int>::Generator(const
Generator<int>&)’ is implicitly declared as deleted because ‘Generator<int>’
declares a move constructor or move assignment operator
   15 | class Generator : std::ranges::view_interface<Generator<T>>
      |       ^~~~~~~~~
foo.cpp:215:1: note: use ‘-fdiagnostics-all-candidates’ to display considered
candidates
  218 | }
      | ^


Setting aside the fact that there are non-demangled identifiers in the output,
this is triggered by the co_yield on line 214 of the code, which reads:

  co_yield elements_of{get_values(low, high)};

If I rewrite the code (recompile with -DFIXED) as follows:

  auto x = elements_of{get_values(low, high)};
  co_yield std::move(x);

I do not get an error and everything runs correctly.  I cannot understand why
these should generate different results.  I also cannot figure out how and
where the call to the purported Generator<int> copy constructor occurs.

Reply via email to