1// { dg-do compile } 2// { dg-options "-ftracer -fno-tree-dce -fno-tree-sra" } 3 4struct bidirectional_iterator_tag 5{}; 6struct random_access_iterator_tag:bidirectional_iterator_tag 7{}; 8template < typename _Category, typename, typename _Distance, typename > struct iterator 9{ 10 typedef _Distance difference_type; 11}; 12template < typename _Iterator > struct iterator_traits 13{ 14 typedef typename _Iterator::difference_type difference_type; 15}; 16template < typename _Tp > struct iterator_traits <_Tp * > 17{ 18 typedef random_access_iterator_tag iterator_category; 19 typedef _Tp value_type; 20 typedef int difference_type; 21 typedef _Tp reference; 22}; 23template < typename _Iterator > class reverse_iterator: 24 public 25 iterator < typename iterator_traits < _Iterator >::iterator_category, 26 typename iterator_traits < _Iterator >::value_type, 27 typename iterator_traits < _Iterator >::difference_type, typename iterator_traits < _Iterator >::reference > 28{ 29 _Iterator current; 30public: 31 typedef _Iterator iterator_type; 32 reverse_iterator (const reverse_iterator & __x):current (__x.current) 33 {} 34 iterator_type base () 35 { 36 return current; 37 } 38 reverse_iterator operator++ () 39 { 40 --current; 41 } 42}; 43template 44< 45typename 46_Iterator 47> 48bool 49operator 50== 51(reverse_iterator < _Iterator > __x, reverse_iterator < _Iterator > __y) 52{ 53 return __x.base () == __y.base (); 54} 55 56template 57< 58typename 59_Iterator 60> 61typename 62reverse_iterator 63< 64_Iterator 65>::difference_type 66operator 67- (reverse_iterator < _Iterator >, reverse_iterator < _Iterator >) 68{} 69template 70< 71typename 72_RandomAccessIterator 73> 74_RandomAccessIterator 75__find 76(_RandomAccessIterator 77 __first, _RandomAccessIterator __last) 78{ 79 typename 80 iterator_traits 81 < 82 _RandomAccessIterator 83 >::difference_type __trip_count (__last - __first); 84 for (; __trip_count; --__trip_count) 85 ++__first; 86 return __last; 87} 88typedef reverse_iterator < int* > _ForwardIterator1; 89_ForwardIterator1 90search 91(_ForwardIterator1 92 __first1, 93 _ForwardIterator1 94 __last1) 95{ 96 for (;;) 97 { 98 __first1 = __find (__first1, __last1); 99 if (__first1 == __last1) 100 return __last1; 101 } 102} 103