Patchwork [v3] tuple round 2

login
register
mail settings
Submitter Benjamin Kosnik
Date Aug. 3, 2011, 9:08 p.m.
Message ID <20110803140802.2f5f7993@shotwell>
Download mbox | patch
Permalink /patch/108321/
State New
Headers show

Comments

Benjamin Kosnik - Aug. 3, 2011, 9:08 p.m.
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
Benjamin Kosnik - Sept. 8, 2011, 1:31 a.m.
> 2011-08-03  Benjamin Kosnik  <bkoz@redhat.com>
> 	    Fran├žois Dumont  <francois.cppdevs@free.fr>
> 
> 	* testsuite/23_containers/array/at_neg.cc: Move...
> 	* testsuite/23_containers/array/at.cc: ...here. Remove
> 	-fno-exceptions, call const at member function.

I've reverted the name change.

-benjamin

Patch

2011-08-03  Benjamin Kosnik  <bkoz@redhat.com>

	* 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  <bkoz@redhat.com>
	    Fran├žois Dumont  <francois.cppdevs@free.fr>

	* 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<typename _UHead, typename = typename
 	       enable_if<!is_convertible<_UHead,
 	                                 __uses_alloc_base>::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<std::size_t _Idx, typename _Head>
@@ -156,7 +159,7 @@ 
       template<typename _UHead, typename = typename
 	       enable_if<!is_convertible<_UHead,
 	                                 __uses_alloc_base>::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<typename _UHead, typename... _UTail, typename = typename
                enable_if<sizeof...(_Tail) == sizeof...(_UTail)>::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<typename... _Elements> 
     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<typename... _UElements, typename = typename
@@ -417,7 +430,7 @@ 
         tuple(tuple<_UElements...>&& __in)
         : _Inherited(static_cast<_Tuple_impl<0, _UElements...>&&>(__in)) { }
 
-      // allocator-extended constructors
+      // Allocator-extended constructors.
 
       template<typename _Alloc>
 	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<typename _T1, typename _T2>
     class tuple<_T1, _T2> : public _Tuple_impl<0, _T1, _T2>
     {
@@ -528,10 +543,11 @@ 
 	       enable_if<__and_<is_convertible<_U1, _T1>,
 				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<typename _U1, typename _U2, typename = typename
@@ -549,7 +565,7 @@ 
       template<typename _U1, typename _U2, typename = typename
 	enable_if<__and_<is_convertible<const _U1&, _T1>,
 			 is_convertible<const _U2&, _T2>>::value>::type>
-        tuple(const pair<_U1, _U2>& __in)
+        constexpr tuple(const pair<_U1, _U2>& __in)
 	: _Inherited(__in.first, __in.second) { }
 
       template<typename _U1, typename _U2, typename = typename
@@ -559,7 +575,7 @@ 
 	: _Inherited(std::forward<_U1>(__in.first),
 		     std::forward<_U2>(__in.second)) { }
 
-      // allocator-extended constructors
+      // Allocator-extended constructors.
 
       template<typename _Alloc>
 	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
-// <http://www.gnu.org/licenses/>.
-
-#include <array>
-
-int main()
-{
-  std::array<int, 3> 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<int, 3> 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<int, 3> 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 <memory>
 #include <testsuite_common_types.h>
 
+#include <iostream>
+
+// 2 element tuple
 int main()
 {
+  typedef std::tuple<int, int> tuple_type;
+
+  // 01: default ctor
   __gnu_test::constexpr_default_constructible test1;
-  test1.operator()<std::tuple<int, int>>();
+  test1.operator()<tuple_type>();
 
+  // 02: default copy ctor
   __gnu_test::constexpr_single_value_constructible test2;
-  test2.operator()<std::tuple<int, int>, std::tuple<int, int>>();
-  //  test2.operator()<std::tuple<int, int>, std::pair<short, short>>();
-  //  test2.operator()<std::tuple<int>, std::tuple<short>>();
-  //  test2.operator()<std::tuple<int, int>, std::tuple<short, short>>();
+  test2.operator()<tuple_type, tuple_type>();
 
-  // test 3
-  const int i1(129);
-  const int i2(6);
-  constexpr std::tuple<int, int> 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<int, int, int, int, int> 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()<tuple_type, std::pair<int, int>>();
+  test2.operator()<std::tuple<short, short>, std::pair<int, int>>();
+  test2.operator()<tuple_type, std::pair<short, short>>();
+
+  // 07: different-tuple-type conversion constructor
+  // test2.operator()<tuple_type, std::tuple<short, short>>();
+  // test2.operator()<std::tuple<short, short>, 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
-// <http://www.gnu.org/licenses/>.
-
-#include <memory>
-#include <testsuite_common_types.h>
-
-int main()
-{
-  __gnu_test::constexpr_default_constructible test1;
-  test1.operator()<std::tuple<int, int>>();
-
-  __gnu_test::constexpr_single_value_constructible test2;
-  test2.operator()<std::tuple<int, int>, std::tuple<int, int>>();
-  //  test2.operator()<std::tuple<int, int>, std::pair<short, short>>();
-  //  test2.operator()<std::tuple<int>, std::tuple<short>>();
-  //  test2.operator()<std::tuple<int, int>, std::tuple<short, short>>();
-
-  // test 3
-  const int i1(129);
-  const int i2(6);
-  constexpr std::tuple<int, int> p3(i1, i2);
-
-  // test 4
-  const int i3(415);
-  const int i4(550);
-  const int i5(6414);
-  constexpr std::tuple<int, int, int, int, int> 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
+// <http://www.gnu.org/licenses/>.
+
+#include <memory>
+#include <testsuite_common_types.h>
+
+#include <iostream>
+
+// 3 element tuple
+int main()
+{
+  typedef std::tuple<int, int, int> tuple_type;
+
+  // 01: default ctor
+  __gnu_test::constexpr_default_constructible test1;
+  test1.operator()<tuple_type>();
+
+  // 02: default copy ctor
+  __gnu_test::constexpr_single_value_constructible test2;
+  test2.operator()<tuple_type, tuple_type>();
+
+  // 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()<tuple_type, std::tuple<short, short, short>>();
+  // test2.operator()<std::tuple<short, short, short>, 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 }