http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59926
--- Comment #2 from Patrick Arnoux <arnoux123 at gmail dot com> --- (In reply to Jonathan Wakely from comment #1) > This looks like PR 57176 Thank you for the reference to PR 57676. Delving into this a bit further, I found the following: Derived f(Derived d) { return (d) ; } Derived g(Derived& d) { Derived e = d ; return (e) ; } Derived h(Derived d) { Derived e = d ; return (e) ; } Derived r ; Derived u ; u = f(r) ; // (A) Move Ctor to TmpObj, then Move Assign to u. u = g(r) ; // (B) Move Assign to u (No move ctor) u = h(r) ; // (C) Move Assign to u Derived v = h(r) ; // (D) straight up 'rvo' I would have expected case A to behave like B and C and I would ask if case D could eliminate rvo and do a Move Ctor instead, would that simplify the code generation.