c++: Tweak PR969626 patch
authorJason Merrill <jason@redhat.com>
Fri, 19 Feb 2021 02:27:37 +0000 (21:27 -0500)
committerJason Merrill <jason@redhat.com>
Fri, 19 Feb 2021 04:01:03 +0000 (23:01 -0500)
commitd909ead68214042e9876a8df136d0835273d4b86
tree0608841f5780518ad27c2301f2f9374fb9b11760
parentb258e263e0d74ca1f76aeaac5f4d1abef6b13707
c++: Tweak PR969626 patch

It occurred to me that other types of conversions use rvaluedness_matches_p,
but those uses don't affect overload resolution, so we shouldn't look at the
flag for them.  Fixing that made decltype64.C compile successfully, because
the non-template candidate was a perfect match, so we now wouldn't consider
the broken template.  Changing the argument to const& makes it no longer a
perfect match (because of the added const), so we again get the infinite
recursion.

This illustrates the limited nature of this optimization/recursion break; it
works for most copy/move constructors because the constructor we're looking
for is almost always a perfect match.  If it happens to help improve compile
time for other calls, that's just a bonus.

gcc/cp/ChangeLog:

PR c++/96926
* call.c (perfect_conversion_p): Limit rvalueness
test to reference bindings.

gcc/testsuite/ChangeLog:

* g++.dg/cpp0x/decltype64.C: Change argument to const&.
gcc/cp/call.c
gcc/testsuite/g++.dg/cpp0x/decltype64.C