From 241361d8650b580e69b2394086f3161a016e6486 Mon Sep 17 00:00:00 2001 From: bkoz Date: Wed, 7 Sep 2011 00:17:09 +0000 Subject: [PATCH] 2011-09-06 Benjamin Kosnik * include/std/tuple (_Tuple_impl::_M_head, _M_tail): Mark constexpr. (tuple(tuple&&)): Same. (tuple(const tuple<_UElements...>& __in)): Same. (tuple(tuple<_UElements...>&& __in)): Same. (tuple_cat(const tuple<_TElements...>&, const tuple<_UElements...>&)): Same. (get): Same. * include/std/array: Consolidate array::data usage. * testsuite/23_containers/array/requirements/constexpr_functions.cc: Remove extra include. * testsuite/20_util/tuple/creation_functions/constexpr.cc: New. * testsuite/20_util/tuple/cons/constexpr-2.cc: Add tests. * testsuite/20_util/tuple/cons/constexpr-3.cc: Same. * testsuite/20_util/weak_ptr/comparison/cmp_neg.cc: Adjust line numbers. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@178620 138bc75d-0d04-0410-961f-82ee72b054a4 --- libstdc++-v3/ChangeLog | 17 ++++ libstdc++-v3/include/std/array | 16 ++-- libstdc++-v3/include/std/tuple | 54 ++++++------- .../testsuite/20_util/tuple/cons/constexpr-2.cc | 4 +- .../testsuite/20_util/tuple/cons/constexpr-3.cc | 4 +- .../20_util/tuple/creation_functions/constexpr.cc | 90 ++++++++++++++++++++++ .../20_util/weak_ptr/comparison/cmp_neg.cc | 2 +- .../array/requirements/constexpr_functions.cc | 3 +- 8 files changed, 148 insertions(+), 42 deletions(-) create mode 100644 libstdc++-v3/testsuite/20_util/tuple/creation_functions/constexpr.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 6c85ef7..7c57a51 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,20 @@ +2011-09-06 Benjamin Kosnik + + * include/std/tuple (_Tuple_impl::_M_head, _M_tail): Mark constexpr. + (tuple(tuple&&)): Same. + (tuple(const tuple<_UElements...>& __in)): Same. + (tuple(tuple<_UElements...>&& __in)): Same. + (tuple_cat(const tuple<_TElements...>&, const tuple<_UElements...>&)): + Same. + (get): Same. + * include/std/array: Consolidate array::data usage. + * testsuite/23_containers/array/requirements/constexpr_functions.cc: + Remove extra include. + * testsuite/20_util/tuple/creation_functions/constexpr.cc: New. + * testsuite/20_util/tuple/cons/constexpr-2.cc: Add tests. + * testsuite/20_util/tuple/cons/constexpr-3.cc: Same. + * testsuite/20_util/weak_ptr/comparison/cmp_neg.cc: Adjust line numbers. + 2011-09-06 François Dumont Paolo Carlini diff --git a/libstdc++-v3/include/std/array b/libstdc++-v3/include/std/array index 39573be..4d6b688 100644 --- a/libstdc++-v3/include/std/array +++ b/libstdc++-v3/include/std/array @@ -61,8 +61,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION struct array { typedef _Tp value_type; - typedef _Tp* pointer; - typedef const _Tp* const_pointer; + typedef value_type* pointer; + typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; typedef value_type* iterator; @@ -90,19 +90,19 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // Iterators. iterator begin() noexcept - { return iterator(std::__addressof(_M_instance[0])); } + { return iterator(data()); } const_iterator begin() const noexcept - { return const_iterator(std::__addressof(_M_instance[0])); } + { return const_iterator(data()); } iterator end() noexcept - { return iterator(std::__addressof(_M_instance[_Nm])); } + { return iterator(data() + _Nm); } const_iterator end() const noexcept - { return const_iterator(std::__addressof(_M_instance[_Nm])); } + { return const_iterator(data() + _Nm); } reverse_iterator rbegin() noexcept @@ -195,11 +195,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION back() const { return _Nm ? *(end() - 1) : *end(); } - _Tp* + pointer data() noexcept { return std::__addressof(_M_instance[0]); } - const _Tp* + const_pointer data() const noexcept { return std::__addressof(_M_instance[0]); } }; diff --git a/libstdc++-v3/include/std/tuple b/libstdc++-v3/include/std/tuple index 1636552..f68766f 100644 --- a/libstdc++-v3/include/std/tuple +++ b/libstdc++-v3/include/std/tuple @@ -143,7 +143,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _Head& _M_head() noexcept { return *this; } - const _Head& + constexpr const _Head& _M_head() const noexcept { return *this; } }; @@ -189,7 +189,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _Head& _M_head() noexcept { return _M_head_impl; } - const _Head& + constexpr const _Head& _M_head() const noexcept { return _M_head_impl; } _Head _M_head_impl; @@ -248,13 +248,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _Head& _M_head() noexcept { return _Base::_M_head(); } - const _Head& + constexpr const _Head& _M_head() const noexcept { return _Base::_M_head(); } _Inherited& _M_tail() noexcept { return *this; } - const _Inherited& + constexpr const _Inherited& _M_tail() const noexcept { return *this; } constexpr _Tuple_impl() @@ -280,7 +280,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _Base(std::forward<_Head>(__in._M_head())) { } template - _Tuple_impl(const _Tuple_impl<_Idx, _UElements...>& __in) + constexpr _Tuple_impl(const _Tuple_impl<_Idx, _UElements...>& __in) : _Inherited(__in._M_tail()), _Base(__in._M_head()) { } template @@ -409,7 +409,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION constexpr tuple(const tuple&) = default; - tuple(tuple&&) = default; + constexpr tuple(tuple&&) = default; template, __conv_types<_Elements...>> >::value>::type> - tuple(const tuple<_UElements...>& __in) + constexpr tuple(const tuple<_UElements...>& __in) : _Inherited(static_cast&>(__in)) { } @@ -427,7 +427,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __all_convertible<__conv_types<_UElements...>, __conv_types<_Elements...>> >::value>::type> - tuple(tuple<_UElements...>&& __in) + constexpr tuple(tuple<_UElements...>&& __in) : _Inherited(static_cast<_Tuple_impl<0, _UElements...>&&>(__in)) { } // Allocator-extended constructors. @@ -548,18 +548,18 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION constexpr tuple(const tuple&) = default; - tuple(tuple&&) = default; + constexpr tuple(tuple&&) = default; template, is_convertible>::value>::type> - tuple(const tuple<_U1, _U2>& __in) + constexpr tuple(const tuple<_U1, _U2>& __in) : _Inherited(static_cast&>(__in)) { } template, is_convertible<_U2, _T2>>::value>::type> - tuple(tuple<_U1, _U2>&& __in) + constexpr tuple(tuple<_U1, _U2>&& __in) : _Inherited(static_cast<_Tuple_impl<0, _U1, _U2>&&>(__in)) { } template, is_convertible<_U2, _T2>>::value>::type> - tuple(pair<_U1, _U2>&& __in) + constexpr tuple(pair<_U1, _U2>&& __in) : _Inherited(std::forward<_U1>(__in.first), std::forward<_U2>(__in.second)) { } @@ -752,7 +752,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { return __t._M_head(); } template - inline typename __add_c_ref<_Head>::type + inline constexpr typename __add_c_ref<_Head>::type __get_helper(const _Tuple_impl<__i, _Head, _Tail...>& __t) noexcept { return __t._M_head(); } @@ -767,7 +767,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { return __get_helper<__i>(__t); } template - inline typename __add_c_ref< + inline constexpr typename __add_c_ref< typename tuple_element<__i, tuple<_Elements...>>::type >::type get(const tuple<_Elements...>& __t) noexcept @@ -789,13 +789,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template struct __tuple_compare<0, __i, __j, _Tp, _Up> { - static bool __eq(const _Tp& __t, const _Up& __u) + static bool + __eq(const _Tp& __t, const _Up& __u) { return (get<__i>(__t) == get<__i>(__u) && __tuple_compare<0, __i + 1, __j, _Tp, _Up>::__eq(__t, __u)); } - static bool __less(const _Tp& __t, const _Up& __u) + static bool + __less(const _Tp& __t, const _Up& __u) { return ((get<__i>(__t) < get<__i>(__u)) || !(get<__i>(__u) < get<__i>(__t)) && @@ -806,11 +808,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template struct __tuple_compare<0, __i, __i, _Tp, _Up> { - static bool __eq(const _Tp&, const _Up&) - { return true; } + static bool + __eq(const _Tp&, const _Up&) { return true; } - static bool __less(const _Tp&, const _Up&) - { return false; } + static bool + __less(const _Tp&, const _Up&) { return false; } }; template @@ -899,7 +901,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template - inline tuple<_TElements..., _UElements...> + inline constexpr tuple<_TElements..., _UElements...> __tuple_cat_helper(const tuple<_TElements...>& __t, const __index_holder<_TIdx...>&, const tuple<_UElements...>& __u, @@ -939,7 +941,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION std::forward<_UElements>(get<_UIdx>(__u))...); } template - inline tuple<_TElements..., _UElements...> + inline constexpr tuple<_TElements..., _UElements...> tuple_cat(const tuple<_TElements...>& __t, const tuple<_UElements...>& __u) { return __tuple_cat_helper(__t, typename @@ -1032,8 +1034,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template template inline _Tp - pair<_T1, _T2>:: - __cons(tuple<_Args...>&& __tuple) + pair<_T1, _T2>::__cons(tuple<_Args...>&& __tuple) { typedef typename _Build_index_tuple::__type _Indexes; @@ -1043,9 +1044,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template template inline _Tp - pair<_T1, _T2>:: - __do_cons(tuple<_Args...>&& __tuple, - const _Index_tuple<_Indexes...>&) + pair<_T1, _T2>::__do_cons(tuple<_Args...>&& __tuple, + const _Index_tuple<_Indexes...>&) { return _Tp(std::forward<_Args>(get<_Indexes>(__tuple))...); } _GLIBCXX_END_NAMESPACE_VERSION diff --git a/libstdc++-v3/testsuite/20_util/tuple/cons/constexpr-2.cc b/libstdc++-v3/testsuite/20_util/tuple/cons/constexpr-2.cc index 14577b0..749c0b4 100644 --- a/libstdc++-v3/testsuite/20_util/tuple/cons/constexpr-2.cc +++ b/libstdc++-v3/testsuite/20_util/tuple/cons/constexpr-2.cc @@ -56,8 +56,8 @@ int main() test2.operator()>(); // 07: different-tuple-type conversion constructor - // test2.operator()>(); - // test2.operator(), tuple_type>(); + test2.operator()>(); + test2.operator(), tuple_type>(); return 0; } diff --git a/libstdc++-v3/testsuite/20_util/tuple/cons/constexpr-3.cc b/libstdc++-v3/testsuite/20_util/tuple/cons/constexpr-3.cc index 7f8b2f9..7efc9f4 100644 --- a/libstdc++-v3/testsuite/20_util/tuple/cons/constexpr-3.cc +++ b/libstdc++-v3/testsuite/20_util/tuple/cons/constexpr-3.cc @@ -53,8 +53,8 @@ int main() constexpr tuple_type t8(i5, i6, i7); // 06: different-tuple-type conversion constructor - // test2.operator()>(); - // test2.operator(), tuple_type>(); + test2.operator()>(); + test2.operator(), tuple_type>(); return 0; } diff --git a/libstdc++-v3/testsuite/20_util/tuple/creation_functions/constexpr.cc b/libstdc++-v3/testsuite/20_util/tuple/creation_functions/constexpr.cc new file mode 100644 index 0000000..a5b5441 --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/tuple/creation_functions/constexpr.cc @@ -0,0 +1,90 @@ +// { 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 +// . + + +// NOTE: This makes use of the fact that we know how moveable +// is implemented on pair, and also vector. If the implementation +// changes this test may begin to fail. + +#include + +bool test __attribute__((unused)) = true; + + +// make_tuple +#if 0 +void +test_make_tuple() +{ + { + typedef std::tuple tuple_type; + constexpr tuple_type p1 = std::make_tuple(22, 22.222); + } + + { + typedef std::tuple tuple_type; + constexpr tuple_type p1 = std::make_tuple(22, 22.222, 77799); + } +} +#endif + +// get +void +test_get() +{ + { + typedef std::tuple tuple_type; + constexpr tuple_type t1 { 55, 77.77 }; + constexpr auto var = std::get<1>(t1); + } + + { + typedef std::tuple tuple_type; + constexpr tuple_type t1 { 55, 77.77, 99 }; + constexpr auto var = std::get<2>(t1); + } +} + +// tuple_cat +void +test_tuple_cat() +{ + typedef std::tuple tuple_type1; + typedef std::tuple tuple_type2; + + constexpr tuple_type1 t1 { 55, 77.77 }; + constexpr tuple_type2 t2 { 55, 99, 77.77 }; + constexpr auto cat1 = std::tuple_cat(t1, t2); +} + + +int +main() +{ +#if 0 + test_make_tuple(); +#endif + + test_get(); + + test_tuple_cat(); + + return 0; +} diff --git a/libstdc++-v3/testsuite/20_util/weak_ptr/comparison/cmp_neg.cc b/libstdc++-v3/testsuite/20_util/weak_ptr/comparison/cmp_neg.cc index d007c5a..001c57a 100644 --- a/libstdc++-v3/testsuite/20_util/weak_ptr/comparison/cmp_neg.cc +++ b/libstdc++-v3/testsuite/20_util/weak_ptr/comparison/cmp_neg.cc @@ -51,7 +51,7 @@ main() // { dg-warning "note" "" { target *-*-* } 485 } // { dg-warning "note" "" { target *-*-* } 479 } // { dg-warning "note" "" { target *-*-* } 468 } -// { dg-warning "note" "" { target *-*-* } 829 } +// { dg-warning "note" "" { target *-*-* } 831 } // { dg-warning "note" "" { target *-*-* } 1056 } // { dg-warning "note" "" { target *-*-* } 1050 } // { dg-warning "note" "" { target *-*-* } 342 } diff --git a/libstdc++-v3/testsuite/23_containers/array/requirements/constexpr_functions.cc b/libstdc++-v3/testsuite/23_containers/array/requirements/constexpr_functions.cc index ef8c5aa..3dcb296 100644 --- a/libstdc++-v3/testsuite/23_containers/array/requirements/constexpr_functions.cc +++ b/libstdc++-v3/testsuite/23_containers/array/requirements/constexpr_functions.cc @@ -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 @@ -19,7 +19,6 @@ // . #include -#include namespace __gnu_test { -- 2.7.4