/* { dg-do compile } */ /* { dg-options "-c -O3" } */ template struct A { typedef _Tp *pointer; typedef _Tp& reference; typedef _Tp& const_reference; templatestruct rebind { typedef A other; }; }; templatestruct __alloc_traits { typedef typename _Alloc::pointer pointer; typedef typename _Alloc::reference reference; typedef typename _Alloc::const_reference const_reference; templatestruct rebind { typedef typename _Alloc::template rebind<_Tp>::other other; }; }; templatestruct B { typedef typename __alloc_traits<_Alloc>::template rebind< _Tp>::other _Tp_alloc_type; typedef typename __alloc_traits<_Tp_alloc_type>::pointer pointer; struct F { pointer _M_start; }; F _M_impl; }; template >class vec : B<_Tp, _Alloc>{ typedef B<_Tp, _Alloc> _Base; typedef typename _Base::_Tp_alloc_type _Tp_alloc_type; typedef __alloc_traits<_Tp_alloc_type> _Alloc_traits; public: typedef _Tp value_type; typedef typename _Alloc_traits::reference reference; typedef typename _Alloc_traits::const_reference const_reference; reference operator[](int p1) { return *(this->_M_impl._M_start + p1); } const_reference operator[](long) const; }; int a[17]; class C { vec m_value; void opModDivGuts(const C&); int mostSetBitP1() const; }; void C::opModDivGuts(const C& p1) { int b = p1.mostSetBitP1(), c = b + 1; int d[16]; for (int i = c; i; i--) a[i] = p1.m_value[i] << b; for (int i = 0; i < c; i++) m_value[i] = d[i] >> b << -b; }