strub: enable conditional support
[official-gcc.git] / gcc / testsuite / g++.dg / torture / pr54838.C
blob63804ba8cbdc1db75fe2e065909629bb070cd0de
1 // { dg-do compile }
2 // { dg-options "-ftracer -fno-tree-dce -fno-tree-sra -Wno-return-type" }
4 struct bidirectional_iterator_tag
5 {};
6 struct random_access_iterator_tag:bidirectional_iterator_tag
7 {};
8 template < typename _Category, typename, typename _Distance, typename > struct iterator
10   typedef _Distance difference_type;
12 template < typename _Iterator > struct iterator_traits
14   typedef typename _Iterator::difference_type difference_type;
16 template < typename _Tp > struct iterator_traits <_Tp * >
18   typedef random_access_iterator_tag iterator_category;
19   typedef _Tp value_type;
20   typedef int difference_type;
21   typedef _Tp reference;
23 template < 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 >
29   _Iterator current;
30 public:
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     }
43 template
45 typename
46 _Iterator
48 bool
49 operator
51 (reverse_iterator < _Iterator > __x, reverse_iterator < _Iterator > __y)
53   return __x.base () == __y.base ();
56 template
58 typename
59 _Iterator
61 typename
62 reverse_iterator
64 _Iterator
65 >::difference_type
66 operator
67 - (reverse_iterator < _Iterator >, reverse_iterator < _Iterator >)
69 template
71 typename
72 _RandomAccessIterator
74 _RandomAccessIterator
75 __find
76 (_RandomAccessIterator
77  __first, _RandomAccessIterator __last)
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;
88 typedef reverse_iterator < int* > _ForwardIterator1;
89 _ForwardIterator1
90 search
91 (_ForwardIterator1
92  __first1,
93  _ForwardIterator1
94  __last1)
96   for (;;)
97     {
98       __first1 = __find (__first1, __last1);
99       if (__first1 == __last1)
100         return __last1;
101     }