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