https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77733

Jonathan Wakely <redi at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2016-09-28
     Ever confirmed|0                           |1

--- Comment #2 from Jonathan Wakely <redi at gcc dot gnu.org> ---
The location for the "cannot bind rvalue reference" error is not a rich
location, so I couldn't figure out how to add a proper fix-it.

This just adds "did you mean std::move(x)?" to the end:

--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -6804,7 +6804,8 @@ convert_like_real (conversion *convs, tree expr, tree fn,
int argnum,
            if (TYPE_REF_IS_RVALUE (ref_type)
                && lvalue_p (expr))
              error_at (loc, "cannot bind rvalue reference of type %qT to "
-                        "lvalue of type %qT", totype, extype);
+                        "lvalue of type %qT; did you mean %<std::move(%E)%>?",
+                        totype, extype, expr);
            else if (!TYPE_REF_IS_RVALUE (ref_type) && !lvalue_p (expr)
                     && !CP_TYPE_CONST_NON_VOLATILE_P (TREE_TYPE (ref_type)))
              error_at (loc, "cannot bind non-const lvalue reference of "

Of course sometimes std::move is not the right fix, and it should be
std::forward<something>(x) instead. Maybe it would be possible to detect
whether the expression is a function parameter declared as a forwarding
reference, but that's probably beyond my ken.

Also, if the lvalue is cv-qualified this still suggests std::move(x) even when
that wouldn't work:

move2.cc:13:9: error: cannot bind rvalue reference of type ‘X&&’ to lvalue of
type ‘const X’; did you mean ‘std::move(x)’? 


There's room for improvement.

Reply via email to