// RUN: %llvmgxx -c -emit-llvm %s -o -
// PR1634

namespace Manta
{
  class CallbackHandle
  {
  protected:virtual ~ CallbackHandle (void)
    {
    }
  };
template < typename Data1 > class CallbackBase_1Data:public CallbackHandle
  {
  };
}

namespace __gnu_cxx
{
  template < typename _Iterator, typename _Container >
  class __normal_iterator
  {
    _Iterator _M_current;
  };
}

namespace std
{
  template < typename _Tp > struct allocator
  {
    typedef _Tp *pointer;
  };
  template < typename _InputIterator,
    typename _Tp > inline void find (_InputIterator __last,
					       const _Tp & __val)
  {
  };
}

namespace Manta
{
  template < typename _Tp, typename _Alloc> struct _Vector_base
  {
    struct _Vector_impl
    {
      _Tp *_M_start;
    };
  public:
    _Vector_impl _M_impl;
  };
  template < typename _Tp, typename _Alloc = std::allocator < _Tp > >
  class vector:protected _Vector_base < _Tp,_Alloc >
  {
  public:
    typedef __gnu_cxx::__normal_iterator < typename _Alloc::pointer,
      vector < _Tp, _Alloc > > iterator;
    iterator end ()
    {
    }
  };
  class MantaInterface
  {
  };
  class RTRT
  {
    virtual CallbackHandle *registerTerminationCallback (CallbackBase_1Data <
							 MantaInterface * >*);
    virtual void unregisterCallback (CallbackHandle *);
    typedef vector < CallbackBase_1Data < int >*>PRCallbackMapType;
    PRCallbackMapType parallelPreRenderCallbacks;
  };
}
using namespace Manta;
CallbackHandle *
RTRT::registerTerminationCallback (CallbackBase_1Data < MantaInterface * >*cb)
{
  return cb;
}

void
RTRT::unregisterCallback (CallbackHandle * callback)
{
  {
    typedef CallbackBase_1Data < int > callback_t;
    callback_t *cb = static_cast < callback_t * >(callback);
    find (parallelPreRenderCallbacks.end (), cb);
  }
}

