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).