* [Bug libstdc++/100290] join_view::_Iterator::operator++ copies _M_parent->_M_inner when _S_ref_is_glvalue is false
2021-04-27 12:49 [Bug libstdc++/100290] New: join_view::_Iterator::operator++ copies _M_parent->_M_inner when _S_ref_is_glvalue is false rs2740 at gmail dot com
@ 2021-04-27 13:20 ` hpwxf at haveneer dot com
2021-04-27 13:37 ` ppalka at gcc dot gnu.org
` (4 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: hpwxf at haveneer dot com @ 2021-04-27 13:20 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100290
--- Comment #1 from Pascal HAVÉ <hpwxf at haveneer dot com> ---
Created attachment 50688
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=50688&action=edit
Minimal reproducer with an assertion
Minimal reproducer to show the abnormal behavior.
The assertion
assert(std::ranges::next(v.begin()) == v.end());
and fails and should be OK.
Any range-based for loop on it will go to an infinite loop.
^ permalink raw reply [flat|nested] 7+ messages in thread
* [Bug libstdc++/100290] join_view::_Iterator::operator++ copies _M_parent->_M_inner when _S_ref_is_glvalue is false
2021-04-27 12:49 [Bug libstdc++/100290] New: join_view::_Iterator::operator++ copies _M_parent->_M_inner when _S_ref_is_glvalue is false rs2740 at gmail dot com
2021-04-27 13:20 ` [Bug libstdc++/100290] " hpwxf at haveneer dot com
@ 2021-04-27 13:37 ` ppalka at gcc dot gnu.org
2021-04-27 18:08 ` cvs-commit at gcc dot gnu.org
` (3 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: ppalka at gcc dot gnu.org @ 2021-04-27 13:37 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100290
Patrick Palka <ppalka at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Ever confirmed|0 |1
Last reconfirmed| |2021-04-27
CC| |ppalka at gcc dot gnu.org
Target Milestone|--- |10.4
Assignee|unassigned at gcc dot gnu.org |ppalka at gcc dot gnu.org
Status|UNCONFIRMED |ASSIGNED
--- Comment #2 from Patrick Palka <ppalka at gcc dot gnu.org> ---
Confirmed. The bug is present in the 10 branch, too.
^ permalink raw reply [flat|nested] 7+ messages in thread
* [Bug libstdc++/100290] join_view::_Iterator::operator++ copies _M_parent->_M_inner when _S_ref_is_glvalue is false
2021-04-27 12:49 [Bug libstdc++/100290] New: join_view::_Iterator::operator++ copies _M_parent->_M_inner when _S_ref_is_glvalue is false rs2740 at gmail dot com
2021-04-27 13:20 ` [Bug libstdc++/100290] " hpwxf at haveneer dot com
2021-04-27 13:37 ` ppalka at gcc dot gnu.org
@ 2021-04-27 18:08 ` cvs-commit at gcc dot gnu.org
2021-04-27 21:24 ` cvs-commit at gcc dot gnu.org
` (2 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: cvs-commit at gcc dot gnu.org @ 2021-04-27 18:08 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100290
--- Comment #3 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Patrick Palka <ppalka@gcc.gnu.org>:
https://gcc.gnu.org/g:85ef4b8d4eb3313a48b79c7e752891f9646bb246
commit r12-173-g85ef4b8d4eb3313a48b79c7e752891f9646bb246
Author: Patrick Palka <ppalka@redhat.com>
Date: Tue Apr 27 14:07:46 2021 -0400
libstdc++: Fix up lambda in join_view::_Iterator::operator++ [PR100290]
Currently, the return type of this lambda is decltype(auto), so the
lambda ends up returning a copy of _M_parent->_M_inner rather than a
reference to it when _S_ref_glvalue is false. This means _M_inner and
ranges::end(__inner_range) are respectively an iterator and sentinel for
different ranges, so comparing them is undefined.
libstdc++-v3/ChangeLog:
PR libstdc++/100290
* include/std/ranges (join_view::_Iterator::operator++): Correct
the return type of the lambda to avoid returning a copy of
_M_parent->_M_inner.
* testsuite/std/ranges/adaptors/join.cc (test10): New test.
^ permalink raw reply [flat|nested] 7+ messages in thread
* [Bug libstdc++/100290] join_view::_Iterator::operator++ copies _M_parent->_M_inner when _S_ref_is_glvalue is false
2021-04-27 12:49 [Bug libstdc++/100290] New: join_view::_Iterator::operator++ copies _M_parent->_M_inner when _S_ref_is_glvalue is false rs2740 at gmail dot com
` (2 preceding siblings ...)
2021-04-27 18:08 ` cvs-commit at gcc dot gnu.org
@ 2021-04-27 21:24 ` cvs-commit at gcc dot gnu.org
2021-05-03 20:10 ` cvs-commit at gcc dot gnu.org
2021-05-03 20:10 ` ppalka at gcc dot gnu.org
5 siblings, 0 replies; 7+ messages in thread
From: cvs-commit at gcc dot gnu.org @ 2021-04-27 21:24 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100290
--- Comment #4 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-11 branch has been updated by Patrick Palka
<ppalka@gcc.gnu.org>:
https://gcc.gnu.org/g:c6a94ee07e378632c4fcea2eead30a18ce15a6c3
commit r11-8310-gc6a94ee07e378632c4fcea2eead30a18ce15a6c3
Author: Patrick Palka <ppalka@redhat.com>
Date: Tue Apr 27 14:07:46 2021 -0400
libstdc++: Fix up lambda in join_view::_Iterator::operator++ [PR100290]
Currently, the return type of this lambda is decltype(auto), so the
lambda ends up returning a copy of _M_parent->_M_inner rather than a
reference to it when _S_ref_glvalue is false. This means _M_inner and
ranges::end(__inner_range) are respectively an iterator and sentinel for
different ranges, so comparing them is undefined.
libstdc++-v3/ChangeLog:
PR libstdc++/100290
* include/std/ranges (join_view::_Iterator::operator++): Correct
the return type of the lambda to avoid returning a copy of
_M_parent->_M_inner.
* testsuite/std/ranges/adaptors/join.cc (test10): New test.
(cherry picked from commit 85ef4b8d4eb3313a48b79c7e752891f9646bb246)
^ permalink raw reply [flat|nested] 7+ messages in thread
* [Bug libstdc++/100290] join_view::_Iterator::operator++ copies _M_parent->_M_inner when _S_ref_is_glvalue is false
2021-04-27 12:49 [Bug libstdc++/100290] New: join_view::_Iterator::operator++ copies _M_parent->_M_inner when _S_ref_is_glvalue is false rs2740 at gmail dot com
` (3 preceding siblings ...)
2021-04-27 21:24 ` cvs-commit at gcc dot gnu.org
@ 2021-05-03 20:10 ` cvs-commit at gcc dot gnu.org
2021-05-03 20:10 ` ppalka at gcc dot gnu.org
5 siblings, 0 replies; 7+ messages in thread
From: cvs-commit at gcc dot gnu.org @ 2021-05-03 20:10 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100290
--- Comment #5 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-10 branch has been updated by Patrick Palka
<ppalka@gcc.gnu.org>:
https://gcc.gnu.org/g:b81834eaf85d5c4e0df8e4fc2307cbdd083dea6c
commit r10-9789-gb81834eaf85d5c4e0df8e4fc2307cbdd083dea6c
Author: Patrick Palka <ppalka@redhat.com>
Date: Tue Apr 27 14:07:46 2021 -0400
libstdc++: Fix up lambda in join_view::_Iterator::operator++ [PR100290]
Currently, the return type of this lambda is decltype(auto), so the
lambda ends up returning a copy of _M_parent->_M_inner rather than a
reference to it when _S_ref_glvalue is false. This means _M_inner and
ranges::end(__inner_range) are respectively an iterator and sentinel for
different ranges, so comparing them is undefined.
libstdc++-v3/ChangeLog:
PR libstdc++/100290
* include/std/ranges (join_view::_Iterator::operator++): Correct
the return type of the lambda to avoid returning a copy of
_M_parent->_M_inner.
* testsuite/std/ranges/adaptors/join.cc (test10): New test.
(cherry picked from commit 85ef4b8d4eb3313a48b79c7e752891f9646bb246)
^ permalink raw reply [flat|nested] 7+ messages in thread
* [Bug libstdc++/100290] join_view::_Iterator::operator++ copies _M_parent->_M_inner when _S_ref_is_glvalue is false
2021-04-27 12:49 [Bug libstdc++/100290] New: join_view::_Iterator::operator++ copies _M_parent->_M_inner when _S_ref_is_glvalue is false rs2740 at gmail dot com
` (4 preceding siblings ...)
2021-05-03 20:10 ` cvs-commit at gcc dot gnu.org
@ 2021-05-03 20:10 ` ppalka at gcc dot gnu.org
5 siblings, 0 replies; 7+ messages in thread
From: ppalka at gcc dot gnu.org @ 2021-05-03 20:10 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100290
Patrick Palka <ppalka at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Resolution|--- |FIXED
Status|ASSIGNED |RESOLVED
--- Comment #6 from Patrick Palka <ppalka at gcc dot gnu.org> ---
Fixed.
^ permalink raw reply [flat|nested] 7+ messages in thread