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