Merge reload-branch up to revision 101000
[official-gcc.git] / gcc / testsuite / g++.dg / opt / pr14029.C
blob1673edfd615e309872386c8d997b4c5b4a355d73
1 // { dg-do run }
2 // { dg-options "-O2" }
3 // We used to mis-compile this testcase as we did not know that
4 // &a+offsetof(b,a) was the same as &a.b
6 struct Iterator {
7     int * ptr;
9     Iterator(int * i) : ptr(i) { }
10     void operator++() { ++ptr; }
11     int *const & base() const { return ptr; }
15 Iterator find_7(Iterator first, Iterator last)
17   int trip_count  = (last.base() - first.base()) >> 1;
19   for ( ; trip_count > 0 ; --trip_count) {
20     if (*first.ptr == 7) return first;
21     ++first;
23     if (*first.ptr == 7) return first;
24     ++first;
25   }
27   switch(last.base() - first.base()) {
28     case 1:
29           if (*first.ptr == 7) return first;
30           ++first;
31     case 0:
32     default:
33           return last;
34   }
37 int main() {
38   int as[5] = {4,4,4,4,7};
39   return (find_7(Iterator(&as[0]), Iterator(&as[5])).ptr == &as[5]);