On Mon, 2018-08-20 at 17:08 -0400, Marek Polacek wrote:
> This patch implements -Wpessimizing-move, a C++-specific warning that
> warns
> when using std::move in a return statement precludes the
> NRVO.  Consider:
> 
> struct T { };
> 
> T f()
> {
>   T t;
>   return std::move(t);
> }
> 
> where we could elide the copy were it not for the move call; the
> standard
> requires that the expression be the name of a non-volatile automatic
> object, so
> no function call would work there.
> Had 't' been a parameter, the move would have been merely redundant,
> but that's
> for another warning, -Wredundant-move, which should be a fairly easy
> extension
> of this one.
> 
> Bootstrapped/regtested on x86_64-linux, ok for trunk?

[...snip...]

> +       /* Warn if we could do copy elision were it not for the
> move.  */
> +       if (can_do_nrvo_p (arg, functype)
> +           && warning (OPT_Wpessimizing_move, "moving a local object "
> +                       "in a return statement prevents copy elision"))
> +         inform (input_location, "remove %<std::move%> call");
> +     }
> +    }

As of r263675 it's now possible to tell the diagnostics subsystem that
the warning and note are related by using an auto_diagnostic_group
instance [1], so please can this read:

          if (can_do_nrvo_p (arg, functype))
            {
              auto_diagnostic_group d;
              if (warning (OPT_Wpessimizing_move, "moving a local object "
                           "in a return statement prevents copy elision"))
                inform (input_location, "remove %<std::move%> call");
            }

Dave

[1] see https://gcc.gnu.org/ml/gcc-patches/2018-08/msg01190.html

Not that this does much yet, but I'm hoping to make it do so,
especially for cases like this where both diagnostics share the same
location

Reply via email to