https://gcc.gnu.org/g:5a41ab8da087617d785f563b76f5c2fd6600b4c0

commit r15-6446-g5a41ab8da087617d785f563b76f5c2fd6600b4c0
Author: Arsen Arsenović <ar...@aarsen.me>
Date:   Tue Dec 24 12:29:02 2024 +0100

    libstdc++: don't implicit-construct _Yielded_decvref [PR118022]
    
    This overload requires
    
      constructible_from<remove_cvref_t<yielded>,
                         const remove_reference_t<yielded>&>
    
    ... but then tries to construct remove_cvref_t<yielded> implicitly,
    which means it imposes an additional constraint not in the standard.
    
    libstdc++-v3/ChangeLog:
    
            PR libstdc++/118022
            * include/std/generator
            (_Promise_erased::yield_value(const _Yielded_deref&)): Don't
            implicit-constuct _Yielded_decvref.
            * testsuite/24_iterators/range_generators/pr118022.cc: New test.

Diff:
---
 libstdc++-v3/include/std/generator                       |  2 +-
 .../testsuite/24_iterators/range_generators/pr118022.cc  | 16 ++++++++++++++++
 2 files changed, 17 insertions(+), 1 deletion(-)

diff --git a/libstdc++-v3/include/std/generator 
b/libstdc++-v3/include/std/generator
index bba85bd0aa4e..3a19d535ef86 100644
--- a/libstdc++-v3/include/std/generator
+++ b/libstdc++-v3/include/std/generator
@@ -144,7 +144,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
          requires (is_rvalue_reference_v<_Yielded>
                    && constructible_from<_Yielded_decvref,
                    const _Yielded_deref&>)
-       { return _Copy_awaiter(__val, _M_bottom_value()); }
+       { return _Copy_awaiter(_Yielded_decvref(__val), _M_bottom_value()); }
 
        template<typename _R2, typename _V2, typename _A2, typename _U2>
        requires std::same_as<_Yield2_t<_R2, _V2>, _Yielded>
diff --git a/libstdc++-v3/testsuite/24_iterators/range_generators/pr118022.cc 
b/libstdc++-v3/testsuite/24_iterators/range_generators/pr118022.cc
new file mode 100644
index 000000000000..d8915bb38dc4
--- /dev/null
+++ b/libstdc++-v3/testsuite/24_iterators/range_generators/pr118022.cc
@@ -0,0 +1,16 @@
+// { dg-do compile { target c++23 } }
+#include <generator>
+
+struct O {
+  O() = default;
+  explicit O(const O&) = default;
+};
+
+std::generator<O&&> gen() {
+  const O o;
+  co_yield o;
+}
+
+int
+main()
+{}

Reply via email to