1 // PR middle-end/65554 2 // { dg-do compile { target c++11 } } 3 // { dg-options "-O" } 4 5 namespace std 6 { 7 struct B { enum { __value }; }; 8 template <typename _Iterator> struct C 9 { _S_baseC10 static _Iterator _S_base (_Iterator p1) { return p1; } 11 }; 12 template <typename> using _RequireInputIter = int; __niter_base(_Iterator p1)13 template <typename _Iterator> _Iterator __niter_base (_Iterator p1) 14 { 15 return std::C <_Iterator>::_S_base (p1); 16 } __miter_base(_Iterator p1)17 template <typename _Iterator> _Iterator __miter_base (_Iterator p1) 18 { 19 return std::C <_Iterator>::_S_base (p1); 20 } 21 struct D 22 { __copy_mD23 template <typename _Tp> static _Tp *__copy_m (_Tp * p1, _Tp * p2, _Tp *) 24 { 25 int _Num = p2 - p1; 26 __builtin_memmove (0, p1, sizeof (_Tp) * _Num); 27 return 0; 28 } 29 }; __copy_move_a(_II p1,_II p2,_OI p3)30 template <int, typename _II, typename _OI> void __copy_move_a (_II p1, _II p2, _OI p3) 31 { 32 D::__copy_m (p1, p2, p3); 33 } __copy_move_a2(_II p1,_II p2,_OI p3)34 template <int, typename _II, typename _OI> void __copy_move_a2 (_II p1, _II p2, _OI p3) 35 { 36 __copy_move_a <0> (std::__niter_base (p1), std::__niter_base (p2), std::__niter_base (p3)); 37 } copy(_II p1,_II p2,_OI p3)38 template <typename _II, typename _OI> void copy (_II p1, _II p2, _OI p3) 39 { 40 __copy_move_a2 <B::__value> (std::__miter_base (p1), std::__miter_base (p2), p3); 41 } 42 } 43 template <typename _Tp> struct F { typedef _Tp *pointer; }; 44 namespace std 45 { 46 template <typename _Tp> using __allocator_base = F <_Tp>; 47 template <typename _Tp> struct allocator:__allocator_base <_Tp> {}; 48 template <class _E> struct initializer_list 49 { 50 typedef _E *const_iterator; 51 _E *_M_array; 52 __SIZE_TYPE__ _M_len; begininitializer_list53 const_iterator begin () { return _M_array; } endinitializer_list54 const_iterator end () { return begin () + 1; } 55 }; 56 template <typename _Alloc> struct allocator_traits 57 { 58 template <typename _Tp> static typename _Tp::pointer _S_pointer_helper (_Tp *); 59 typedef decltype (_S_pointer_helper ((_Alloc *) 0)) __pointer; 60 typedef __pointer pointer; 61 }; 62 } 63 template <typename> struct __alloc_traits: 64 std::allocator_traits <std::allocator <const char *>> {}; 65 namespace std 66 { 67 struct G 68 { __uninit_copyG69 template <typename _InputIterator, typename _ForwardIterator> static _ForwardIterator __uninit_copy (_InputIterator p1, _InputIterator p2, _ForwardIterator p3) 70 { 71 copy (p1, p2, p3); 72 return _ForwardIterator(); 73 } 74 }; 75 template <typename _InputIterator, typename _ForwardIterator> void uninitialized_copy(_InputIterator p1,_InputIterator p2,_ForwardIterator p3)76 uninitialized_copy (_InputIterator p1, _InputIterator p2, _ForwardIterator p3) 77 { 78 G::__uninit_copy (p1, p2, p3); 79 } __uninitialized_copy_a(_InputIterator p1,_InputIterator p2,_ForwardIterator p3,allocator<_Tp> &)80 template <typename _InputIterator, typename _ForwardIterator, typename _Tp> void __uninitialized_copy_a (_InputIterator p1, _InputIterator p2, _ForwardIterator p3, allocator <_Tp> &) 81 { 82 uninitialized_copy (p1, p2, p3); 83 } 84 struct H 85 { 86 typedef std::allocator <int *> _Tp_alloc_type; 87 typedef __alloc_traits <_Tp_alloc_type>::pointer pointer; 88 _Tp_alloc_type & _M_get_Tp_allocator (); 89 }; 90 template <typename _Tp, typename = std::allocator <_Tp>> struct J: H 91 { 92 void operator= (initializer_list <_Tp> p1) 93 { 94 this->assign (p1.begin (), p1.end ()); 95 } assignJ96 template <typename _InputIterator, typename = std::_RequireInputIter <_InputIterator>> void assign (_InputIterator p1, _InputIterator p2) 97 { 98 _M_assign_dispatch (p1, p2, 0); 99 } 100 pointer _M_allocate_and_copy___result; _M_allocate_and_copyJ101 template <typename _ForwardIterator> void _M_allocate_and_copy (int, _ForwardIterator p2, _ForwardIterator p3) 102 { 103 __uninitialized_copy_a (p2, p3, _M_allocate_and_copy___result, _M_get_Tp_allocator ()); 104 } _M_assign_dispatchJ105 template <typename _InputIterator> void _M_assign_dispatch (_InputIterator p1, _InputIterator p2, int) 106 { 107 _M_assign_aux (p1, p2, 0); 108 } 109 template <typename _ForwardIterator> void _M_assign_aux (_ForwardIterator, _ForwardIterator, int); 110 }; 111 template <typename _Tp, typename _Alloc> _M_assign_aux(_ForwardIterator p1,_ForwardIterator p2,int)112 template <typename _ForwardIterator> void J <_Tp, _Alloc>::_M_assign_aux (_ForwardIterator p1, _ForwardIterator p2, int) 113 { 114 _M_allocate_and_copy (0, p1, p2); 115 } 116 class I 117 { 118 void tabCompletion (std::J <int>&) const; 119 }; 120 void tabCompletion(J<int> &)121 I::tabCompletion (J <int>&) const 122 { 123 J <const char *> extra; 124 extra = { "foo" }; 125 } 126 } 127