From b4e77f9b76f4cafc0f3de2466de06c84e7102877 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely <jwakely.gcc@gmail.com> Date: Sun, 6 Jun 2010 13:27:23 +0000 Subject: [PATCH] re PR libstdc++/40296 ([C++0x] std::exception_ptr comparisons) 2010-06-06 Jonathan Wakely <jwakely.gcc@gmail.com> PR libstdc++/40296 * libsupc++/exception_ptr.h (exception_ptr::exception_ptr): Replace __safe_bool constructor with nullptr_t constructor in C++0x mode. (exception_ptr::operator bool): Add explicit conversion to bool. (swap(exception_ptr&, exception_ptr&)): Add. (exception_ptr::_M_safe_bool_dummy): Only declare for old ABI. * libsupc++/eh_ptr.cc (exception_ptr::_M_safe_bool_dummy): Move next to other functions retained for ABI compatibility. * testsuite/18_support/exception_ptr/requirements.cc: New. * testsuite/18_support/exception_ptr/requirements_neg.cc: New. From-SVN: r160340 --- libstdc++-v3/ChangeLog | 13 ++++ libstdc++-v3/libsupc++/eh_ptr.cc | 9 +-- libstdc++-v3/libsupc++/exception_ptr.h | 27 ++++++--- .../18_support/exception_ptr/requirements.cc | 60 +++++++++++++++++++ .../exception_ptr/requirements_neg.cc | 33 ++++++++++ 5 files changed, 131 insertions(+), 11 deletions(-) create mode 100644 libstdc++-v3/testsuite/18_support/exception_ptr/requirements.cc create mode 100644 libstdc++-v3/testsuite/18_support/exception_ptr/requirements_neg.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 2033e19bbbb0..44a1662e63ea 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,16 @@ +2010-06-06 Jonathan Wakely <jwakely.gcc@gmail.com> + + PR libstdc++/40296 + * libsupc++/exception_ptr.h (exception_ptr::exception_ptr): Replace + __safe_bool constructor with nullptr_t constructor in C++0x mode. + (exception_ptr::operator bool): Add explicit conversion to bool. + (swap(exception_ptr&, exception_ptr&)): Add. + (exception_ptr::_M_safe_bool_dummy): Only declare for old ABI. + * libsupc++/eh_ptr.cc (exception_ptr::_M_safe_bool_dummy): Move + next to other functions retained for ABI compatibility. + * testsuite/18_support/exception_ptr/requirements.cc: New. + * testsuite/18_support/exception_ptr/requirements_neg.cc: New. + 2010-06-05 Jonathan Wakely <jwakely.gcc@gmail.com> * include/bits/shared_ptr_base.h (_Sp_counted_ptr::_M_dispose): Make diff --git a/libstdc++-v3/libsupc++/eh_ptr.cc b/libstdc++-v3/libsupc++/eh_ptr.cc index 8a0167d75103..abe59a214be6 100644 --- a/libstdc++-v3/libsupc++/eh_ptr.cc +++ b/libstdc++-v3/libsupc++/eh_ptr.cc @@ -101,10 +101,6 @@ std::__exception_ptr::exception_ptr::_M_get() const throw() { return _M_exception_object; } -void -std::__exception_ptr::exception_ptr::_M_safe_bool_dummy() throw () { } - - void std::__exception_ptr::exception_ptr::swap(exception_ptr &other) throw() { @@ -114,6 +110,11 @@ std::__exception_ptr::exception_ptr::swap(exception_ptr &other) throw() } +// Retained for compatibility with CXXABI_1.3. +void +std::__exception_ptr::exception_ptr::_M_safe_bool_dummy() throw () { } + + // Retained for compatibility with CXXABI_1.3. bool std::__exception_ptr::exception_ptr::operator!() const throw() diff --git a/libstdc++-v3/libsupc++/exception_ptr.h b/libstdc++-v3/libsupc++/exception_ptr.h index f3f0819b1c62..4ccb4fb2d6e6 100644 --- a/libstdc++-v3/libsupc++/exception_ptr.h +++ b/libstdc++-v3/libsupc++/exception_ptr.h @@ -81,25 +81,27 @@ namespace std void *_M_get() const throw() __attribute__ ((__pure__)); - void _M_safe_bool_dummy() throw() __attribute__ ((__const__)); - friend exception_ptr std::current_exception() throw(); friend void std::rethrow_exception(exception_ptr); public: exception_ptr() throw(); - typedef void (exception_ptr::*__safe_bool)(); - - // For construction from nullptr or 0. - exception_ptr(__safe_bool) throw(); - exception_ptr(const exception_ptr&) throw(); #ifdef __GXX_EXPERIMENTAL_CXX0X__ + exception_ptr(nullptr_t) throw() + : _M_exception_object(0) + { } + exception_ptr(exception_ptr&& __o) throw() : _M_exception_object(__o._M_exception_object) { __o._M_exception_object = 0; } +#else + typedef void (exception_ptr::*__safe_bool)(); + + // For construction from nullptr or 0. + exception_ptr(__safe_bool) throw(); #endif exception_ptr& @@ -121,10 +123,16 @@ namespace std #ifdef _GLIBCXX_EH_PTR_COMPAT // Retained for compatibility with CXXABI_1.3. + void _M_safe_bool_dummy() throw() __attribute__ ((__const__)); bool operator!() const throw() __attribute__ ((__pure__)); operator __safe_bool() const throw(); #endif +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + explicit operator bool() const + { return _M_exception_object; } +#endif + friend bool operator==(const exception_ptr&, const exception_ptr&) throw() __attribute__ ((__pure__)); @@ -140,6 +148,11 @@ namespace std bool operator!=(const exception_ptr&, const exception_ptr&) throw() __attribute__ ((__pure__)); + + inline void + swap(exception_ptr& __lhs, exception_ptr& __rhs) + { __lhs.swap(__rhs); } + } // namespace __exception_ptr diff --git a/libstdc++-v3/testsuite/18_support/exception_ptr/requirements.cc b/libstdc++-v3/testsuite/18_support/exception_ptr/requirements.cc new file mode 100644 index 000000000000..36e6375d9a93 --- /dev/null +++ b/libstdc++-v3/testsuite/18_support/exception_ptr/requirements.cc @@ -0,0 +1,60 @@ +// { dg-options "-std=gnu++0x" } +// { dg-require-atomic-builtins "" } + +// 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 <exception> +#include <testsuite_hooks.h> + +// test NullablePointer requirements +void test01() +{ + std::exception_ptr p1; // DefaultConstructible + std::exception_ptr p2(p1); // CopyConstructible + p1 = p2; // CopyAssignable + VERIFY( p1 == p2 ); // EqualityComparable + VERIFY( !bool(p1) ); // contextually convertible to bool + swap(p1, p2); // Swappable + + // Table 39 expressions + std::exception_ptr p3 = nullptr; + std::exception_ptr p4(nullptr); + VERIFY( std::exception_ptr() == nullptr ); + p4 = nullptr; + VERIFY( p4 == nullptr ); + VERIFY( nullptr == p4 ); + VERIFY( (p4 != nullptr) == !(p4 == nullptr) ); + VERIFY( (nullptr != p4) == !(p4 == nullptr) ); + + std::exception_ptr p5{}; // value initialized ... + VERIFY( p5 == nullptr ); // ... is equivalent to null +} + +// additional exception_ptr requirements +void test02() +{ + std::exception_ptr p1; + VERIFY( p1 == nullptr ); +} + +int main() +{ + test01(); + test02(); + return 0; +} diff --git a/libstdc++-v3/testsuite/18_support/exception_ptr/requirements_neg.cc b/libstdc++-v3/testsuite/18_support/exception_ptr/requirements_neg.cc new file mode 100644 index 000000000000..b897b506dfe3 --- /dev/null +++ b/libstdc++-v3/testsuite/18_support/exception_ptr/requirements_neg.cc @@ -0,0 +1,33 @@ +// { dg-do compile } +// { dg-options "-std=gnu++0x" } +// { dg-require-atomic-builtins "" } + +// 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 <exception> + +// test implicit conversions +void test01() +{ + std::exception_ptr p; + + int __attribute__((unused)) i = p; // { dg-error "cannot convert" } + bool __attribute__((unused)) b = p; // { dg-error "cannot convert" } + void* __attribute__((unused)) v = p; // { dg-error "cannot convert" } +} + -- GitLab