From d909ead68214042e9876a8df136d0835273d4b86 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Thu, 18 Feb 2021 21:27:37 -0500 Subject: [PATCH] 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 | 14 ++++++++------ gcc/testsuite/g++.dg/cpp0x/decltype64.C | 2 +- 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 struct index {}; -constexpr int recursive_impl(index<0u>) +constexpr int recursive_impl(const index<0u>&) { return 0; } -- 2.7.4