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)
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

index bc369c68c5a63ade9cd97b2e42712591951ab05c..0ba0e19ae0849b70bea2cb02b03622dcc1e3a5ce 100644 (file)
@@ -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;
 }
 
index 46d18594c949a5d0d90a021999714b80ae3414dd..0cd614cceeb0f0ced0f2891fb51ef387e173a806 100644 (file)
@@ -5,7 +5,7 @@ template<int I>
 struct index
 {};
 
-constexpr int recursive_impl(index<0u>)
+constexpr int recursive_impl(const index<0u>&)
 {
   return 0;
 }