// { 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; }