// { dg-do run  }
// Test rtti pointer flags
// Copyright (C) 2000, 2002 Free Software Foundation, Inc.
// Contributed by Nathan Sidwell 15 Apr 2000 <nathan@nathan@codesourcery.com>

#include <typeinfo>

#if defined (__GXX_ABI_VERSION) && __GXX_ABI_VERSION >= 100
#include <cxxabi.h>

struct A {int m;};
struct B;

using namespace abi;

int expect (int flags, std::type_info const &info)
{
  abi::__pbase_type_info const *ptr =
      dynamic_cast <abi::__pbase_type_info const *> (&info);
  if (!ptr)
    return 0;
  if (ptr->__flags != flags)
    return 0;
  return 1;
}

int main ()
{
  if (! expect (0, typeid (A *)))
    return 1;
  if (! expect (1, typeid (A const *)))
    return 2;
  if (! expect (2, typeid (A volatile *)))
    return 3;
  if (! expect (4, typeid (A *__restrict__ *)))
    return 4;
  if (! expect (0, typeid (int A::*)))
    return 5;
  if (! expect (0, typeid (int A::**)))
    return 6;

  if (! expect (8 | 0, typeid (B *)))
    return 11;
  if (! expect (8 | 1, typeid (B const *)))
    return 12;
  if (! expect (8 | 2, typeid (B volatile *)))
    return 13;
  if (! expect (8 | 4, typeid (B *__restrict__ *)))
    return 14;
  if (! expect (16 | 0, typeid (int B::*)))
    return 15;
  if (! expect (8 | 0, typeid (int B::**)))
    return 16;
  if (! expect (8 | 0, typeid (B A::*)))
    return 17;
  if (! expect (24, typeid (B B::*)))
    return 18;
  
  return 0;
}

#else
int main ()
{
  return 0;
}
#endif
