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