------- Comment #4 from giecrilj at stegny dot 2a dot pl 2010-09-01 22:34 ------- == Test case ==
#include <cassert> #include <algorithm> namespace BUG45488 { class my_iter: public std:: iterator <std:: random_access_iterator_tag, char const > { private: typedef my_iter ref; private: pointer m_ptr; public: typedef std:: less <value_type > compare; public: my_iter (pointer p_ptr): m_ptr (p_ptr) {} public: operator pointer (void) const { return this -> m_ptr; } public: ref operator ++ (void) { ++this -> m_ptr; return *this; } public: ref operator += (difference_type p_d) { this -> m_ptr += p_d; return *this; }}; void test (void) { static char const sc_test [] = { 'a', 'c' }; assert (std:: lower_bound (my_iter (sc_test), my_iter ((&sc_test) [01]), 'a') == my_iter (sc_test)); assert (std:: lower_bound (my_iter (sc_test), my_iter ((&sc_test) [01]), 'a', my_iter:: compare ()) == my_iter (sc_test)); assert (std:: upper_bound (my_iter (sc_test), my_iter ((&sc_test) [01]), 'a') == my_iter (sc_test) + 01); assert (std:: upper_bound (my_iter (sc_test), my_iter ((&sc_test) [01]), 'a', my_iter:: compare ()) == my_iter (sc_test) + 01); } } == Patch == *** /usr/include/c++/4.4/bits/stl_algo.h 2009-10-23 23:19:15.000000000 +0200 --- bits/stl_algo.h 2010-09-02 00:13:09.200742054 +0200 *************** _GLIBCXX_BEGIN_NAMESPACE(std) *** 2432,2443 **** _DistanceType __len = std::distance(__first, __last); _DistanceType __half; - _ForwardIterator __middle; while (__len > 0) { __half = __len >> 1; - __middle = __first; std::advance(__middle, __half); if (*__middle < __val) { --- 2432,2442 ---- _DistanceType __len = std::distance(__first, __last); _DistanceType __half; while (__len > 0) { + _ForwardIterator __middle = __first; __half = __len >> 1; std::advance(__middle, __half); if (*__middle < __val) { *************** _GLIBCXX_BEGIN_NAMESPACE(std) *** 2485,2496 **** _DistanceType __len = std::distance(__first, __last); _DistanceType __half; - _ForwardIterator __middle; while (__len > 0) { __half = __len >> 1; - __middle = __first; std::advance(__middle, __half); if (__comp(*__middle, __val)) { --- 2484,2494 ---- _DistanceType __len = std::distance(__first, __last); _DistanceType __half; while (__len > 0) { + _ForwardIterator __middle = __first; __half = __len >> 1; std::advance(__middle, __half); if (__comp(*__middle, __val)) { *************** _GLIBCXX_BEGIN_NAMESPACE(std) *** 2532,2543 **** _DistanceType __len = std::distance(__first, __last); _DistanceType __half; - _ForwardIterator __middle; while (__len > 0) { __half = __len >> 1; - __middle = __first; std::advance(__middle, __half); if (__val < *__middle) __len = __half; --- 2530,2540 ---- _DistanceType __len = std::distance(__first, __last); _DistanceType __half; while (__len > 0) { + _ForwardIterator __middle = __first; __half = __len >> 1; std::advance(__middle, __half); if (__val < *__middle) __len = __half; *************** _GLIBCXX_BEGIN_NAMESPACE(std) *** 2585,2596 **** _DistanceType __len = std::distance(__first, __last); _DistanceType __half; - _ForwardIterator __middle; while (__len > 0) { __half = __len >> 1; - __middle = __first; std::advance(__middle, __half); if (__comp(__val, *__middle)) __len = __half; --- 2582,2592 ---- _DistanceType __len = std::distance(__first, __last); _DistanceType __half; while (__len > 0) { + _ForwardIterator __middle = __first; __half = __len >> 1; std::advance(__middle, __half); if (__comp(__val, *__middle)) __len = __half; -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45488