// { dg-do compile }
// { dg-options "-O -fstrict-aliasing -ftree-pre -fno-tree-fre -fno-tree-sra -Wno-return-type" }

typedef __SIZE_TYPE__ size_t;
namespace std 
{
  template < class _T1, class > struct pair
  {
    _T1 first;
  };
}
namespace __gnu_cxx
{
  template < typename _Tp > class new_allocator
  {
  public:
    typedef size_t size_type;
    typedef _Tp * pointer;
    typedef _Tp const_pointer;
    typedef _Tp & reference;
    typedef const _Tp & const_reference;
    template < typename _Tp1 > struct rebind
    {
      typedef new_allocator < _Tp1 > other;
    };
  };
}
namespace std
{
template < typename _Tp > class allocator:
  public __gnu_cxx::new_allocator < _Tp >
  {};
  template < typename, typename, typename > struct binary_function;
  template < typename _Tp > struct less:binary_function < _Tp, _Tp, bool >
  {};
}
namespace __gnu_cxx
{
  namespace typelist
  {
    struct null_type;
    template < typename Root > struct node
    {
      typedef Root root;
    };
    template < typename, typename > struct chain;
    namespace detail
    {
      template < typename, int >struct chain_at_index_;
      template
	<
	typename
	Hd, typename Tl > struct chain_at_index_ <chain < Hd, Tl >, 0 >
      {
	typedef Hd type;
      };
      template
	<
	typename
	Hd, typename Tl, int i > struct chain_at_index_ <chain < Hd, Tl >, i >
      {
	typedef typename chain_at_index_ < Tl, i - 1 >::type type;
      };
    }
    template < typename Typelist, int i > struct at_index
    {
      typedef typename Typelist::root root_type;
      typedef detail::chain_at_index_ < root_type, i > index_type;
      typedef typename index_type::type type;
    };
    template < typename T1, typename T2 > struct create2
    {
      typedef node < chain < T1, chain < T2, null_type > > >type;
    };
  }
}
namespace std
{
  namespace tr1
  {
    template < typename _Tp, _Tp __v > struct integral_constant
    {
      static const _Tp value = __v;
    };
    typedef integral_constant < bool, false > false_type;
    template < typename, typename > struct is_same:false_type
    {};
  }
}
using std::tr1::is_same;
namespace __gnu_pbds
{
  struct null_mapped_type;
  struct rb_tree_tag;
  namespace detail
  {
    template < typename, typename, typename > struct basic_tree_policy_base;
    template
      <
      typename
      Const_Node_Iterator,
      typename
      Allocator
      >
      struct
      basic_tree_policy_base
      <Const_Node_Iterator, Const_Node_Iterator, Allocator >
    {};
  }
  template
    < typename, typename, typename, typename > struct null_tree_node_update;
template < typename Const_Node_Iterator, typename Node_Iterator, typename, typename Allocator > class tree_order_statistics_node_update:
  detail::basic_tree_policy_base
    < Const_Node_Iterator, Node_Iterator, Allocator >
  {
  public:
    typedef Allocator allocator_type;
    typedef typename allocator_type::size_type size_type;
    typedef size_type metadata_type;
    typedef Const_Node_Iterator const_node_iterator;
    typedef Node_Iterator node_iterator;
    typedef
      typename
      allocator_type::template
      rebind < metadata_type >::other::reference metadata_reference;
    void operator () (node_iterator, const_node_iterator) const;
  };
  template
    <
    typename
    Const_Node_Iterator,
    class
    Node_Iterator,
    class
    Cmp_Fn,
    class
    Allocator
    >
    inline
    void
    tree_order_statistics_node_update
    <
    Const_Node_Iterator,
    Node_Iterator,
    Cmp_Fn,
    Allocator
    >::operator
    () (node_iterator node_it, const_node_iterator end_nd_it) const
  {
    node_iterator l_child_it;
    size_type
      l_rank = (l_child_it == end_nd_it) ? : l_child_it.get_metadata ();
    node_iterator r_child_it = node_it.get_r_child ();
    size_type
      r_rank = (r_child_it == end_nd_it) ? : r_child_it.get_metadata ();
    const_cast
      < metadata_reference > (node_it.get_metadata ()) = l_rank + r_rank;
  }
  namespace
  {
    template < typename, typename, typename, bool > struct value_type_base;
    template
      <
      typename
      Key,
      typename
      Allocator
      > struct value_type_base <Key, null_mapped_type, Allocator, false >
    {
      typedef Key value_type;
      typedef
	typename
	Allocator::template rebind < value_type >::other value_type_allocator;
      typedef typename value_type_allocator::pointer pointer;
      typedef typename value_type_allocator::const_pointer const_pointer;
      typedef typename value_type_allocator::reference reference;
      typedef typename value_type_allocator::const_reference const_reference;
    };
    template
      <
      typename
      Key,
      typename
      Mapped, typename Alloc, bool Store_Extra > struct vt_base_selector
    {
      typedef value_type_base < Key, Mapped, Alloc, Store_Extra > type;
    };
    template
      <
      typename
      Key,
      typename
      Mapped,
      typename
      Alloc,
      bool
      Store_Extra
      >
      struct
      types_traits:vt_base_selector < Key, Mapped, Alloc, Store_Extra >::type
    {};
    template < typename, class, class > struct dumconst_node_iterator;
    template
      <
      typename
      Key,
      typename
      Mapped,
      class,
      class
      Node_And_It_Traits, class Allocator > class bin_search_tree_no_data_
    {
    protected:
      typedef
	typename
	Allocator::template
	rebind
	< typename Node_And_It_Traits::node >::other::pointer node_pointer;
      typedef
	typename
	types_traits
	< Key, Mapped, Allocator, false >::const_reference const_reference;
      typedef typename Node_And_It_Traits::point_iterator point_iterator;
      typedef typename Node_And_It_Traits::node_update node_update;
      void rotate_right (node_pointer);
      template
	<
	typename
	Node_Update_ > void apply_update (node_pointer, Node_Update_ *);
    };
    template
      <
      typename
      Key,
      typename
      Mapped,
      class
      Cmp_Fn,
      class
      Node_And_It_Traits,
      class
      Allocator
      >
      void
      bin_search_tree_no_data_
      <
      Key,
      Mapped,
      Cmp_Fn, Node_And_It_Traits, Allocator >::rotate_right (node_pointer p_x)
    {
      node_pointer p_y = p_x->m_p_parent;
      p_y->m_p_right = p_x;
      apply_update (p_x, this);
      apply_update (p_x->m_p_parent, (node_update *) this);
    }
    template
      <
      typename
      Key,
      typename
      Mapped,
      class
      Cmp_Fn,
      class
      Node_And_It_Traits,
      class
      Allocator
      >
      template
      <
      typename
      Node_Update_
      >
      void
      bin_search_tree_no_data_
      <
      Key,
      Mapped,
      Cmp_Fn,
      Node_And_It_Traits,
      Allocator >::apply_update (node_pointer p_nd, Node_Update_ *)
    {
      node_update ()((p_nd), ((0)));
    }
  }
  namespace detail
  {
  template < typename Key, typename Mapped, typename Cmp_Fn, typename Node_And_It_Traits, typename Allocator > class rb_tree_no_data_:
    bin_search_tree_no_data_
      < Key, Mapped, Cmp_Fn, Node_And_It_Traits, Allocator >
    {
      typedef
	bin_search_tree_no_data_
	< Key, Mapped, Cmp_Fn, Node_And_It_Traits, Allocator > base_type;
      typedef typename base_type::node_pointer node_pointer;
    public:
      typedef typename base_type::const_reference const_reference;
      typedef typename base_type::point_iterator point_iterator;
      std::pair < point_iterator, bool > insert (const_reference);
      void insert_fixup (node_pointer);
    };
    template
      <
      typename
      Key,
      typename
      Mapped,
      typename
      Cmp_Fn,
      typename
      Node_And_It_Traits,
      typename
      Allocator
      >
      std::pair
      <
      typename
      rb_tree_no_data_
      <
      Key,
      Mapped,
      Cmp_Fn,
      Node_And_It_Traits,
      Allocator
      >::point_iterator,
      bool
      >
      rb_tree_no_data_
      <
      Key,
      Mapped,
      Cmp_Fn, Node_And_It_Traits, Allocator >::insert (const_reference)
    {
      std::pair < point_iterator, bool > ins_pair;
{
	insert_fixup (ins_pair.first.m_p_nd);
      }
    }
    template
      <
      typename
      Key,
      typename
      Mapped,
      typename
      Cmp_Fn,
      typename
      Node_And_It_Traits,
      typename
      Allocator
      >
      void
      rb_tree_no_data_
      <
      Key,
      Mapped,
      Cmp_Fn,
      Node_And_It_Traits, Allocator >::insert_fixup (node_pointer p_nd)
    {
{
{
{
	    this->rotate_right (p_nd);
	  }
	}
      }
    }
    template
      <
      typename,
      typename, typename, typename, typename > struct container_base_dispatch;
    template
      <
      typename
      Key,
      typename
      Policy_Tl,
      typename
      Alloc
      >
      struct
      container_base_dispatch
      <Key, null_mapped_type, rb_tree_tag, Policy_Tl, Alloc >
    {
      typedef __gnu_cxx::typelist::at_index < Policy_Tl, 0 > at0;
      typedef typename at0::type at0t;
      typedef __gnu_cxx::typelist::at_index < Policy_Tl, 1 > at1;
      typedef typename at1::type at1t;
      typedef
	rb_tree_no_data_ < Key, null_mapped_type, at0t, at1t, Alloc > type;
    };
    template
      <
      typename
      Node_Pointer,
      typename,
      typename,
      typename,
      typename, typename, bool, class > class bin_search_tree_const_it_
    {
    public:
      Node_Pointer m_p_nd;
    };
    template
      <
      typename
      Node,
      class
      Const_Iterator,
      class Iterator, class Allocator > class bin_search_tree_const_node_it_
    {
      typedef
	typename
	Allocator::template rebind < Node >::other::pointer node_pointer;
    public:
      typedef typename Node::metadata_type metadata_type;
      typedef
	typename
	Allocator::template
	rebind
	< metadata_type >::other::const_reference const_metadata_reference;
    bin_search_tree_const_node_it_ (node_pointer p_nd):
      m_p_nd ((p_nd))
      {}
      const_metadata_reference get_metadata ()
      {
	return (m_p_nd->get_metadata ());
      }
      bin_search_tree_const_node_it_ ()
      {}
      bin_search_tree_const_node_it_
	< Node, Const_Iterator, Iterator, Allocator > get_r_child ()
      {
	return ((m_p_nd->m_p_right));
      }
      bool operator == (bin_search_tree_const_node_it_)
      { return true; }
      node_pointer m_p_nd;
    };
    template
      <
      typename,
      typename,
      class,
      template
      <
      typename,
      class,
      class, class > class, class, class > struct bin_search_tree_traits;
    template
      <
      typename
      Key,
      class
      Cmp_Fn,
      template
      <
      typename,
      class,
      class,
      class
      >
      class
      Node_Update,
      class
      Node,
      class
      Allocator
      >
      struct
      bin_search_tree_traits
      <Key, null_mapped_type, Cmp_Fn, Node_Update, Node, Allocator >
    {
      typedef
	types_traits < Key, null_mapped_type, Allocator, false > type_traits;
      typedef Node node;
      typedef
	bin_search_tree_const_it_
	<
	typename
	Allocator::template
	rebind
	<
	node
	>::other::pointer,
	typename
	type_traits::value_type,
	typename
	type_traits::pointer,
	typename
	type_traits::const_pointer,
	typename
	type_traits::reference,
	typename
	type_traits::const_reference, true, Allocator > const_point_iterator;
      typedef const_point_iterator point_iterator;
      typedef
	bin_search_tree_const_node_it_
	<
	Node,
	const_point_iterator, point_iterator, Allocator > const_node_iterator;
      typedef const_node_iterator node_iterator;
      typedef
	Node_Update
	< const_node_iterator, node_iterator, Cmp_Fn, Allocator > node_update;
    };
    template < typename Node_Update, bool > struct tree_metadata_helper
    {
      typedef typename Node_Update::metadata_type type;
    };
    template
      <
      typename
      Key,
      typename
      Data,
      class
      Cmp_Fn,
      template
      <
      typename,
      class,
      class,
      class
      >
      class Node_Update, class Allocator > struct tree_node_metadata_selector
    {
      typedef
	dumconst_node_iterator < Key, Data, Allocator > dumconst_node_it;
      enum
      {
	null_update = is_same < Node_Update < dumconst_node_it,
	dumconst_node_it,
	Cmp_Fn,
	Allocator >,
	null_tree_node_update < dumconst_node_it,
	dumconst_node_it,
	Cmp_Fn,
	Allocator > >::value
      };
      typedef
	typename
	tree_metadata_helper
	<
	Node_Update
	<
	dumconst_node_it,
	dumconst_node_it, Cmp_Fn, Allocator >, null_update >::type type;
    };
    template
      <
      typename,
      typename,
      class,
      template
      <
      typename,
      class, class, class > class, class, class > struct tree_traits;
    template < typename Value_Type, class Metadata, class Allocator > struct rb_tree_node_
    {
      typedef Metadata metadata_type;
      typedef
	typename
	Allocator::template
	rebind
	<
	rb_tree_node_
	< Value_Type, Metadata, Allocator > >::other::pointer node_pointer;
      typedef
	typename
	Allocator::template
	rebind < metadata_type >::other::reference metadata_reference;
        metadata_reference get_metadata ()
      {
	return m_metadata;
      }
      node_pointer m_p_right;
      node_pointer m_p_parent;
      metadata_type m_metadata;
    };
    template
      <
      typename
      Key,
      typename
      Mapped,
      typename
      Cmp_Fn,
      template
      <
      typename,
      class,
      class,
      class
      >
      class
      Node_Update,
      typename
      Allocator
      >
      struct
      tree_traits
      <Key,
      Mapped,
      Cmp_Fn,
      Node_Update,
      rb_tree_tag,
      Allocator
      >:bin_search_tree_traits
      <
      Key,
      Mapped,
      Cmp_Fn,
      Node_Update,
      rb_tree_node_
      <
      typename
      types_traits
      <
      Key,
      Mapped,
      Allocator,
      false
      >::value_type,
      typename
      tree_node_metadata_selector
      <
      Key,
      Mapped, Cmp_Fn, Node_Update, Allocator >::type, Allocator >, Allocator >
    {};
  }
template < typename Key, typename Mapped, typename Tag, typename Policy_Tl, typename Allocator > class container_base:
  public
    detail::container_base_dispatch
    < Key, Mapped, Tag, Policy_Tl, Allocator >::type
  {};
template < typename Key, typename Mapped, typename Tag, typename, typename Policy_Tl, typename Allocator > class basic_tree:
  public
    container_base < Key, Mapped, Tag, Policy_Tl, Allocator >
  {};
  template
    <
    typename
    Key,
    typename
    Mapped,
    typename
    Cmp_Fn
    =
    std::less
    <
    Key
    >,
    typename
    Tag
    =
    rb_tree_tag,
    template
    <
    typename,
    typename,
    typename,
    typename
    >
    class
    Node_Update
    =
    null_tree_node_update,
    typename
    Allocator
    =
    std::allocator
    <
    char
    > >class
    tree:public
    basic_tree
    <
    Key,
    Mapped,
    Tag,
    detail::tree_traits
    <
    Key,
    Mapped,
    Cmp_Fn,
    Node_Update,
    Tag,
    Allocator
    >,
    typename
    __gnu_cxx::typelist::create2
    <
    Cmp_Fn,
    detail::tree_traits
    < Key, Mapped, Cmp_Fn, Node_Update, Tag, Allocator > >::type, Allocator >
  {};
}
using namespace std;
using namespace __gnu_pbds;
typedef
  tree
  <
  int,
  null_mapped_type,
  less < int >, rb_tree_tag, tree_order_statistics_node_update > set_t;
int main ()
{
  set_t s;
  s.insert (12);
}
