re PR tree-optimization/33593 (tree-outof-ssa moves sources of non-call exceptions...
[gcc.git] / gcc / testsuite / g++.dg / tree-ssa / pr16688.C
1 /* PR 16688. Test provided by Wolfgang Bangerth. The alias analyzer
2 was aborting when trying to group aliases. */
3
4 /* { dg-do compile } */
5 /* { dg-options "-O2" } */
6
7 template<typename _Tp>
8 struct iterator_traits;
9
10 template<typename _Tp>
11 struct iterator_traits<_Tp*> {
12 typedef _Tp& reference;
13 };
14
15 template<typename _Iterator> struct NI {
16 _Iterator current;
17
18 typedef typename iterator_traits<_Iterator>::reference reference;
19
20 NI() { }
21
22 NI(const _Iterator& __i) : current(__i) { }
23
24 reference operator*() const { return *current; }
25
26 NI& operator++() { return *this; }
27
28 const _Iterator& base() const { return current; }
29 };
30
31 template<typename _IteratorL, typename _IteratorR>
32 inline int
33 operator-(const NI<_IteratorL>& __lhs,
34 const NI<_IteratorR>& __rhs)
35 { return __lhs.base() - __rhs.base(); }
36
37
38 template<typename _II, typename _OI>
39 inline _OI
40 __copy_aux(_II __first, _II __last, _OI __result)
41 {
42 struct __copy {
43 static _OI
44 copy(_II __first, _II __last, _OI __result)
45 {
46 for (; __first != __last; ++__result, ++__first)
47 *__result = *__first;
48 return __result;
49 }
50 };
51
52 return __copy::copy(__first, __last, __result);
53 }
54
55 struct __copy_normal
56 {
57 template<typename _II, typename _OI>
58 static _OI
59 copy_n(_II __first, _II __last, _OI __result)
60 {
61 return __copy_aux(__first, __last, __result);
62 }
63 };
64 template<typename _InputIterator, typename _OutputIterator>
65 inline _OutputIterator
66 copy(_InputIterator __first, _InputIterator __last,
67 _OutputIterator __result)
68 {
69 return __copy_normal::copy_n(__first, __last, __result);
70 }
71
72 template <typename T, typename U, typename V>
73 void uninitialized_fill_n(T,U,V);
74
75
76 template<typename _Tp>
77 struct _Vector_base {
78 struct _Vector_impl {
79 _Tp* start;
80 _Tp* finish;
81 _Tp* end_of_storage;
82 _Vector_impl() : start(0), finish(0), end_of_storage(0)
83 { }
84 } impl;
85
86 _Vector_base(unsigned __n) {
87 impl.start = allocate(__n);
88 impl.finish = impl.start;
89 impl.end_of_storage = impl.start + __n;
90 }
91
92 ~_Vector_base() {
93 deallocate(impl.start,
94 impl.end_of_storage - impl.start);
95 }
96
97 _Tp* allocate(unsigned __n);
98
99 void deallocate(_Tp* __p, unsigned __n);
100
101 NI<_Tp*> begin() { return NI<_Tp*> (impl.start); }
102 };
103
104
105 template<typename _Tp>
106 struct vector : _Vector_base<_Tp>
107 {
108 vector(int __n)
109 : _Vector_base<_Tp>(__n)
110 {
111 uninitialized_fill_n(this->impl.start, __n, _Tp());
112 }
113 };
114
115
116
117 struct Tensor
118 {
119 Tensor ();
120 Tensor (const Tensor &);
121
122 double values[2];
123 };
124
125
126 inline
127 Tensor::Tensor (const Tensor &p)
128 {
129 for (unsigned int i=0; i<2; ++i)
130 values[i] = p.values[i];
131 }
132
133
134 struct TriaAccessor
135 {
136 typedef void * AccessorData;
137
138 void copy_from (const TriaAccessor &);
139 void operator = (const TriaAccessor *);
140
141 TriaAccessor & operator = (const TriaAccessor &);
142
143 bool operator == (const TriaAccessor &) const;
144
145 bool operator != (const TriaAccessor &) const;
146 void operator ++ ();
147
148 int state () const;
149 bool used () const;
150
151 int present_level;
152 int present_index;
153 int** levels;
154 };
155
156 inline int TriaAccessor::state () const {
157 if ((present_level>=0) && (present_index>=0))
158 return 0;
159 else
160 if ((present_level==-1) && (present_index==-1))
161 return 1;
162 else
163 return 2;
164 }
165
166
167 inline
168 void TriaAccessor::operator ++ () {
169 ++this->present_index;
170
171 while (this->present_index >=
172 static_cast<int>(*this->levels[this->present_level]))
173 {
174 ++this->present_level;
175 this->present_index = 0;
176
177 if (this->present_level >= static_cast<int>(1))
178 {
179
180 this->present_level = this->present_index = -1;
181 return;
182 }
183 }
184 }
185
186 struct MGDoFObjectAccessor : TriaAccessor {};
187
188
189
190 struct TriaRawIterator
191 {
192 TriaRawIterator ();
193
194 TriaRawIterator (const TriaRawIterator &);
195 TriaRawIterator (const MGDoFObjectAccessor &a);
196 const MGDoFObjectAccessor & operator * () const;
197
198 MGDoFObjectAccessor & operator * ();
199 const MGDoFObjectAccessor * operator -> () const;
200
201 MGDoFObjectAccessor * operator -> ();
202
203 TriaRawIterator & operator = (const TriaRawIterator &);
204
205 bool operator == (const TriaRawIterator &) const;
206 bool operator != (const TriaRawIterator &) const;
207 bool operator < (const TriaRawIterator &) const;
208 MGDoFObjectAccessor accessor;
209
210 TriaRawIterator & operator ++ ();
211 };
212
213 struct TriaIterator : TriaRawIterator
214 {
215 TriaIterator ();
216
217 TriaIterator (const TriaIterator &i);
218
219 TriaIterator &
220 operator = (const TriaIterator &);
221
222 TriaIterator &
223 operator = (const TriaRawIterator &);
224 };
225
226
227 inline
228 TriaRawIterator::TriaRawIterator (const TriaRawIterator &i) :
229 accessor (i.accessor) {}
230
231 inline
232 TriaIterator::TriaIterator (const TriaIterator &i) :
233 TriaRawIterator (static_cast<TriaRawIterator >(i)) {}
234
235 inline
236 TriaRawIterator & TriaRawIterator::operator ++ () {
237 while (++accessor, (this->accessor.state() == 0))
238 if (this->accessor.used() == true)
239 return *this;
240 return *this;
241 }
242
243 struct Comp {
244 Comp (const Tensor &dir) : dir(dir) {}
245
246 bool operator () (const TriaIterator &c1, const TriaIterator &c2) const;
247 const Tensor dir;
248 };
249
250
251 template<typename Iter>
252 void x1(Iter first, Iter last, int i, Comp comp)
253 {
254 x1(Iter(), last, i, comp);
255 }
256
257 template<typename Iter>
258 inline void x2(Iter first, Iter last, Comp comp)
259 {
260 if (first.base() != last.base())
261 x1(first, last, (last - first), comp);
262 }
263
264 void downstream_dg (const Tensor& direction)
265 {
266 vector<TriaIterator> ordered_cells(13);
267 const Comp comparator(direction);
268
269 TriaIterator begin, end;
270
271 copy (begin, end, ordered_cells.begin());
272 x2 (ordered_cells.begin(), ordered_cells.begin(), comparator);
273 }