http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49559
--- Comment #12 from Paolo Carlini <paolo.carlini at oracle dot com> 2011-06-28 18:06:54 UTC --- I'm looking at __merge_adaptive and it seems to me that self move assignment can happen very generically. Consider: if (__len1 <= __len2 && __len1 <= __buffer_size) { _Pointer __buffer_end = _GLIBCXX_MOVE3(__first, __middle, __buffer); std::__move_merge(__buffer, __buffer_end, __middle, __last, __first); } here __first comes in memory before __middle and when __move_merge has filled all the positions before __middle then any element can be move assigned from itself. Of course we could always move to the buffer the entire range __first, __last. Still looking for Chris' opinion on this, he updated this code to move instead of copy...