On 3/11/19 6:56 PM, Marek Polacek wrote:
My recent patch caused us to call convert_for_initialization for a std:move's
argument to see if it would have succeeded had the returned expression been
just that argument.

That caused a bogus error in this test, because convert_for_initialization
might cause additional instantiations, and they might fail.  My first
version of the patch fixed this by adding "cp_unevaluated e;", preventing
add_pending_template from adding further instantiations, but I no longer think
that's the best fix, because in this case the argument isn't an id-expression,
and the implicit move wouldn't be performed, so we shouldn't warn.  Thus fixed
by making the maybe_warn_pessimizing_move condition more strict -- that fixes
both the bogus error and the bogus warning.  Specifically, make sure that the
argument is of form "(T &) &t" and not "(T &) (T *) &t" or similar.

Also add a test with template-ids.

Bootstrapped/regtested on x86_64-linux, ok for trunk?

2019-03-11  Marek Polacek  <pola...@redhat.com>

        PR c++/89660 - bogus error with -Wredundant-move.
        * typeck.c (maybe_warn_pessimizing_move): Only accept (T &) &arg
        as the std::move's argument.  Don't call convert_for_initialization
        when warn_redundant_move isn't on.

OK.

Jason

Reply via email to