https://gcc.gnu.org/bugzilla/show_bug.cgi?id=62045

--- Comment #3 from Xi Ruoyao <ryxi at stu dot xidian.edu.cn> ---
Both Tobias' and my thought was wrong. In the entry of
__gnu_pbds::detail::binary_heap::push_heap, the array
m_a_entries[0..m_size-2] contains a heap, and
m_a_entries[m_size-1] contains the element being pushed
into the heap. So is_heap would return false most likely.
Then make_heap would be call and std::push_heap *won't* be
call.

It's easy to find out using gcov.

~~~
        -:  272:      void
      100:  273:      push_heap()
        -:  274:      {
      100:  275:        if (!is_heap())
       99:  276:          make_heap();
        -:  277:        else
        -:  278:          {
        1:  279:            const entry_cmp& m_cmp =
static_cast<entry_cmp&>(*this);
        1:  280:            entry_pointer end = m_a_entries + m_size;
        1:  281:            std::push_heap(m_a_entries, end, m_cmp);
        -:  282:          }
      100:  283:      }
~~~

This is certainly a bug making priority_queue::push O(n^2).
Since it works correctly in GCC 4.6, it's a regression.

Making a patch...

Reply via email to