aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3
diff options
context:
space:
mode:
authorArsen Arsenović <arsen@aarsen.me>2024-03-23 16:15:25 +0100
committerArsen Arsenović <arsen@gcc.gnu.org>2024-03-26 22:33:48 +0100
commitfb1d50e1f6e07c146999b1b773043c140fdc72b5 (patch)
tree2f49b3b6ab7139a028df2971898cb5cd64e97287 /libstdc++-v3
parentac5d63a46d78cded2cd4c41a615728b8e46b540f (diff)
libstdc++: fix generator iterator operator* return type
Per the standard, the return type of a generators ranges iterator op* should be the reference type rather than the yielded type. The yielded type was used here by mistake. libstdc++-v3/ChangeLog: * include/std/generator (generator::_Iterator::operator*): Fix return type. * testsuite/24_iterators/range_generators/iter_deref_return.cc: New test.
Diffstat (limited to 'libstdc++-v3')
-rw-r--r--libstdc++-v3/include/std/generator4
-rw-r--r--libstdc++-v3/testsuite/24_iterators/range_generators/iter_deref_return.cc25
2 files changed, 27 insertions, 2 deletions
diff --git a/libstdc++-v3/include/std/generator b/libstdc++-v3/include/std/generator
index 2d1dcced1e5..789016b5a88 100644
--- a/libstdc++-v3/include/std/generator
+++ b/libstdc++-v3/include/std/generator
@@ -773,12 +773,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
operator++(int)
{ this->operator++(); }
- yielded
+ _Reference
operator*()
const noexcept(is_nothrow_move_constructible_v<_Reference>)
{
auto& __p = this->_M_coro.promise();
- return static_cast<yielded>(*__p._M_value());
+ return static_cast<_Reference>(*__p._M_value());
}
private:
diff --git a/libstdc++-v3/testsuite/24_iterators/range_generators/iter_deref_return.cc b/libstdc++-v3/testsuite/24_iterators/range_generators/iter_deref_return.cc
new file mode 100644
index 00000000000..75471952e76
--- /dev/null
+++ b/libstdc++-v3/testsuite/24_iterators/range_generators/iter_deref_return.cc
@@ -0,0 +1,25 @@
+// { dg-do compile { target c++23 } }
+// Copyright (C) 2024 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+#include <generator>
+
+// Check that the return type of iterator::operator* is the reference type.
+// Pre-op* return type fix, this'd have resulted in a op* return type of const
+// bool&.
+
+std::generator<bool, bool>
+foo();
+
+static_assert(std::is_same_v<decltype(*foo().begin()), bool>);
+static_assert(std::is_same_v<typename decltype(foo())::yielded, const bool&>);