// { dg-do compile }
// { dg-options "-std=c++11 -Wno-return-type" }

namespace std
{
  template <class, class>
  struct pair
  {
  };
  struct input_iterator_tag
  {
  };
  struct forward_iterator_tag : public input_iterator_tag
  {
  };
  template <typename, typename _Tp, typename = _Tp>
  struct iterator
  {
  };
}
namespace __gnu_cxx
{
  template <typename _Tp>
  struct new_allocator
  {
    typedef _Tp pointer;
    typedef _Tp value_type;
    template <typename _Tp1>
    struct rebind
    {
      typedef new_allocator <_Tp1> other;
    };
  };
}
namespace std
{
  template <typename _Tp>
  struct allocator : public __gnu_cxx::new_allocator <_Tp>
  {
  };
}
extern "C"
{
  struct rtl_String;
  void rtl_string_release (rtl_String *) throw ();
  void rtl_string_newFromStr (rtl_String * *, const char *) throw ();
}
namespace std
{
  template <typename, typename, typename> struct binary_function;
  template <typename _Tp>
  struct equal_to : public binary_function <_Tp, _Tp, bool>
  {
  };
}
namespace rtl
{
  struct OString
  {
    rtl_String * pData;
    OString (const char *value)
    {
      rtl_string_newFromStr (&pData, value);
    }
     ~OString ()
    {
      rtl_string_release (pData);
    }
  };
  struct OStringHash;
}
namespace boost
{
  template <class> struct hash;
  namespace unordered
  {
    template <class T, class = boost::hash <T>, class = std::equal_to <T>, class = std::allocator <T>>class unordered_set;
  }
  using boost::unordered::unordered_set;
  namespace detail
  {
    template <bool>
    struct if_true
    {
      template <class, class F>
      struct then
      {
	typedef F type;
      };
    };
  }
  template <class, class> struct pointer_to_other;
  template <class T, class U>
  struct pointer_to_other <T *, U>
  {
    typedef U type;
  };
  namespace unordered
  {
    namespace detail
    {
      template <typename T, T> struct integral_constant
      {
      };
      struct choice9
      {
	typedef char (&type)[9];
      };
      struct choice8:choice9
      {
      };
      struct choice7:choice8
      {
      };
      struct choice6:choice7
      {
      };
      struct choice5:choice6
      {
      };
      struct choice4:choice5
      {
      };
      struct choice3:choice4
      {
      };
      struct choice2:choice3
      {
      };
      struct choice1:choice2
      {
      };
      choice1 choose ();
      template <typename Alloc, typename T>
      struct rebind_wrap
      {
	typedef typename Alloc::template rebind <T>::other type;
      };
      template <typename, typename T2>
      struct sfinae:T2
      {
      };
      template <typename Tp, typename Default>
      struct default_type_pointer
      {
	template <typename X>
	static boost::unordered::detail::sfinae <typename X::pointer, choice1> test (choice1);
	struct DefaultWrap
	{
	  typedef Default pointer;
	};
	enum { value = (1 == sizeof (test <Tp> (choose ()))) };
	typedef typename boost::detail::if_true <value>::template then <Tp, DefaultWrap>::type::pointer type;
      };
      template <typename Tp, typename Default>
      struct default_type_const_pointer
      {
	template <typename>
	static choice2::type test (choice2);
	struct DefaultWrap
	{
	};
	enum { value = (1 == sizeof (test <Tp> (choose ()))) };
	typedef typename boost::detail::if_true <value>::template then <Tp, DefaultWrap> type;
      };
      struct default_type_propagate_on_container_swap
      {
	struct DefaultWrap
	{
	};
      };
      template <typename Alloc>
      struct allocator_traits
      {
	typedef typename Alloc::value_type value_type;
	typedef typename default_type_pointer <Alloc, value_type *>::type pointer;
	template <typename T>
	struct pointer_to_other : boost::pointer_to_other <pointer, T>
	{
	};
	typedef typename default_type_const_pointer <Alloc, typename pointer_to_other <value_type>::type>::type const_pointer;
      };
    }
    namespace detail
    {
      struct move_tag
      {
      };
      template <typename> struct table;
      template <typename NodeAlloc>
      struct node_constructor
      {
	void construct_value ()
	{
	}
      };
      struct ptr_bucket
      {
	ptr_bucket ()
	{
	}
      };
      template <typename A, typename Bucket, typename Node>
      struct buckets
      {
	typedef Node node;
	typedef Bucket bucket;
	typedef typename boost::unordered::detail::rebind_wrap <A, node>::type node_allocator;
	typedef typename boost::unordered::detail::rebind_wrap <A, bucket>::type bucket_allocator;
	typedef boost::unordered::detail::allocator_traits <node_allocator> node_allocator_traits;
	typedef boost::unordered::detail::allocator_traits <bucket_allocator> bucket_allocator_traits;
	typedef typename node_allocator_traits::pointer node_pointer;
	typedef typename node_allocator_traits::const_pointer const_node_pointer;
	typedef typename bucket_allocator_traits::pointer bucket_pointer;
	typedef boost::unordered::detail::node_constructor <node_allocator> node_constructor;
	bucket_pointer buckets_;
	unsigned size_;
	template <typename Types>
	buckets (boost::unordered::detail::table <Types>, boost::unordered::detail::move_tag) : buckets_ (), size_ ()
	{
	}
      };
      struct functions
      {
      };
    }
  }
  namespace detail
  {
    template <class Category, class T, class, class, class>
    struct iterator_base:std::iterator <Category, T>
    {
    };
  }
  template <class Category, class T, class Distance, class Pointer = T, class Reference = T>
  struct iterator:boost::detail::iterator_base <Category, T, Distance, Pointer, Reference>
  {
  };
  namespace unordered
  {
    namespace iterator_detail
    {
      template <typename, typename NodePointer, typename Value> struct c_iterator:public boost::iterator <std::forward_iterator_tag, Value, int>
      {
	friend bool operator== (c_iterator, c_iterator)
	{
	}
      };
    }
    namespace detail
    {
      template <typename ValueType>
      struct value_base
      {
	typedef ValueType value_type;
	value_type value ()
	{
	}
      };
      template <typename Types>
      struct table:boost::unordered::detail::buckets <typename Types::allocator, typename Types::bucket, typename Types::key_equal>
      {
	typedef typename Types::value_type value_type;
	typedef boost::unordered::detail::buckets <typename Types::allocator, typename Types::bucket, typename Types::node> buckets;
	typedef typename buckets::node_pointer node_pointer;
	typedef typename buckets::const_node_pointer const_node_pointer;
	typedef boost::unordered::iterator_detail::c_iterator <const_node_pointer, node_pointer, value_type> c_iterator;
	unsigned max_size ()
	{
	}
      };
      template <typename> struct table_impl;
      template <typename T>
      struct ptr_node : boost::unordered::detail::value_base <T>, boost::unordered::detail::ptr_bucket
      {
	boost::unordered::detail::ptr_bucket bucket_base;
	unsigned hash_;
	ptr_node () : bucket_base (), hash_ ()
	{
	}
      };
      template <typename A, typename T, typename, typename> struct pick_node2
      {
      };
      template <typename A, typename T> struct pick_node2 <A, T, boost::unordered::detail::ptr_node <T> *, boost::unordered::detail::ptr_bucket *>
      {
	typedef boost::unordered::detail::ptr_node <T> node;
	typedef boost::unordered::detail::ptr_bucket bucket;
      };
      template <typename A, typename T> struct pick_node
      {
	typedef boost::unordered::detail::allocator_traits <typename boost::unordered::detail::rebind_wrap <A, boost::unordered::detail::ptr_node <T>>::type> tentative_node_traits;
	typedef boost::unordered::detail::allocator_traits <typename boost::unordered::detail::rebind_wrap <A, boost::unordered::detail::ptr_bucket>::type> tentative_bucket_traits;
	typedef pick_node2 <A, T, typename tentative_node_traits::pointer, typename tentative_bucket_traits::pointer> pick;
	typedef typename pick::node node;
	typedef typename pick::bucket bucket;
      };
      template <typename A, typename T, typename H, typename P>
      struct set
      {
	typedef boost::unordered::detail::set <A, T, H, P> types;
	typedef T value_type;
	typedef P key_equal;
	typedef typename boost::unordered::detail::rebind_wrap <A, value_type>::type allocator;
	typedef boost::unordered::detail::pick_node <allocator, value_type> pick;
	typedef typename pick::node node;
	typedef typename pick::bucket bucket;
	typedef boost::unordered::detail::table_impl <types> table;
      };
      template <typename Types>
      struct table_impl : boost::unordered::detail::table <Types>
      {
	typedef boost::unordered::detail::table <Types> table;
	typedef typename table::node_constructor node_constructor;
	table_impl () : table ()
	{
	}
	template <class InputIt>
	void insert_range_impl2 (node_constructor, InputIt)
	{
	}
      };
    }
    template <class T, class H, class P, class A>
    struct unordered_set
    {
      typedef T key_type;
      typedef T value_type;
      typedef boost::unordered::detail::set <A, T, H, P> types;
      typedef typename types::table table;
      typedef typename table::c_iterator const_iterator;
      typedef typename table::c_iterator iterator;
      table table_;
      bool empty ()
      {
	return table_.size_;
      }
      iterator end ()
      {
      }
      std::pair <iterator, bool> insert (value_type)
      {
      }
      unsigned erase (const key_type &);
      const_iterator find (const key_type);
    };
    template <class T, class H, class P, class A>
    unsigned unordered_set <T, H, P, A>::erase (const key_type &)
    {
    }
  }
}
using namespace::rtl;
namespace skeletonmaker
{
  void
  checkDefaultInterfaces (boost::unordered_set <OString, OStringHash> interfaces,
			  boost::unordered_set <OStringHash> services, OString)
  {
    if (services.empty ())
      interfaces.erase ("com.sun.star.lang.XServiceInfo");
    else if (interfaces.find ("com.sun.star.lang.XServiceInfo") == interfaces.end ())
      interfaces.insert ("com.sun.star.lang.XServiceInfo");
  }
}
