| // { dg-do run } |
| // Test pointer chain catching |
| // Copyright (C) 2000, 2002 Free Software Foundation, Inc. |
| // Contributed by Nathan Sidwell 9 Apr 2000 <nathan@nathan@codesourcery.com> |
| |
| #include <stdio.h> |
| |
| void fn () {} |
| struct A {void fn () {}}; |
| static int var = 1; |
| static const int const_var = 2; |
| |
| struct B; |
| struct C; |
| |
| int test0 () |
| { |
| try |
| { |
| throw &fn; |
| } |
| catch (void *) |
| { |
| // should not decay to void * |
| fprintf(stderr, "25\n"); |
| return 1; |
| } |
| catch (...) |
| { |
| return 0; |
| } |
| return -1; |
| } |
| |
| int test1 () |
| { |
| try |
| { |
| throw &A::fn; |
| } |
| catch (void *) |
| { |
| // should not decay to void * |
| fprintf(stderr, "44\n"); |
| return 1; |
| } |
| catch (...) |
| { |
| return 0; |
| } |
| return -1; |
| } |
| |
| int test2 () |
| { |
| try |
| { |
| throw &var; |
| } |
| catch (void *) |
| { |
| // should decay to void * |
| return 0; |
| } |
| catch (...) |
| { |
| fprintf(stderr, "67\n"); |
| return 1; |
| } |
| return -1; |
| } |
| |
| int test3 () |
| { |
| try |
| { |
| throw &var; |
| } |
| catch (void const *) |
| { |
| // should decay to const void * |
| return 0; |
| } |
| catch (...) |
| { |
| fprintf(stderr, "86\n"); |
| return 1; |
| } |
| return -1; |
| } |
| |
| int test4 () |
| { |
| try |
| { |
| throw &const_var; |
| } |
| catch (void *) |
| { |
| fprintf(stderr, "100\n"); |
| // should not decay to void * |
| return 1; |
| } |
| catch (void const *) |
| { |
| // should decay to const void * |
| return 0; |
| } |
| catch (...) |
| { |
| return 2; |
| } |
| return -1; |
| } |
| |
| int test5 () |
| { |
| try |
| { |
| throw (void ***)0; |
| } |
| catch (void ***) |
| { |
| return 0; |
| } |
| catch (...) |
| { |
| fprintf(stderr, "128\n"); |
| return 1; |
| } |
| return -1; |
| } |
| |
| int test6 () |
| { |
| try |
| { |
| throw (void const* const* const*)0; |
| } |
| catch (void ***) |
| { |
| fprintf(stderr, "142\n"); |
| return 1; |
| } |
| catch (void * const* const*) |
| { |
| return 2; |
| } |
| catch (void const* * const*) |
| { |
| return 3; |
| } |
| catch (void const* const* *) |
| { |
| return 4; |
| } |
| catch (void const* const* const *) |
| { |
| return 0; |
| } |
| catch (...) |
| { |
| return 1; |
| } |
| return -1; |
| } |
| |
| int test7 () |
| { |
| try |
| { |
| throw (void ***)0; |
| } |
| catch (void const* const**) |
| { |
| return 1; |
| } |
| catch (void const** const *) |
| { |
| return 2; |
| } |
| catch (void * const* const *) |
| { |
| return 0; |
| } |
| catch (...) |
| { |
| return 3; |
| } |
| return -1; |
| } |
| |
| int test8 () |
| { |
| try |
| { |
| throw (B **)0; |
| } |
| catch (C **) |
| { |
| return 1; |
| } |
| catch (B **) |
| { |
| return 0; |
| } |
| catch (...) |
| { |
| return 2; |
| } |
| return -1; |
| } |
| |
| int test9 () |
| { |
| try |
| { |
| throw (B **)0; |
| } |
| catch (C const *const *) |
| { |
| return 1; |
| } |
| catch (B const *const *) |
| { |
| return 0; |
| } |
| catch (...) |
| { |
| return 2; |
| } |
| return -1; |
| } |
| |
| static int (*tests[])() = |
| { |
| test0, |
| test1, |
| test2, |
| test3, |
| test4, |
| |
| test5, |
| test6, |
| test7, |
| |
| test8, |
| test9, |
| |
| NULL |
| }; |
| |
| int main () |
| { |
| int ix; |
| int errors = 0; |
| |
| for (ix = 0; tests[ix]; ix++) |
| { |
| int n = tests[ix] (); |
| |
| if (n) |
| { |
| printf ("test %d failed %d\n", ix, n); |
| errors++; |
| } |
| } |
| return errors; |
| } |