From be9d3d73425dc366fe8c1456a3503d6c118618a0 Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Sat, 6 Nov 2010 00:11:57 +0000 Subject: [PATCH] shared_ptr.h (shared_ptr<>::__shared_ptr(), [...]): Add constexpr specifier. 2010-11-05 Paolo Carlini * include/bits/shared_ptr.h (shared_ptr<>::__shared_ptr(), shared_ptr<>::shared_ptr(nullptr_t), weak_ptr<>::weak_ptr(), enable_shared_from_this::enable_shared_from_this()): Add constexpr specifier. * include/bits/shared_ptr_base.h (__shared_count::__shared_count(), __shared_count::__shared_count(), __shared_ptr<>::__shared_ptr(), __shared_ptr<>::__shared_ptr(nullptr_t), __weak_ptr<>::__weak_ptr(), __enable_shared_from_this::__enable_shared_from_this()): Likewise. * include/bits/unique_ptr.h (default_delete, unique_ptr<>::unique_ptr(), unique_ptr<>::unique_ptr(nullptr_t)): Likewise. * testsuite/20_util/default_delete/cons/constexpr.cc: Do not xfail. * testsuite/20_util/shared_ptr/cons/constexpr.cc: Remove, the test cannot work for a non-literal type like std::shared_ptr. * testsuite/20_util/weak_ptr/cons/constexpr.cc: Likewise. * testsuite/util/testsuite_common_types.h: Add comments. * testsuite/20_util/unique_ptr/cons/constexpr.cc: Likewise. * testsuite/20_util/shared_ptr/cons/43820.cc: Adjust dg-error line numbers. * testsuite/20_util/weak_ptr/comparison/cmp_neg.cc: Likewise. From-SVN: r166386 --- libstdc++-v3/ChangeLog | 23 ++++++++++++ libstdc++-v3/include/bits/shared_ptr.h | 14 +++++--- libstdc++-v3/include/bits/shared_ptr_base.h | 18 ++++++---- libstdc++-v3/include/bits/unique_ptr.h | 36 ++++++++++--------- .../20_util/default_delete/cons/constexpr.cc | 4 +-- .../20_util/shared_ptr/cons/43820.cc | 4 +-- .../20_util/shared_ptr/cons/constexpr.cc | 33 ----------------- .../20_util/unique_ptr/cons/constexpr.cc | 32 ----------------- .../20_util/weak_ptr/comparison/cmp_neg.cc | 6 ++-- .../20_util/weak_ptr/cons/constexpr.cc | 32 ----------------- .../testsuite/util/testsuite_common_types.h | 2 ++ 11 files changed, 71 insertions(+), 133 deletions(-) delete mode 100644 libstdc++-v3/testsuite/20_util/shared_ptr/cons/constexpr.cc delete mode 100644 libstdc++-v3/testsuite/20_util/unique_ptr/cons/constexpr.cc delete mode 100644 libstdc++-v3/testsuite/20_util/weak_ptr/cons/constexpr.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index ad8b235e0493..672d9f1a639b 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,26 @@ +2010-11-05 Paolo Carlini + + * include/bits/shared_ptr.h (shared_ptr<>::__shared_ptr(), + shared_ptr<>::shared_ptr(nullptr_t), weak_ptr<>::weak_ptr(), + enable_shared_from_this::enable_shared_from_this()): Add constexpr + specifier. + * include/bits/shared_ptr_base.h (__shared_count::__shared_count(), + __shared_count::__shared_count(), __shared_ptr<>::__shared_ptr(), + __shared_ptr<>::__shared_ptr(nullptr_t), __weak_ptr<>::__weak_ptr(), + __enable_shared_from_this::__enable_shared_from_this()): Likewise. + * include/bits/unique_ptr.h (default_delete, + unique_ptr<>::unique_ptr(), unique_ptr<>::unique_ptr(nullptr_t)): + Likewise. + * testsuite/20_util/default_delete/cons/constexpr.cc: Do not xfail. + * testsuite/20_util/shared_ptr/cons/constexpr.cc: Remove, the test + cannot work for a non-literal type like std::shared_ptr. + * testsuite/20_util/weak_ptr/cons/constexpr.cc: Likewise. + * testsuite/util/testsuite_common_types.h: Add comments. + * testsuite/20_util/unique_ptr/cons/constexpr.cc: Likewise. + * testsuite/20_util/shared_ptr/cons/43820.cc: Adjust dg-error line + numbers. + * testsuite/20_util/weak_ptr/comparison/cmp_neg.cc: Likewise. + 2010-11-05 Benjamin Kosnik * doc/doxygen/user.cfg.in: Remove tr1_impl headers. diff --git a/libstdc++-v3/include/bits/shared_ptr.h b/libstdc++-v3/include/bits/shared_ptr.h index 2d9e6f771a61..0e6f7a6d0b34 100644 --- a/libstdc++-v3/include/bits/shared_ptr.h +++ b/libstdc++-v3/include/bits/shared_ptr.h @@ -95,7 +95,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std) * @brief Construct an empty %shared_ptr. * @post use_count()==0 && get()==0 */ - shared_ptr() : __shared_ptr<_Tp>() { } + constexpr shared_ptr() + : __shared_ptr<_Tp>() { } /** * @brief Construct a %shared_ptr that owns the pointer @a __p. @@ -104,7 +105,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std) * @throw std::bad_alloc, in which case @c delete @a __p is called. */ template - explicit shared_ptr(_Tp1* __p) : __shared_ptr<_Tp>(__p) { } + explicit shared_ptr(_Tp1* __p) + : __shared_ptr<_Tp>(__p) { } /** * @brief Construct a %shared_ptr that owns the pointer @a __p @@ -256,7 +258,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std) * @param __p A null pointer constant. * @post use_count() == 0 && get() == nullptr */ - shared_ptr(nullptr_t __p) : __shared_ptr<_Tp>(__p) { } + constexpr shared_ptr(nullptr_t __p) + : __shared_ptr<_Tp>(__p) { } template shared_ptr& @@ -387,7 +390,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std) class weak_ptr : public __weak_ptr<_Tp> { public: - weak_ptr() : __weak_ptr<_Tp>() { } + constexpr weak_ptr() + : __weak_ptr<_Tp>() { } template::value>::type> @@ -466,7 +470,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) class enable_shared_from_this { protected: - enable_shared_from_this() { } + constexpr enable_shared_from_this() { } enable_shared_from_this(const enable_shared_from_this&) { } diff --git a/libstdc++-v3/include/bits/shared_ptr_base.h b/libstdc++-v3/include/bits/shared_ptr_base.h index 4a30ea4da6a2..d39050fcc8d2 100644 --- a/libstdc++-v3/include/bits/shared_ptr_base.h +++ b/libstdc++-v3/include/bits/shared_ptr_base.h @@ -443,7 +443,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) class __shared_count { public: - __shared_count() : _M_pi(0) // nothrow + constexpr __shared_count() : _M_pi(0) // nothrow { } template @@ -635,7 +635,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) class __weak_count { public: - __weak_count() : _M_pi(0) // nothrow + constexpr __weak_count() : _M_pi(0) // nothrow { } __weak_count(const __shared_count<_Lp>& __r) : _M_pi(__r._M_pi) // nothrow @@ -751,11 +751,13 @@ _GLIBCXX_BEGIN_NAMESPACE(std) public: typedef _Tp element_type; - __shared_ptr() : _M_ptr(0), _M_refcount() // never throws + constexpr __shared_ptr() + : _M_ptr(0), _M_refcount() // never throws { } template - explicit __shared_ptr(_Tp1* __p) : _M_ptr(__p), _M_refcount(__p) + explicit __shared_ptr(_Tp1* __p) + : _M_ptr(__p), _M_refcount(__p) { __glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>) static_assert( sizeof(_Tp1) > 0, "incomplete type" ); @@ -856,7 +858,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std) #endif /* TODO: use delegating constructor */ - __shared_ptr(nullptr_t) : _M_ptr(0), _M_refcount() // never throws + constexpr __shared_ptr(nullptr_t) + : _M_ptr(0), _M_refcount() // never throws { } template @@ -1163,7 +1166,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std) public: typedef _Tp element_type; - __weak_ptr() : _M_ptr(0), _M_refcount() // never throws + constexpr __weak_ptr() + : _M_ptr(0), _M_refcount() // never throws { } // Generated copy constructor, assignment, destructor are fine. @@ -1324,7 +1328,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) class __enable_shared_from_this { protected: - __enable_shared_from_this() { } + constexpr __enable_shared_from_this() { } __enable_shared_from_this(const __enable_shared_from_this&) { } diff --git a/libstdc++-v3/include/bits/unique_ptr.h b/libstdc++-v3/include/bits/unique_ptr.h index ebbc521873a4..4dc4dddb28ed 100644 --- a/libstdc++-v3/include/bits/unique_ptr.h +++ b/libstdc++-v3/include/bits/unique_ptr.h @@ -46,20 +46,20 @@ _GLIBCXX_BEGIN_NAMESPACE(std) /// Primary template, default_delete. template struct default_delete - { - default_delete() { } + { + constexpr default_delete() { } - template::value>::type> - default_delete(const default_delete<_Up>&) { } + template::value>::type> + default_delete(const default_delete<_Up>&) { } - void - operator()(_Tp* __ptr) const - { - static_assert(sizeof(_Tp)>0, - "can't delete pointer to incomplete type"); - delete __ptr; - } + void + operator()(_Tp* __ptr) const + { + static_assert(sizeof(_Tp)>0, + "can't delete pointer to incomplete type"); + delete __ptr; + } }; // _GLIBCXX_RESOLVE_LIB_DEFECTS @@ -68,6 +68,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std) template struct default_delete<_Tp[]> { + constexpr default_delete() { } + void operator()(_Tp* __ptr) const { @@ -108,8 +110,8 @@ _GLIBCXX_BEGIN_NAMESPACE(std) "constructed with null function pointer deleter"); // Constructors. - unique_ptr() - : _M_t(pointer(), deleter_type()) + constexpr unique_ptr() + : _M_t() { } explicit @@ -129,7 +131,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) { static_assert(!std::is_reference::value, "rvalue deleter bound to reference"); } - unique_ptr(nullptr_t) + constexpr unique_ptr(nullptr_t) : _M_t(pointer(), deleter_type()) { } @@ -271,7 +273,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) "constructed with null function pointer deleter"); // Constructors. - unique_ptr() + constexpr unique_ptr() : _M_t(pointer(), deleter_type()) { } @@ -292,7 +294,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) "rvalue deleter bound to reference"); } /* TODO: use delegating constructor */ - unique_ptr(nullptr_t) + constexpr unique_ptr(nullptr_t) : _M_t(pointer(), deleter_type()) { } diff --git a/libstdc++-v3/testsuite/20_util/default_delete/cons/constexpr.cc b/libstdc++-v3/testsuite/20_util/default_delete/cons/constexpr.cc index 897394a57b24..091f1b6fc366 100644 --- a/libstdc++-v3/testsuite/20_util/default_delete/cons/constexpr.cc +++ b/libstdc++-v3/testsuite/20_util/default_delete/cons/constexpr.cc @@ -1,4 +1,4 @@ -// { dg-do compile { xfail *-*-* } } +// { dg-do compile } // { dg-options "-std=gnu++0x" } // Copyright (C) 2010 Free Software Foundation, Inc. @@ -24,6 +24,6 @@ int main() { __gnu_test::constexpr_default_constructible test; - test.operator()>(); // { dg-excess-errors "" } + test.operator()>(); return 0; } diff --git a/libstdc++-v3/testsuite/20_util/shared_ptr/cons/43820.cc b/libstdc++-v3/testsuite/20_util/shared_ptr/cons/43820.cc index fb6cc8f5b721..f30fd35c1824 100644 --- a/libstdc++-v3/testsuite/20_util/shared_ptr/cons/43820.cc +++ b/libstdc++-v3/testsuite/20_util/shared_ptr/cons/43820.cc @@ -32,9 +32,9 @@ void test01() { X* px = 0; std::shared_ptr p1(px); // { dg-error "here" } - // { dg-error "incomplete" "" { target *-*-* } 762 } + // { dg-error "incomplete" "" { target *-*-* } 764 } std::shared_ptr p9(ap()); // { dg-error "here" } - // { dg-error "incomplete" "" { target *-*-* } 854 } + // { dg-error "incomplete" "" { target *-*-* } 856 } } diff --git a/libstdc++-v3/testsuite/20_util/shared_ptr/cons/constexpr.cc b/libstdc++-v3/testsuite/20_util/shared_ptr/cons/constexpr.cc deleted file mode 100644 index d040ea496669..000000000000 --- a/libstdc++-v3/testsuite/20_util/shared_ptr/cons/constexpr.cc +++ /dev/null @@ -1,33 +0,0 @@ -// { dg-do compile { xfail *-*-* } } -// { 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()>(); // { dg-excess-errors "" } - - __gnu_test::constexpr_single_value_constructible test2; - test2.operator(), std::nullptr_t>(); // { dg-excess-errors "" } - - return 0; -} diff --git a/libstdc++-v3/testsuite/20_util/unique_ptr/cons/constexpr.cc b/libstdc++-v3/testsuite/20_util/unique_ptr/cons/constexpr.cc deleted file mode 100644 index 20db7615ba86..000000000000 --- a/libstdc++-v3/testsuite/20_util/unique_ptr/cons/constexpr.cc +++ /dev/null @@ -1,32 +0,0 @@ -// { dg-do compile { xfail *-*-* } } -// { 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()>(); // { dg-excess-errors "" } - - __gnu_test::constexpr_single_value_constructible test2; - test2.operator(), std::nullptr_t>(); // { dg-excess-errors "" } - 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 42a4da992a4b..4bc950f1c8ab 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 @@ -41,9 +41,9 @@ main() return 0; } -// { dg-warning "note" "" { target *-*-* } 347 } -// { dg-warning "note" "" { target *-*-* } 1079 } -// { dg-warning "note" "" { target *-*-* } 465 } +// { dg-warning "note" "" { target *-*-* } 350 } +// { dg-warning "note" "" { target *-*-* } 1082 } +// { dg-warning "note" "" { target *-*-* } 467 } // { dg-warning "note" "" { target *-*-* } 580 } // { dg-warning "note" "" { target *-*-* } 1027 } // { dg-warning "note" "" { target *-*-* } 340 } diff --git a/libstdc++-v3/testsuite/20_util/weak_ptr/cons/constexpr.cc b/libstdc++-v3/testsuite/20_util/weak_ptr/cons/constexpr.cc deleted file mode 100644 index 3b43769bff31..000000000000 --- a/libstdc++-v3/testsuite/20_util/weak_ptr/cons/constexpr.cc +++ /dev/null @@ -1,32 +0,0 @@ -// { dg-do compile { xfail *-*-* } } -// { 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 test; - test.operator()>(); // { dg-excess-errors "" } - // test.operator()>(); - // test.operator()>(); - // test.operator()>(); - return 0; -} diff --git a/libstdc++-v3/testsuite/util/testsuite_common_types.h b/libstdc++-v3/testsuite/util/testsuite_common_types.h index a402bcf6b480..c601063b0a3b 100644 --- a/libstdc++-v3/testsuite/util/testsuite_common_types.h +++ b/libstdc++-v3/testsuite/util/testsuite_common_types.h @@ -615,6 +615,7 @@ namespace __gnu_test // Generator to test default constructor. struct constexpr_default_constructible { + // NB: _Tp must be a literal type. template void operator()() @@ -633,6 +634,7 @@ namespace __gnu_test struct constexpr_single_value_constructible { + // NB: _Tbasetype and _Ttesttype must be literal types. template void operator()() -- 2.39.2