public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug libstdc++/99957] New: Ill-formed std::pair construction supported
@ 2021-04-07 12:44 redi at gcc dot gnu.org
  2021-04-07 12:56 ` [Bug libstdc++/99957] " redi at gcc dot gnu.org
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: redi at gcc dot gnu.org @ 2021-04-07 12:44 UTC (permalink / raw)
  To: gcc-bugs

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

            Bug ID: 99957
           Summary: Ill-formed std::pair construction supported
           Product: gcc
           Version: 11.0
            Status: UNCONFIRMED
          Keywords: accepts-invalid
          Severity: minor
          Priority: P3
         Component: libstdc++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: redi at gcc dot gnu.org
  Target Milestone: ---

This shouldn't compile:

#include <utility>

struct move_only
{
    move_only() = default;
    move_only(move_only&&) = default;
};

move_only mo() { return {}; }

std::pair<void*, move_only> p0(0, mo());
std::pair<void*, move_only> p1({}, mo());

According to the standard, these constructors are considered:

  pair(const first_type&, const second_type&);
  template<class U1, class U2> pair(U1&&, U2&&);

For both p0 and p1, the first does not participate in overload resolution
because second_type is not copy constructible.

For p0, the second constructor does not participate because U1 is deduced as
int, and a pointer cannot be constructed from int. For p1, U1 cannot be deduced
from {}.

The code compiles with libstdc++ because we have additional non-standard
constructors, added by PR 40925 and described in
https://gcc.gnu.org/pipermail/libstdc++/2021-April/052299.html (where I
proposed to deprecate these non-standard constructors, and eventually remove
them).

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [Bug libstdc++/99957] Ill-formed std::pair construction supported
  2021-04-07 12:44 [Bug libstdc++/99957] New: Ill-formed std::pair construction supported redi at gcc dot gnu.org
@ 2021-04-07 12:56 ` redi at gcc dot gnu.org
  2021-04-28 16:57 ` cvs-commit at gcc dot gnu.org
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: redi at gcc dot gnu.org @ 2021-04-07 12:56 UTC (permalink / raw)
  To: gcc-bugs

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

Jonathan Wakely <redi at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           See Also|                            |https://gcc.gnu.org/bugzill
                   |                            |a/show_bug.cgi?id=37919
     Ever confirmed|0                           |1
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2021-04-07
   Target Milestone|---                         |12.0

--- Comment #1 from Jonathan Wakely <redi at gcc dot gnu.org> ---
The second commit in PR 40925 comment 8 was submitted to the lists as
https://gcc.gnu.org/legacy-ml/libstdc++/2009-10/msg00142.html and references PR
37919.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [Bug libstdc++/99957] Ill-formed std::pair construction supported
  2021-04-07 12:44 [Bug libstdc++/99957] New: Ill-formed std::pair construction supported redi at gcc dot gnu.org
  2021-04-07 12:56 ` [Bug libstdc++/99957] " redi at gcc dot gnu.org
