This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug libstdc++/48038] [C++0x] stable_sort problem with C++0x and comparator by value


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48038

--- Comment #13 from Jonathan Wakely <redi at gcc dot gnu.org> 2011-03-09 11:43:00 UTC ---
gah - there was a bug in my reduced testcase, the move assignment operator
should have done:
      ok = rh.ok;
that was missing which is why Temporary_buffer left the first element !ok

The logic in __ucr is ok, sorry!

This one still fails (and only if the operator< takes args by value)

#include <algorithm>
#include <assert.h>

struct V
{
    int val;
    bool ok;

    V(int v) : val(v), ok(true) { } 

    V(V const & rh) : val(rh.val), ok(rh.ok) {
        // assert(rh.ok);
    }

    V & operator=(V const &rh) {
        // assert(rh.ok);
        val = rh.val;
        ok = rh.ok;
        return *this;
    }

    V(V && rh) : val(rh.val), ok(rh.ok) {
        // assert(rh.ok);
        rh.ok = false;
    }

    V & operator=(V && rh) {
        // assert(rh.ok);
        val = rh.val;
        ok = rh.ok;
        rh.ok = false;
        return *this;
    }

};


inline bool operator<(V lh, V rh) {
  assert(rh.ok);
  assert(lh.ok);
  return lh.val < rh.val;
}


int main()
{
   V vvs[] = { 2, 0, 1 };

   std::stable_sort(vvs, vvs+3);
}


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]