From patchwork Wed Aug 3 21:08:02 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Benjamin Kosnik X-Patchwork-Id: 108321 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id D9CA4B71E3 for ; Thu, 4 Aug 2011 07:08:30 +1000 (EST) Received: (qmail 15622 invoked by alias); 3 Aug 2011 21:08:28 -0000 Received: (qmail 15607 invoked by uid 22791); 3 Aug 2011 21:08:25 -0000 X-SWARE-Spam-Status: No, hits=-6.3 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, SPF_HELO_PASS X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 03 Aug 2011 21:08:04 +0000 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id p73L849k021349 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 3 Aug 2011 17:08:04 -0400 Received: from shotwell (ovpn-113-169.phx2.redhat.com [10.3.113.169]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id p73L82G2004568 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Wed, 3 Aug 2011 17:08:03 -0400 Date: Wed, 3 Aug 2011 14:08:02 -0700 From: Benjamin Kosnik To: gcc-patches@gcc.gnu.org, libstdc++@gcc.gnu.org Subject: [v3] tuple round 2 Message-ID: <20110803140802.2f5f7993@shotwell> Mime-Version: 1.0 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Hey this fixes up the array::at issue as pointed out on this list. In addition, it adds some more tuple markup for constexpr. I'm going to stage in the tuple work, as some of it is more controversial. tested x86/linux -benjamin 2011-08-03 Benjamin Kosnik * include/std/tuple: Mark more constructors constexpr. * testsuite/20_util/tuple/cons/constexpr.cc: Split into and extend as: * testsuite/20_util/tuple/cons/constexpr-2.cc: ...this. * testsuite/20_util/tuple/cons/constexpr-3.cc: ... and this. * testsuite/20_util/weak_ptr/comparison/cmp_neg.cc: Adjust line numbers. 2011-08-03 Benjamin Kosnik François Dumont * testsuite/23_containers/array/at_neg.cc: Move... * testsuite/23_containers/array/at.cc: ...here. Remove -fno-exceptions, call const at member function. Index: include/std/tuple =================================================================== --- include/std/tuple (revision 177290) +++ include/std/tuple (working copy) @@ -114,7 +114,7 @@ template::value>::type> - _Head_base(_UHead&& __h) + constexpr _Head_base(_UHead&& __h) : _Head(std::forward<_UHead>(__h)) { } _Head_base(__uses_alloc0) @@ -140,8 +140,11 @@ _Head_base(__uses_alloc2<_Alloc> __a, _UHead&& __uhead) : _Head(std::forward<_UHead>(__uhead), *__a._M_a) { } - _Head& _M_head() noexcept { return *this; } - const _Head& _M_head() const noexcept { return *this; } + _Head& + _M_head() noexcept { return *this; } + + const _Head& + _M_head() const noexcept { return *this; } }; template @@ -156,7 +159,7 @@ template::value>::type> - _Head_base(_UHead&& __h) + constexpr _Head_base(_UHead&& __h) : _M_head_impl(std::forward<_UHead>(__h)) { } _Head_base(__uses_alloc0) @@ -183,9 +186,12 @@ _Head_base(__uses_alloc2<_Alloc> __a, _UHead&& __uhead) : _M_head_impl(std::forward<_UHead>(__uhead), *__a._M_a) { } - _Head& _M_head() noexcept { return _M_head_impl; } - const _Head& _M_head() const noexcept { return _M_head_impl; } + _Head& + _M_head() noexcept { return _M_head_impl; } + const _Head& + _M_head() const noexcept { return _M_head_impl; } + _Head _M_head_impl; }; @@ -239,12 +245,18 @@ typedef _Tuple_impl<_Idx + 1, _Tail...> _Inherited; typedef _Head_base<_Idx, _Head, std::is_empty<_Head>::value> _Base; - _Head& _M_head() noexcept { return _Base::_M_head(); } - const _Head& _M_head() const noexcept { return _Base::_M_head(); } + _Head& + _M_head() noexcept { return _Base::_M_head(); } - _Inherited& _M_tail() noexcept { return *this; } - const _Inherited& _M_tail() const noexcept { return *this; } + const _Head& + _M_head() const noexcept { return _Base::_M_head(); } + _Inherited& + _M_tail() noexcept { return *this; } + + const _Inherited& + _M_tail() const noexcept { return *this; } + constexpr _Tuple_impl() : _Inherited(), _Base() { } @@ -255,7 +267,7 @@ template::type> explicit - _Tuple_impl(_UHead&& __head, _UTail&&... __tail) + constexpr _Tuple_impl(_UHead&& __head, _UTail&&... __tail) : _Inherited(std::forward<_UTail>(__tail)...), _Base(std::forward<_UHead>(__head)) { } @@ -371,7 +383,7 @@ } }; - /// tuple + /// Primary class template, tuple template class tuple : public _Tuple_impl<0, _Elements...> { @@ -392,10 +404,11 @@ __conv_types<_Elements...>> >::value>::type> explicit - tuple(_UElements&&... __elements) + constexpr tuple(_UElements&&... __elements) : _Inherited(std::forward<_UElements>(__elements)...) { } constexpr tuple(const tuple&) = default; + tuple(tuple&&) = default; template&& __in) : _Inherited(static_cast<_Tuple_impl<0, _UElements...>&&>(__in)) { } - // allocator-extended constructors + // Allocator-extended constructors. template tuple(allocator_arg_t __tag, const _Alloc& __a) @@ -503,6 +516,7 @@ { _Inherited::_M_swap(__in); } }; + // Explicit specialization, zero-element tuple. template<> class tuple<> { @@ -510,7 +524,8 @@ void swap(tuple&) noexcept { /* no-op */ } }; - /// tuple (2-element), with construction and assignment from a pair. + /// Partial specialization, 2-element tuple. + /// Includes construction and assignment from a pair. template class tuple<_T1, _T2> : public _Tuple_impl<0, _T1, _T2> { @@ -528,10 +543,11 @@ enable_if<__and_, is_convertible<_U2, _T2>>::value>::type> explicit - tuple(_U1&& __a1, _U2&& __a2) + constexpr tuple(_U1&& __a1, _U2&& __a2) : _Inherited(std::forward<_U1>(__a1), std::forward<_U2>(__a2)) { } constexpr tuple(const tuple&) = default; + tuple(tuple&&) = default; template, is_convertible>::value>::type> - tuple(const pair<_U1, _U2>& __in) + constexpr tuple(const pair<_U1, _U2>& __in) : _Inherited(__in.first, __in.second) { } template(__in.first), std::forward<_U2>(__in.second)) { } - // allocator-extended constructors + // Allocator-extended constructors. template tuple(allocator_arg_t __tag, const _Alloc& __a) Index: testsuite/23_containers/array/at_neg.cc =================================================================== --- testsuite/23_containers/array/at_neg.cc (revision 177290) +++ testsuite/23_containers/array/at_neg.cc (working copy) @@ -1,28 +0,0 @@ -// { dg-do run { xfail *-*-* } } -// { dg-options "-std=gnu++0x -fno-exceptions" } - -// Copyright (C) 2011 Free Software Foundation, Inc. -// -// This file is part of the GNU ISO C++ Library. This library is free -// software; you can redistribute it and/or modify it under the -// terms of the GNU General Public License as published by the -// Free Software Foundation; either version 3, or (at your option) -// any later version. - -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without Pred the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License along -// with this library; see the file COPYING3. If not see -// . - -#include - -int main() -{ - std::array a{{1, 2, 3}}; - auto i = a.at(4); // expected behavior is to either throw or abort - return 0; -} Index: testsuite/23_containers/array/at.cc =================================================================== --- testsuite/23_containers/array/at.cc (revision 177195) +++ testsuite/23_containers/array/at.cc (working copy) @@ -1,5 +1,5 @@ // { dg-do run { xfail *-*-* } } -// { dg-options "-std=gnu++0x -fno-exceptions" } +// { dg-options "-std=gnu++0x" } // Copyright (C) 2011 Free Software Foundation, Inc. // @@ -22,7 +22,10 @@ int main() { - std::array a{{1, 2, 3}}; - auto i = a.at(4); // expected behavior is to either throw or abort + // Expected behavior is to either throw and have the uncaught + // exception end up in a terminate handler which eventually exits, + // or abort. (Depending on -fno-exceptions.) + constexpr std::array a{{1, 2, 3}}; + auto i = a.at(4); return 0; } Index: testsuite/20_util/tuple/cons/constexpr-2.cc =================================================================== --- testsuite/20_util/tuple/cons/constexpr-2.cc (revision 177195) +++ testsuite/20_util/tuple/cons/constexpr-2.cc (working copy) @@ -1,7 +1,7 @@ // { dg-do compile } // { dg-options "-std=gnu++0x" } -// Copyright (C) 2010 Free Software Foundation, Inc. +// Copyright (C) 2010, 2011 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the @@ -21,27 +21,43 @@ #include #include +#include + +// 2 element tuple int main() { + typedef std::tuple tuple_type; + + // 01: default ctor __gnu_test::constexpr_default_constructible test1; - test1.operator()>(); + test1.operator()(); + // 02: default copy ctor __gnu_test::constexpr_single_value_constructible test2; - test2.operator(), std::tuple>(); - // test2.operator(), std::pair>(); - // test2.operator(), std::tuple>(); - // test2.operator(), std::tuple>(); + test2.operator()(); - // test 3 - const int i1(129); - const int i2(6); - constexpr std::tuple p3(i1, i2); + // 03: element move ctor, single element + const int i1(415); + constexpr tuple_type t2 { 44, std::move(i1) }; - // test 4 - const int i3(415); - const int i4(550); - const int i5(6414); - constexpr std::tuple p4(i1, i2, i3, i4, i5); + // 04: element move ctor, two element + const int i2(510); + const int i3(408); + constexpr tuple_type t4 { std::move(i2), std::move(i3) }; + // 05: value-type conversion constructor + const int i4(650); + const int i5(310); + constexpr tuple_type t8(i4, i5); + + // 06: pair conversion ctor + test2.operator()>(); + test2.operator(), std::pair>(); + test2.operator()>(); + + // 07: different-tuple-type conversion constructor + // test2.operator()>(); + // test2.operator(), tuple_type>(); + return 0; } Index: testsuite/20_util/tuple/cons/constexpr.cc =================================================================== --- testsuite/20_util/tuple/cons/constexpr.cc (revision 177290) +++ testsuite/20_util/tuple/cons/constexpr.cc (working copy) @@ -1,47 +0,0 @@ -// { dg-do compile } -// { dg-options "-std=gnu++0x" } - -// Copyright (C) 2010 Free Software Foundation, Inc. -// -// This file is part of the GNU ISO C++ Library. This library is free -// software; you can redistribute it and/or modify it under the -// terms of the GNU General Public License as published by the -// Free Software Foundation; either version 3, or (at your option) -// any later version. - -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License along -// with this library; see the file COPYING3. If not see -// . - -#include -#include - -int main() -{ - __gnu_test::constexpr_default_constructible test1; - test1.operator()>(); - - __gnu_test::constexpr_single_value_constructible test2; - test2.operator(), std::tuple>(); - // test2.operator(), std::pair>(); - // test2.operator(), std::tuple>(); - // test2.operator(), std::tuple>(); - - // test 3 - const int i1(129); - const int i2(6); - constexpr std::tuple p3(i1, i2); - - // test 4 - const int i3(415); - const int i4(550); - const int i5(6414); - constexpr std::tuple p4(i1, i2, i3, i4, i5); - - return 0; -} Index: testsuite/20_util/tuple/cons/constexpr-3.cc =================================================================== --- testsuite/20_util/tuple/cons/constexpr-3.cc (revision 0) +++ testsuite/20_util/tuple/cons/constexpr-3.cc (revision 0) @@ -0,0 +1,60 @@ +// { dg-do compile } +// { dg-options "-std=gnu++0x" } + +// Copyright (C) 2011 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +#include +#include + +#include + +// 3 element tuple +int main() +{ + typedef std::tuple tuple_type; + + // 01: default ctor + __gnu_test::constexpr_default_constructible test1; + test1.operator()(); + + // 02: default copy ctor + __gnu_test::constexpr_single_value_constructible test2; + test2.operator()(); + + // 03: element move ctor, single element + const int i1(415); + constexpr tuple_type t2 { 44, 55, std::move(i1) }; + + // 04: element move ctor, three element + const int i2(510); + const int i3(408); + const int i4(650); + constexpr tuple_type t4 { std::move(i2), std::move(i3), std::move(i4) }; + + // 05: value-type conversion constructor + const int i5(310); + const int i6(310); + const int i7(310); + constexpr tuple_type t8(i5, i6, i7); + + // 06: different-tuple-type conversion constructor + // test2.operator()>(); + // test2.operator(), tuple_type>(); + + return 0; +} Index: testsuite/20_util/weak_ptr/comparison/cmp_neg.cc =================================================================== --- testsuite/20_util/weak_ptr/comparison/cmp_neg.cc (revision 177290) +++ testsuite/20_util/weak_ptr/comparison/cmp_neg.cc (working copy) @@ -51,7 +51,7 @@ // { dg-warning "note" "" { target *-*-* } 485 } // { dg-warning "note" "" { target *-*-* } 479 } // { dg-warning "note" "" { target *-*-* } 468 } -// { dg-warning "note" "" { target *-*-* } 813 } +// { dg-warning "note" "" { target *-*-* } 829 } // { dg-warning "note" "" { target *-*-* } 1055 } // { dg-warning "note" "" { target *-*-* } 1049 } // { dg-warning "note" "" { target *-*-* } 341 }