Commit 8d1b99e2 by Benjamin Kosnik Committed by Benjamin Kosnik

future: Fixes for -fno-exceptions.

2009-08-10  Benjamin Kosnik  <bkoz@redhat.com>

	* include/std/future: Fixes for -fno-exceptions.
	* include/bits/functexcept.h: Same.
	* libsupc++/exception_ptr.h: Same.
	* src/pool_allocator.cc: Same.
	* src/future.cc: Same.
	* src/functexcept.cc: Same.
	* config/abi/pre/gnu.ver: New exports.
	* testsuite/30_threads/packaged_task/cons/assign_neg.cc: Adjust.
	* testsuite/30_threads/packaged_task/cons/copy_neg.cc: Same.
	* testsuite/30_threads/unique_future/cons/assign_neg.cc: Same.
	* testsuite/30_threads/unique_future/cons/copy_neg.cc: Same.
	* testsuite/30_threads/shared_future/cons/assign_neg.cc: Same.
	* testsuite/30_threads/promise/cons/assign_neg.cc: Same.
	* testsuite/30_threads/promise/cons/copy_neg.cc: Same.

	* testsuite/23_containers/deque/operators/1.cc: Separate in two...
	* testsuite/23_containers/deque/operators/2.cc: New.

From-SVN: r150633
parent 35076532
2009-08-10 Benjamin Kosnik <bkoz@redhat.com>
* include/std/future: Fixes for -fno-exceptions.
* include/bits/functexcept.h: Same.
* libsupc++/exception_ptr.h: Same.
* src/pool_allocator.cc: Same.
* src/future.cc: Same.
* src/functexcept.cc: Same.
* config/abi/pre/gnu.ver: New exports.
* testsuite/30_threads/packaged_task/cons/assign_neg.cc: Adjust.
* testsuite/30_threads/packaged_task/cons/copy_neg.cc: Same.
* testsuite/30_threads/unique_future/cons/assign_neg.cc: Same.
* testsuite/30_threads/unique_future/cons/copy_neg.cc: Same.
* testsuite/30_threads/shared_future/cons/assign_neg.cc: Same.
* testsuite/30_threads/promise/cons/assign_neg.cc: Same.
* testsuite/30_threads/promise/cons/copy_neg.cc: Same.
* testsuite/23_containers/deque/operators/1.cc: Separate in two...
* testsuite/23_containers/deque/operators/2.cc: New.
2009-08-07 Paolo Carlini <paolo.carlini@oracle.com> 2009-08-07 Paolo Carlini <paolo.carlini@oracle.com>
* src/hash.cc (hash<string>::operator()(string), * src/hash.cc (hash<string>::operator()(string),
......
...@@ -517,7 +517,7 @@ GLIBCXX_3.4 { ...@@ -517,7 +517,7 @@ GLIBCXX_3.4 {
_ZTVSt13bad_exception; _ZTVSt13bad_exception;
_ZTVSt[0-9][0-9]basic*; _ZTVSt[0-9][0-9]basic*;
_ZTVSt[0-9][0-9][c-d]*; _ZTVSt[0-9][0-9][c-d]*;
_ZTVSt[0-9][0-9][f-k]*; _ZTVSt[0-9][0-9][g-k]*;
_ZTVSt11logic_error; _ZTVSt11logic_error;
_ZTVSt12length_error; _ZTVSt12length_error;
_ZTVSt[0-9][0-9][m-r]*; _ZTVSt[0-9][0-9][m-r]*;
...@@ -545,7 +545,7 @@ GLIBCXX_3.4 { ...@@ -545,7 +545,7 @@ GLIBCXX_3.4 {
_ZTISt13bad_exception; _ZTISt13bad_exception;
_ZTISt[0-9][0-9]basic*; _ZTISt[0-9][0-9]basic*;
_ZTISt[0-9][0-9][c-d]*; _ZTISt[0-9][0-9][c-d]*;
_ZTISt[0-9][0-9][f-k]*; _ZTISt[0-9][0-9][g-k]*;
_ZTISt11logic_error; _ZTISt11logic_error;
_ZTISt12length_error; _ZTISt12length_error;
_ZTISt[0-9][0-9][m-r]*; _ZTISt[0-9][0-9][m-r]*;
...@@ -577,7 +577,7 @@ GLIBCXX_3.4 { ...@@ -577,7 +577,7 @@ GLIBCXX_3.4 {
_ZTSSt13bad_exception; _ZTSSt13bad_exception;
_ZTSSt[0-9][0-9]basic*; _ZTSSt[0-9][0-9]basic*;
_ZTSSt[0-9][0-9][c-d]*; _ZTSSt[0-9][0-9][c-d]*;
_ZTSSt[0-9][0-9][f-k]*; _ZTSSt[0-9][0-9][g-k]*;
_ZTSSt11logic_error; _ZTSSt11logic_error;
_ZTSSt12length_error; _ZTSSt12length_error;
_ZTSSt[0-9][0-9][m-r]*; _ZTSSt[0-9][0-9][m-r]*;
...@@ -973,6 +973,12 @@ GLIBCXX_3.4.13 { ...@@ -973,6 +973,12 @@ GLIBCXX_3.4.13 {
# future # future
_ZSt15future_category; _ZSt15future_category;
_ZNSt12future_errorD*;
_ZNKSt12future_error4whatEv;
_ZTSSt12future_error;
_ZTVSt12future_error;
_ZTISt12future_error;
_ZSt20__throw_future_errori;
} GLIBCXX_3.4.12; } GLIBCXX_3.4.12;
......
...@@ -88,6 +88,9 @@ _GLIBCXX_BEGIN_NAMESPACE(std) ...@@ -88,6 +88,9 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
void void
__throw_system_error(int) __attribute__((__noreturn__)); __throw_system_error(int) __attribute__((__noreturn__));
void
__throw_future_error(int) __attribute__((__noreturn__));
_GLIBCXX_END_NAMESPACE _GLIBCXX_END_NAMESPACE
#endif #endif
...@@ -76,20 +76,26 @@ namespace std ...@@ -76,20 +76,26 @@ namespace std
inline error_condition make_error_condition(future_errc __errc) inline error_condition make_error_condition(future_errc __errc)
{ return error_condition(static_cast<int>(__errc), *future_category); } { return error_condition(static_cast<int>(__errc), *future_category); }
/// Exception type thrown by futures. /**
* @brief Exception type thrown by futures.
* @ingroup exceptions
*/
class future_error : public logic_error class future_error : public logic_error
{ {
error_code _M_code;
public: public:
explicit future_error(future_errc __ec) explicit future_error(future_errc __ec)
: logic_error("std::future_error"), _M_code(make_error_code(__ec)) : logic_error("std::future_error"), _M_code(make_error_code(__ec))
{ } { }
const error_code& code() const throw() { return _M_code; } virtual ~future_error() throw();
const char* what() const throw() { return _M_code.message().c_str(); } virtual const char*
what() const throw();
private: const error_code&
error_code _M_code; code() const throw() { return _M_code; }
}; };
// Forward declarations. // Forward declarations.
...@@ -200,7 +206,7 @@ namespace std ...@@ -200,7 +206,7 @@ namespace std
{ {
lock_guard<mutex> __lock(_M_mutex); lock_guard<mutex> __lock(_M_mutex);
if (_M_ready()) if (_M_ready())
throw future_error(future_errc::promise_already_satisfied); __throw_future_error(int(future_errc::promise_already_satisfied));
_M_result.swap(__res); _M_result.swap(__res);
} }
_M_cond.notify_all(); _M_cond.notify_all();
...@@ -226,7 +232,7 @@ namespace std ...@@ -226,7 +232,7 @@ namespace std
_M_set_retrieved_flag() _M_set_retrieved_flag()
{ {
if (_M_retrieved.test_and_set()) if (_M_retrieved.test_and_set())
throw future_error(future_errc::future_already_retrieved); __throw_future_error(int(future_errc::future_already_retrieved));
} }
private: private:
...@@ -366,7 +372,7 @@ namespace std ...@@ -366,7 +372,7 @@ namespace std
if (static_cast<bool>(this->_M_state)) if (static_cast<bool>(this->_M_state))
this->_M_state->_M_set_retrieved_flag(); this->_M_state->_M_set_retrieved_flag();
else else
throw future_error(future_errc::future_already_retrieved); __throw_future_error(int(future_errc::future_already_retrieved));
} }
// copy construction from a shared_future // copy construction from a shared_future
...@@ -878,15 +884,17 @@ namespace std ...@@ -878,15 +884,17 @@ namespace std
unique_future<_Result> unique_future<_Result>
get_future() get_future()
{ {
try __try
{ {
return _M_promise.get_future(); return _M_promise.get_future();
} }
catch (const future_error& __e) __catch (const future_error& __e)
{ {
#ifdef __EXCEPTIONS
if (__e.code() == future_errc::future_already_retrieved) if (__e.code() == future_errc::future_already_retrieved)
throw std::bad_function_call(); throw std::bad_function_call();
throw; throw;
#endif
} }
} }
...@@ -895,13 +903,20 @@ namespace std ...@@ -895,13 +903,20 @@ namespace std
operator()(_ArgTypes... __args) operator()(_ArgTypes... __args)
{ {
if (!static_cast<bool>(_M_task) || _M_promise._M_satisfied()) if (!static_cast<bool>(_M_task) || _M_promise._M_satisfied())
throw std::bad_function_call(); {
try #ifdef __EXCEPTIONS
throw std::bad_function_call();
#else
__builtin_abort();
#endif
}
__try
{ {
_Run_task<_Result, _ArgTypes...>::_S_run(_M_promise, _M_task, _Run_task<_Result, _ArgTypes...>::_S_run(_M_promise, _M_task,
std::forward<_ArgTypes>(__args)...); std::forward<_ArgTypes>(__args)...);
} }
catch (...) __catch (...)
{ {
_M_promise.set_exception(current_exception()); _M_promise.set_exception(current_exception());
} }
......
...@@ -156,11 +156,13 @@ namespace std ...@@ -156,11 +156,13 @@ namespace std
{ {
__try __try
{ {
#ifdef __EXCEPTIONS
throw __ex; throw __ex;
#endif
} }
__catch(...) __catch(...)
{ {
return current_exception (); return current_exception();
} }
} }
......
...@@ -24,10 +24,11 @@ ...@@ -24,10 +24,11 @@
#include <cstdlib> #include <cstdlib>
#include <exception> #include <exception>
#include <stdexcept> #include <stdexcept>
#include <system_error>
#include <new> #include <new>
#include <typeinfo> #include <typeinfo>
#include <ios> #include <ios>
#include <system_error>
#include <future>
#ifdef _GLIBCXX_USE_NLS #ifdef _GLIBCXX_USE_NLS
# include <libintl.h> # include <libintl.h>
...@@ -98,6 +99,11 @@ _GLIBCXX_BEGIN_NAMESPACE(std) ...@@ -98,6 +99,11 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
void void
__throw_system_error(int __i) __throw_system_error(int __i)
{ throw system_error(error_code(__i, generic_category())); } { throw system_error(error_code(__i, generic_category())); }
void
__throw_future_error(int __i)
{ throw future_error(future_errc(__i)); }
#else #else
void void
__throw_bad_exception(void) __throw_bad_exception(void)
...@@ -156,8 +162,13 @@ _GLIBCXX_BEGIN_NAMESPACE(std) ...@@ -156,8 +162,13 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
{ std::abort(); } { std::abort(); }
void void
__throw_system_error(int __i) __throw_system_error(int)
{ std::abort(); } { std::abort(); }
void
__throw_future_error(int)
{ std::abort(); }
#endif //__EXCEPTIONS #endif //__EXCEPTIONS
_GLIBCXX_END_NAMESPACE _GLIBCXX_END_NAMESPACE
...@@ -67,6 +67,11 @@ namespace ...@@ -67,6 +67,11 @@ namespace
namespace std namespace std
{ {
const error_category* const future_category = &__future_category_instance(); const error_category* const future_category = &__future_category_instance();
future_error::~future_error() throw() { }
const char*
future_error::what() const throw() { return _M_code.message().c_str(); }
} }
#endif // _GLIBCXX_HAS_GTHREADS && _GLIBCXX_USE_C99_STDINT_TR1 #endif // _GLIBCXX_HAS_GTHREADS && _GLIBCXX_USE_C99_STDINT_TR1
......
...@@ -90,11 +90,11 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx) ...@@ -90,11 +90,11 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
size_t __bytes_to_get = (2 * __total_bytes size_t __bytes_to_get = (2 * __total_bytes
+ _M_round_up(_S_heap_size >> 4)); + _M_round_up(_S_heap_size >> 4));
try __try
{ {
_S_start_free = static_cast<char*>(::operator new(__bytes_to_get)); _S_start_free = static_cast<char*>(::operator new(__bytes_to_get));
} }
catch (...) __catch (...)
{ {
// Try to make do with what we have. That can't hurt. We // Try to make do with what we have. That can't hurt. We
// do not try smaller requests, since that tends to result // do not try smaller requests, since that tends to result
......
...@@ -55,30 +55,8 @@ void test01() ...@@ -55,30 +55,8 @@ void test01()
VERIFY( constend <= end ); VERIFY( constend <= end );
} }
// libstdc++/7186
void test02()
{
bool test __attribute__((unused)) = true;
std::deque<int> d(2);
typedef std::deque<int>::iterator iter;
typedef std::deque<int>::const_iterator constiter;
iter beg = d.begin();
iter end = d.end();
constiter constbeg = d.begin();
constiter constend = d.end();
VERIFY( beg - constbeg == 0 );
VERIFY( constend - end == 0 );
VERIFY( end - constbeg > 0 );
VERIFY( constend - beg > 0 );
}
int main() int main()
{ {
test01(); test01();
test02();
return 0; return 0;
} }
// 2002-05-18 Paolo Carlini <pcarlini@unitus.it>
// Copyright (C) 2002, 2004, 2005, 2009 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/>.
// 23.2.1 deque operators
#include <deque>
#include <testsuite_hooks.h>
// libstdc++/7186
void test02()
{
bool test __attribute__((unused)) = true;
std::deque<int> d(2);
typedef std::deque<int>::iterator iter;
typedef std::deque<int>::const_iterator constiter;
iter beg = d.begin();
iter end = d.end();
constiter constbeg = d.begin();
constiter constend = d.end();
VERIFY( beg - constbeg == 0 );
VERIFY( constend - end == 0 );
VERIFY( end - constbeg > 0 );
VERIFY( constend - beg > 0 );
}
int main()
{
test02();
return 0;
}
...@@ -33,4 +33,4 @@ void test01() ...@@ -33,4 +33,4 @@ void test01()
} }
// { dg-error "used here" "" { target *-*-* } 32 } // { dg-error "used here" "" { target *-*-* } 32 }
// { dg-error "deleted function" "" { target *-*-* } 856 } // { dg-error "deleted function" "" { target *-*-* } 862 }
...@@ -32,4 +32,4 @@ void test01() ...@@ -32,4 +32,4 @@ void test01()
} }
// { dg-error "used here" "" { target *-*-* } 31 } // { dg-error "used here" "" { target *-*-* } 31 }
// { dg-error "deleted function" "" { target *-*-* } 855 } // { dg-error "deleted function" "" { target *-*-* } 861 }
...@@ -33,4 +33,4 @@ void test01() ...@@ -33,4 +33,4 @@ void test01()
} }
// { dg-error "used here" "" { target *-*-* } 32 } // { dg-error "used here" "" { target *-*-* } 32 }
// { dg-error "deleted function" "" { target *-*-* } 582 } // { dg-error "deleted function" "" { target *-*-* } 588 }
...@@ -32,4 +32,4 @@ void test01() ...@@ -32,4 +32,4 @@ void test01()
} }
// { dg-error "used here" "" { target *-*-* } 31 } // { dg-error "used here" "" { target *-*-* } 31 }
// { dg-error "deleted function" "" { target *-*-* } 566 } // { dg-error "deleted function" "" { target *-*-* } 572 }
...@@ -35,4 +35,4 @@ void test01() ...@@ -35,4 +35,4 @@ void test01()
} }
// { dg-error "used here" "" { target *-*-* } 34 } // { dg-error "used here" "" { target *-*-* } 34 }
// { dg-error "deleted function" "" { target *-*-* } 475 } // { dg-error "deleted function" "" { target *-*-* } 481 }
...@@ -35,4 +35,4 @@ void test01() ...@@ -35,4 +35,4 @@ void test01()
} }
// { dg-error "used here" "" { target *-*-* } 34 } // { dg-error "used here" "" { target *-*-* } 34 }
// { dg-error "deleted function" "" { target *-*-* } 395 } // { dg-error "deleted function" "" { target *-*-* } 401 }
...@@ -34,4 +34,4 @@ void test01() ...@@ -34,4 +34,4 @@ void test01()
} }
// { dg-error "used here" "" { target *-*-* } 33 } // { dg-error "used here" "" { target *-*-* } 33 }
// { dg-error "deleted function" "" { target *-*-* } 394 } // { dg-error "deleted function" "" { target *-*-* } 400 }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment