| // { dg-do run } |
| // { dg-options "-O2" } |
| // We used to mis-compile this testcase as we did not know that |
| // &a+offsetof(b,a) was the same as &a.b |
| |
| struct Iterator { |
| int * ptr; |
| |
| Iterator(int * i) : ptr(i) { } |
| void operator++() { ++ptr; } |
| int *const & base() const { return ptr; } |
| }; |
| |
| |
| Iterator find_7(Iterator first, Iterator last) |
| { |
| int trip_count = (last.base() - first.base()) >> 1; |
| |
| for ( ; trip_count > 0 ; --trip_count) { |
| if (*first.ptr == 7) return first; |
| ++first; |
| |
| if (*first.ptr == 7) return first; |
| ++first; |
| } |
| |
| switch(last.base() - first.base()) { |
| case 1: |
| if (*first.ptr == 7) return first; |
| ++first; |
| case 0: |
| default: |
| return last; |
| } |
| } |
| |
| int main() { |
| int as[5] = {4,4,4,4,7}; |
| return (find_7(Iterator(&as[0]), Iterator(&as[5])).ptr == &as[5]); |
| }; |
| |