@ 2021-04-28 16:57 ` cvs-commit at gcc dot gnu.org
  2021-04-28 16:57 ` cvs-commit at gcc dot gnu.org
  2021-04-28 17:01 ` redi at gcc dot gnu.org
  3 siblings, 0 replies; 5+ messages in thread
From: cvs-commit at gcc dot gnu.org @ 2021-04-28 16:57 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #2 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Jonathan Wakely <redi@gcc.gnu.org>:

https://gcc.gnu.org/g:d96db15967e78d7cecea3b1cf3169ceb924678ac

commit r12-220-gd96db15967e78d7cecea3b1cf3169ceb924678ac
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Wed Apr 28 17:46:01 2021 +0100

    libstdc++: Deprecate non-standard std::pair constructors [PR 99957]

    This deprecates the non-standard std::pair constructors that support
    construction from an rvalue and a literal zero used as a null pointer
    constant. We can't just add the deprecated attribute to those
    constructors, because they're currently used by correct code when they
    are a better match than the constructors required by the standard e.g.

      int i = 0;
      const int j = 0;
      std::pair<int, int> p(i, j); // uses pair(U1&&, const int&)

    This patch adjusts the parameter types and constraints of those
    constructors so that they only get used for literal zeros, and the
    pair(U1&&, U2&&) constructor gets used otherwise. Once they're only used
    for initializations that should be ill-formed we can add the deprecated
    attribute.

    The deprecated attribute is used to suggest that the user code uses
    nullptr, which avoids the problem of 0 deducing as int instead of a null
    pointer constant.

    libstdc++-v3/ChangeLog:

            PR libstdc++/99957
            * include/bits/stl_pair.h (_PCC::_MoveCopyPair,
_PCC::_CopyMovePair):
            Combine and replace with ...
            (_PCC::_DeprConsPair): New SFINAE helper function.
            (pair): Merge preprocessor blocks so that all C++03 members
            are defined together at the end.
            (pair::pair(const _T1&, _U2&&), pair::pair(_U1&&, const _T2&)):
            Replace _T1 and _T2 parameters with __null_ptr_constant and
            adjust constraints.
            * testsuite/20_util/pair/40925.cc: Use nullptr instead of 0.
            * testsuite/20_util/pair/cons/explicit_construct.cc: Likewise.
            * testsuite/20_util/pair/cons/99957.cc: New test.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [Bug libstdc++/99957] Ill-formed std::pair construction supported
  2021-04-07 12:44 [Bug libstdc++/99957] New: Ill-formed std::pair construction supported redi at gcc dot gnu.org
  2021-04-07 12:56 ` [Bug libstdc++/99957] " redi at gcc dot gnu.org
  2021-04-28 16:57 ` cvs-commit at gcc dot gnu.org
@ 2021-04-28 16:57 ` cvs-commit at gcc dot gnu.org
  2021-04-28 17:01 ` redi at gcc dot gnu.org
  3 siblings, 0 replies; 5+ messages in thread
From: cvs-commit at gcc dot gnu.org @ 2021-04-28 16:57 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #3 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Jonathan Wakely <redi@gcc.gnu.org>:

https://gcc.gnu.org/g:e1543e694dadf1ea70eb72325219bc0cdc914a35

commit r12-221-ge1543e694dadf1ea70eb72325219bc0cdc914a35
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Wed Apr 28 17:46:01 2021 +0100

    libstdc++: Simplify std::pair constraints using concepts

    This re-implements the constraints on the std::pair constructors and
    assignment operators in C++20 mode, to use concepts.

    The non-standard constructors deprecated for PR 99957 are no longer
    supported in C++20 mode, which requires some minor testsuite changes.
    Otherwise all tests pass in C++20 mode.

    libstdc++-v3/ChangeLog:

            * include/bits/stl_pair.h (pair) [__cplusplus > 202002]: Add
            new definitions for constructors and assignment operators using
            concepts for constraints.
            * testsuite/20_util/pair/cons/99957.cc: Disable for C++20 and
            later.
            * testsuite/20_util/pair/cons/explicit_construct.cc: Adjust
            expected error messages to also match C++20 errors.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [Bug libstdc++/99957] Ill-formed std::pair construction supported
  2021-04-07 12:44 [Bug libstdc++/99957] New: Ill-formed std::pair construction supported redi at gcc dot gnu.org
                   ` (2 preceding siblings ...)
  2021-04-28 16:57 ` cvs-commit at gcc dot gnu.org
@ 2021-04-28 17:01 ` redi at gcc dot gnu.org
  3 siblings, 0 replies; 5+ messages in thread
From: redi at gcc dot gnu.org @ 2021-04-28 17:01 UTC (permalink / raw)
  To: gcc-bugs

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

Jonathan Wakely <redi at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
         Resolution|---                         |FIXED

--- Comment #4 from Jonathan Wakely <redi at gcc dot gnu.org> ---
The non-standard constructors have been deprecated for gcc 12.

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2021-04-28 17:01 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-04-07 12:44 [Bug libstdc++/99957] New: Ill-formed std::pair construction supported redi at gcc dot gnu.org
2021-04-07 12:56 ` [Bug libstdc++/99957] " redi at gcc dot gnu.org
2021-04-28 16:57 ` cvs-commit at gcc dot gnu.org
2021-04-28 16:57 ` cvs-commit at gcc dot gnu.org
2021-04-28 17:01 ` redi 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).