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&.
This commit is contained in:
parent
b258e263e0
commit
d909ead682
2 changed files with 9 additions and 7 deletions
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@ template<int I>
|
|||
struct index
|
||||
{};
|
||||
|
||||
constexpr int recursive_impl(index<0u>)
|
||||
constexpr int recursive_impl(const index<0u>&)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue