From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 52002 invoked by alias); 13 Jun 2015 18:05:30 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 51974 invoked by uid 89); 13 Jun 2015 18:05:29 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=3.7 required=5.0 tests=AWL,BAYES_00,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,SPF_PASS,ZIP_ATTACHED autolearn=no version=3.3.2 X-Spam-User: qpsmtpd, 2 recipients X-HELO: mail-ig0-f182.google.com Received: from mail-ig0-f182.google.com (HELO mail-ig0-f182.google.com) (209.85.213.182) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Sat, 13 Jun 2015 18:05:28 +0000 Received: by igbzc4 with SMTP id zc4so30178328igb.0; Sat, 13 Jun 2015 11:05:26 -0700 (PDT) MIME-Version: 1.0 X-Received: by 10.50.143.99 with SMTP id sd3mr11420779igb.23.1434218726389; Sat, 13 Jun 2015 11:05:26 -0700 (PDT) Received: by 10.36.152.8 with HTTP; Sat, 13 Jun 2015 11:05:26 -0700 (PDT) In-Reply-To: References: <5575B6AF.60804@redhat.com> Date: Sun, 14 Jun 2015 07:07:00 -0000 Message-ID: Subject: Re: [v3 PATCH] Implement N4387 and LWG 2367 From: Ville Voutilainen To: "gcc-patches@gcc.gnu.org" , libstdc++@gcc.gnu.org Content-Type: multipart/mixed; boundary=001a11349d4ab7f18b05186a112f X-SW-Source: 2015-06/txt/msg00970.txt.bz2 --001a11349d4ab7f18b05186a112f Content-Type: text/plain; charset=UTF-8 Content-length: 3424 On 8 June 2015 at 19:01, Ville Voutilainen wrote: >> Yes, it should be uglified, thanks. > Ahem, yes, actually removed since it's there only to be specialized. Another round! The new patch - makes sure not to change non-deduced parameters to deduced ones, and adds tests for that. - removes the name of the bool non-type template parameter for the 'concepts'. - introduces shortcuts for making the use of the 'concepts' more readable. - changes library tag types into non-default-constructible ones. Without this, we can run into an ambiguity between the constructor template that takes (const _T1&, const _T2&) and the one that takes (allocator_arg_t, Alloc), when the call site calls it with ({}, somethingelse). We could avoid that by just not doing that in the library (experimental string searchers do that), but it's just daft to allow default-constructing a library tag type. I have filed an LWG issue to fix all tag types, but this patch doesn't yet touch nothrow_t and optional's in_place_t. I expect to submit follow-up patches for that. Tested on Linux-PPC64. 2015-06-13 Ville Voutilainen Implement N4387, "improving pair and tuple" and LWG 2367, "pair and tuple are not correctly implemented for is_constructible with no args". Also make the standard tag types non-default-constructible. std::nothrow_t not taken care of yet in that regard, nor std::experimental::optional's in_place_t. * include/bits/stl_pair.h (piecewise_construct_t, piecewise_construct): Make non-default-constructible and adjust. * include/bits/stl_pair.h (_ConstructiblePair, _ImplicitlyConvertiblePair, _MoveConstructiblePair, _ImplicitlyMoveConvertiblePair): New. * include/bits/stl_pair.h (pair()): Constrain it. * include/bits/stl_pair.h (pair(const _T1&, const _T2&), pair(const pair<_U1, _U2>&), pair(_U1&&, const _T2&), pair(const _T1&, _U2&&), pair(_U1&&, _U2&&), pair(pair<_U1, _U2>&&)): Make conditionally explicit. * include/bits/uses_allocator.h (allocator_arg_t, allocator_arg): Make non-default-constructible and adjust. * include/std/mutex (defer_lock_t, defer_lock, try_to_lock_t, try_to_lock, adopt_lock_t, adopt_lock): Make non-default-constructible and adjust. * include/std/tuple (_TC, tuple::_TC2, tuple::TCC, tuple::TMC): New. * include/std/tuple (tuple()): Constrain it. * include/std/tuple (tuple(const _UElements&...), tuple(_UElements&&...), tuple(const tuple<_UElements...>&), tuple(tuple<_UElements...>&&), tuple(allocator_arg_t, const _Alloc&, const _UElements&...), tuple(allocator_arg_t, const _Alloc&, _UElements&&...), tuple(allocator_arg_t, const _Alloc&, const tuple<_UElements...>&), tuple(allocator_arg_t, const _Alloc&, tuple<_UElements...>&&), tuple(const pair<_U1, _U2>&), tuple(pair<_U1, _U2>&&), tuple(allocator_arg_t, const _Alloc&, const pair<_U1, _U2>&), tuple(allocator_arg_t, const _Alloc&, pair<_U1, _U2>&&)): Make conditionally explicit. * src/c++11/compatibility-thread-c++0x.cc: Adjust. * testsuite/20_util/pair/cons/explicit_construct.cc: New. * estsuite/20_util/pair/piecewise.cc: Adjust. * testsuite/20_util/pair/requirements/dr2367.cc: New. * testsuite/20_util/tuple/cons/explicit_construct.cc: New. * testsuite/20_util/tuple/requirements/dr2367.cc: New. --001a11349d4ab7f18b05186a112f Content-Type: application/x-gzip; name="conditional-explicit4.diff.gz" Content-Disposition: attachment; filename="conditional-explicit4.diff.gz" Content-Transfer-Encoding: base64 X-Attachment-Id: f_iavcs9510 Content-length: 9338 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 AAA= --001a11349d4ab7f18b05186a112f--