2016-01-15 23:42:41 +01:00
|
|
|
// 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++.
|
|
|
|
|
2016-01-21 19:25:42 +01:00
|
|
|
// 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* } } } }
|
2016-01-15 23:42:41 +01:00
|
|
|
|
|
|
|
#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;
|
|
|
|
}
|