<div dir="ltr"><div class="gmail_quote"><div dir="ltr">On Tue, Sep 25, 2018 at 5:08 AM Richard Smith via cfe-dev <<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="auto"><div><div class="gmail_quote"><div dir="ltr">On Mon, 24 Sep 2018, 20:40 Richard Trieu via cfe-dev, <<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr">+ Erik, who implemented DR1579<br><div><br></div><div>Originally, I had the warning similar to GCC's warning, but took it out due to not having DR1579 implemented in clang (warning changed in r243594)</div><div><br></div><div>Erik in r274291 implemented DR1579, although PR27785 didn't mention anything about std::move<br></div><div><br></div><div>It looks like what's happening is that Clang and GCC handles the return differently.  Clang needs the std::move call to use the move constructor while GCC will use the move constructor with or without the std::move call.  This means that the warning is currently correct when running on either compiler.</div><div><br></div><div>This is a reduced example.  Compiled with Clang, it will print "move constructor" then "copy constructor".  GCC will print "move constructor" twice.</div></div></div></div></div></div></blockquote></div></div><div dir="auto"><br></div><div dir="auto">GCC gets the rule "wrong". The rule in question (<a href="http://eel.is/c++draft/class.copy.elision#3.sentence-2" target="_blank">http://eel.is/c++draft/class.copy.elision#3.sentence-2</a>) only applies when the selected B constructor takes A&& as its parameter type.</div><div dir="auto"><br></div></div></blockquote><div>But the rule gets the rule wrong too -- EWG wants that condition removed, so that it's never necessary to write</div><div>  return std::move(local_var);</div><div><br></div><div>I think the rule was written as it is to avoid breaking (obscure) working code, but before we had sufficient experience with rvalue references to understand how reasonable it is to pass by value in such cases.  The time has come to simplify it.</div><div><br></div><div>I have a patch in progress, but lacked the time to finish updating test cases etc.  (And I'm on vacation right now.)</div><div><br></div><div>-- James </div></div></div>