On Fri, Aug 24, 2018 at 12:53 AM, Marek Polacek <[email protected]> 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