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
5
6struct Iterator {
7    int * ptr;
8
9    Iterator(int * i) : ptr(i) { }
10    void operator++() { ++ptr; }
11    int *const & base() const { return ptr; }
12};
13
14
15Iterator find_7(Iterator first, Iterator last)
16{
17  int trip_count  = (last.base() - first.base()) >> 1;
18
19  for ( ; trip_count > 0 ; --trip_count) {
20    if (*first.ptr == 7) return first;
21    ++first;
22
23    if (*first.ptr == 7) return first;
24    ++first;
25  }
26
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  }
35}
36
37int main() {
38  int as[5] = {4,4,4,4,7};
39  return (find_7(Iterator(&as[0]), Iterator(&as[5])).ptr == &as[5]);
40};
41
42