public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug libstdc++/100290] New: join_view::_Iterator::operator++ copies _M_parent->_M_inner when _S_ref_is_glvalue is false
@ 2021-04-27 12:49 rs2740 at gmail dot com
  2021-04-27 13:20 ` [Bug libstdc++/100290] " hpwxf at haveneer dot com
                   ` (5 more replies)
  0 siblings, 6 replies; 7+ messages in thread
From: rs2740 at gmail dot com @ 2021-04-27 12:49 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100290

            Bug ID: 100290
           Summary: join_view::_Iterator::operator++ copies
                    _M_parent->_M_inner when _S_ref_is_glvalue is false
           Product: gcc
           Version: 11.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libstdc++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: rs2740 at gmail dot com
  Target Milestone: ---

auto&& __inner_range = [this] () -> decltype(auto) {
              if constexpr (_S_ref_is_glvalue)
                return *_M_outer;
              else
                return _M_parent->_M_inner;
            }();

This is a copy in the else case due to decltype(auto) producing the declared
type of _M_inner. The lambda should return auto&&.

^ 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 ` 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

end of thread, other threads:[~2021-05-03 20:10 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
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
2021-05-03 20:10 ` cvs-commit at gcc dot gnu.org
2021-05-03 20:10 ` ppalka at gcc dot gnu.org

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).