On Fri, Aug 24, 2018 at 12:53 AM, Marek Polacek <pola...@redhat.com> wrote:
> On Thu, Aug 23, 2018 at 10:44:30AM -0400, Marek Polacek wrote:
>> +T
>> +fn3 (const T t)
>> +{
>> +  // t is const: will decay into move.
>> +  return t;
>> +}
>> +
>> +T
>> +fn4 (const T t)
>> +{
>> +  // t is const: will decay into move despite std::move, so it's redundant.
>> +  return std::move (t); // { dg-warning "redundant move in return 
>> statement" }
>> +}
>
> This should read "decay into copy".  We can't move from a const object.  
> Consider
> it fixed.

Well, we'll do the overload resolution as though t were an rvalue,
even though it's const; it's just unlikely to succeed, since a
constructor taking a const rvalue reference doesn't make much sense.

It occurs to me that the std::move might not be redundant in some
cases: for the implicit treatment as an rvalue, the return must select
a constructor that takes an rvalue reference to the returned object's
type.  With an explict std::move, that restriction doesn't apply.  So,
for

struct C { };
struct A {
  operator C() &;
  operator C() &&;
};

C f(A a)
{
  return a; // calls operator C()&
  return std::move(a); // calls operator C()&&
}

...though I see we currently get the first return wrong, and call the
rvalue overload for both.  I think there was a recent core issue in
this area, I'll try to find that later.

Anyway, I imagine this sort of example is rare enough that the warning
is still worth having; people doing this can use static_cast instead
or just turn off the warning.

BTW, Instead of using location_of (retval) in each diagnostic call,
let's put at the top of the function

  location_t loc = cp_expr_loc_or_loc (retval, input_location);

and use 'loc' in the diagnostics.  This is the pattern I generally mean to use.

Jason

Reply via email to