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

           Summary: stable_sort calls self-move-assignment operator
           Product: gcc
           Version: 4.6.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libstdc++
        AssignedTo: unassig...@gcc.gnu.org
        ReportedBy: joerg.rich...@pdv-fs.de


$ cat t.cc
#include <cassert>
#include <algorithm>
#include <iostream>

struct MyMoveClass
{
    int val_;

    explicit MyMoveClass( int val = 0 )
      : val_( val )
    {
      std::cout << "ctr this=" << this << std::endl;
    }

    MyMoveClass( MyMoveClass const& rhs )
      : val_( rhs.val_ )
    {
      std::cout << "ctr copy this=" << this << " rhs=" << &rhs << std::endl;
    }

    MyMoveClass( MyMoveClass && rhs )
      : val_( rhs.val_ )
    {
      std::cout << "ctr move this=" << this << " rhs=" << &rhs << std::endl;
      rhs.val_ = 0;
    }

    MyMoveClass& operator=( MyMoveClass && rhs )
    {
      std::cout << "assign move this=" << this << " rhs=" << &rhs << std::endl;
      assert( this != &rhs );
      val_ = rhs.val_;
      rhs.val_ = 0;
      return *this;
    }

    MyMoveClass& operator=( MyMoveClass const& rhs )
    {
      std::cout << "assign copy this=" << this << " rhs=" << &rhs << std::endl;
      val_ = rhs.val_;
      return *this;
    }

    ~MyMoveClass()
    {
      std::cout << "dtr this=" << this << std::endl;
    }

    bool operator<( MyMoveClass const& rhs ) const
    {
      return val_ < rhs.val_;
    }
};

int main()
{
  MyMoveClass v(5);
  std::stable_sort( &v, &v+1 );
  return 0;
}


$ g++ -std=gnu++0x -o t t.cc

$ ./t
ctr this=0xbfe1730c
ctr move this=0x8afd008 rhs=0xbfe1730c
assign move this=0xbfe1730c rhs=0x8afd008
assign move this=0xbfe1730c rhs=0xbfe1730c
template: template.cc:31: MyMoveClass& MyMoveClass::operator=(MyMoveClass&&):
Assertion `this != &rhs' failed.


>From DR 1204: "Additionally this clarifies that move assignment operators need
not perform the traditional if (this != &rhs) test commonly found (and needed)
in copy assignment operators."

Note that std::sort() calls no copy constructor or assignment operator at all. 
Seems sensible when there is only one element.

Reply via email to