aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArsen Arsenović <arsen@aarsen.me>2024-12-24 12:29:02 +0100
committerArsen Arsenović <arsen@gcc.gnu.org>2024-12-27 12:29:42 +0100
commit5a41ab8da087617d785f563b76f5c2fd6600b4c0 (patch)
tree1417f28d7e37dd1bd0b9e260b67669cf6a54ba22
parent4731ead79fac259258dbb027090f3d085f518040 (diff)
downloadgcc-5a41ab8da087617d785f563b76f5c2fd6600b4c0.zip
gcc-5a41ab8da087617d785f563b76f5c2fd6600b4c0.tar.gz
gcc-5a41ab8da087617d785f563b76f5c2fd6600b4c0.tar.bz2
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.
-rw-r--r--libstdc++-v3/include/std/generator2
-rw-r--r--libstdc++-v3/testsuite/24_iterators/range_generators/pr118022.cc16
2 files changed, 17 insertions, 1 deletions
diff --git a/libstdc++-v3/include/std/generator b/libstdc++-v3/include/std/generator
index bba85bd..3a19d53 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 0000000..d8915bb
--- /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()
+{}