------- 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

Reply via email to