diff options
Diffstat (limited to 'gcc/testsuite/g++.dg/eh/uncaught1.C')
-rw-r--r-- | gcc/testsuite/g++.dg/eh/uncaught1.C | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/eh/uncaught1.C b/gcc/testsuite/g++.dg/eh/uncaught1.C new file mode 100644 index 000000000..afbf5af4d --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/uncaught1.C @@ -0,0 +1,84 @@ +// PR libstdc++/10606 +// { dg-do run } +// { dg-options "-fuse-cxa-get-exception-ptr" { target powerpc*-*-darwin* } } + +#include <exception> +#include <cstdlib> + + +struct Check { + int obj1, obj2; + bool state; +}; + +static Check const data[] = { + { 0, 0, false }, // construct [0] + { 1, 0, true }, // [1] = [0] + { 0, 0, true }, // destruct [0] + { 2, 1, true }, // [2] = [1] + { 2, 2, true }, // destruct [2] + { 3, 1, true }, // [3] = [1] + { 3, 3, false }, // destruct [3] + { 1, 1, false }, // destruct [1] + { 9, 9, false } // end-of-data +}; + +static int pos = 0; + +static void test(int obj1, int obj2, bool state) +{ + if (obj1 != data[pos].obj1) abort (); + if (obj2 != data[pos].obj2) abort (); + if (state != data[pos].state) abort (); + pos++; +} + + +struct S { + int id; + S (); + S (const S &); + ~S (); +}; + +static int next_id = 0; + +S::S() + : id (next_id++) +{ + test (id, id, std::uncaught_exception ()); +} + +S::S(const S &x) + : id (next_id++) +{ + test (id, x.id, std::uncaught_exception ()); +} + +S::~S() +{ + test (id, id, std::uncaught_exception ()); +} + +extern void foo (S *); + +int main() +{ + try + { + try + { + S s0; + throw s0; // s1 is the exception object + } + catch (S s2) + { + throw; + } + } + catch (S s3) + { + } + + return 0; +} |