aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2021-02-18 21:27:37 -0500
committerJason Merrill <jason@redhat.com>2021-02-18 23:01:03 -0500
commitd909ead68214042e9876a8df136d0835273d4b86 (patch)
tree0608841f5780518ad27c2301f2f9374fb9b11760 /gcc
parentb258e263e0d74ca1f76aeaac5f4d1abef6b13707 (diff)
downloadgcc-d909ead68214042e9876a8df136d0835273d4b86.zip
gcc-d909ead68214042e9876a8df136d0835273d4b86.tar.gz
gcc-d909ead68214042e9876a8df136d0835273d4b86.tar.bz2
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&.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/call.c14
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/decltype64.C2
2 files changed, 9 insertions, 7 deletions
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index bc369c6..0ba0e19 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -5864,12 +5864,14 @@ perfect_conversion_p (conversion *conv)
{
if (CONVERSION_RANK (conv) != cr_identity)
return false;
- if (!conv->rvaluedness_matches_p)
- return false;
- if (conv->kind == ck_ref_bind
- && !same_type_p (TREE_TYPE (conv->type),
- next_conversion (conv)->type))
- return false;
+ if (conv->kind == ck_ref_bind)
+ {
+ if (!conv->rvaluedness_matches_p)
+ return false;
+ if (!same_type_p (TREE_TYPE (conv->type),
+ next_conversion (conv)->type))
+ return false;
+ }
return true;
}
diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype64.C b/gcc/testsuite/g++.dg/cpp0x/decltype64.C
index 46d1859..0cd614c 100644
--- a/gcc/testsuite/g++.dg/cpp0x/decltype64.C
+++ b/gcc/testsuite/g++.dg/cpp0x/decltype64.C
@@ -5,7 +5,7 @@ template<int I>
struct index
{};
-constexpr int recursive_impl(index<0u>)
+constexpr int recursive_impl(const index<0u>&)
{
return 0;
}