]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: fix generator iterator operator* return type
authorArsen Arsenović <arsen@aarsen.me>
Sat, 23 Mar 2024 15:15:25 +0000 (16:15 +0100)
committerArsen Arsenović <arsen@gcc.gnu.org>
Tue, 26 Mar 2024 21:33:48 +0000 (22:33 +0100)
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.

libstdc++-v3/include/std/generator
libstdc++-v3/testsuite/24_iterators/range_generators/iter_deref_return.cc [new file with mode: 0644]

index 2d1dcced1e57310da2cc696e3abf106ddfe9573b..789016b5a883cc8b27c8363280634b26a87c5ae2 100644 (file)
@@ -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 (file)
index 0000000..7547195
--- /dev/null
@@ -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&>);