| // Tests that the exceptions declared by the TM TS (N4514) as transaction_safe |
| // are indeed that. Thus, this also tests the transactional clones in |
| // libstdc++ and libsupc++. |
| |
| // Not supported on Darwin nor AIX because those lack the support for |
| // weak references to undefined functions that we need in libstdc++ to make |
| // exceptions transaction-safe. |
| // { dg-do run { target { ! { *-*-darwin* powerpc-ibm-aix* } } } } |
| |
| #include <iostream> |
| #include <exception> |
| #include <stdexcept> |
| #include <string> |
| |
| using namespace std; |
| |
| template<typename T> void thrower(const T& t) |
| { |
| try |
| { |
| atomic_commit |
| { |
| throw t; |
| } |
| } |
| catch (T ex) |
| { |
| if (ex != t) abort (); |
| } |
| } |
| |
| template<typename T> void thrower1(const string& what) |
| { |
| try |
| { |
| atomic_commit |
| { |
| throw T (); |
| } |
| } |
| catch (T ex) |
| { |
| if (what != ex.what()) abort (); |
| } |
| } |
| |
| template<typename T> void thrower2(const string& what) |
| { |
| try |
| { |
| atomic_commit |
| { |
| throw T (what); |
| } |
| } |
| catch (T ex) |
| { |
| if (what != ex.what()) abort (); |
| } |
| } |
| |
| |
| int main () |
| { |
| thrower<unsigned int> (23); |
| thrower<int> (23); |
| thrower<unsigned short> (23); |
| thrower<short> (23); |
| thrower<unsigned char> (23); |
| thrower<char> (23); |
| thrower<unsigned long int> (42); |
| thrower<long int> (42); |
| thrower<unsigned long long int> (42); |
| thrower<long long int> (42); |
| thrower<double> (23.42); |
| thrower<long double> (23.42); |
| thrower<float> (23.42); |
| thrower<void*> (0); |
| thrower<void**> (0); |
| thrower1<exception> ("std::exception"); |
| thrower1<bad_exception> ("std::bad_exception"); |
| thrower2<logic_error> ("test"); |
| thrower2<domain_error> ("test"); |
| thrower2<invalid_argument> ("test"); |
| thrower2<length_error> ("test"); |
| thrower2<out_of_range> ("test"); |
| thrower2<runtime_error> ("test"); |
| thrower2<range_error> ("test"); |
| thrower2<overflow_error> ("test"); |
| thrower2<underflow_error> ("test"); |
| return 0; |
| } |