Commit 6cb1ef51 by Jason Merrill Committed by Jason Merrill

re PR c++/50512 (surprising change in overloading resolution)

	PR c++/50512
	* call.c (compare_ics): Only consider rvaluedness_matches_p
	if the target type is the same or it too differs in rvalueness.

From-SVN: r179208
parent 31fd727b
2011-09-26 Jason Merrill <jason@redhat.com>
PR c++/50512
* call.c (compare_ics): Only consider rvaluedness_matches_p
if the target type is the same or it too differs in rvalueness.
PR c++/50523
* call.c (implicit_conversion): Mask out inappropriate LOOKUP
flags at the top of the function.
......
......@@ -7864,18 +7864,25 @@ compare_ics (conversion *ics1, conversion *ics2)
types to which the references refer are the same type except for
top-level cv-qualifiers, and the type to which the reference
initialized by S2 refers is more cv-qualified than the type to
which the reference initialized by S1 refers */
which the reference initialized by S1 refers.
DR 1328 [over.match.best]: the context is an initialization by
conversion function for direct reference binding (13.3.1.6) of a
reference to function type, the return type of F1 is the same kind of
reference (i.e. lvalue or rvalue) as the reference being initialized,
and the return type of F2 is not. */
if (ref_conv1 && ref_conv2)
{
if (!ref_conv1->this_p && !ref_conv2->this_p)
if (!ref_conv1->this_p && !ref_conv2->this_p
&& (ref_conv1->rvaluedness_matches_p
!= ref_conv2->rvaluedness_matches_p)
&& (same_type_p (ref_conv1->type, ref_conv2->type)
|| (TYPE_REF_IS_RVALUE (ref_conv1->type)
!= TYPE_REF_IS_RVALUE (ref_conv2->type))))
{
if (ref_conv1->rvaluedness_matches_p
> ref_conv2->rvaluedness_matches_p)
return 1;
if (ref_conv2->rvaluedness_matches_p
> ref_conv1->rvaluedness_matches_p)
return -1;
return (ref_conv1->rvaluedness_matches_p
- ref_conv2->rvaluedness_matches_p);
}
if (same_type_ignoring_top_level_qualifiers_p (to_type1, to_type2))
......
2011-09-26 Jason Merrill <jason@redhat.com>
PR c++/50512
* g++.dg/overload/rvalue3.C: New.
PR c++/50523
* g++.dg/overload/ref-conv2.C: New.
......
// PR c++/50512
void foo (const char *const& s);
template<typename C> void foo (const C& x) { x.a; }
void f () {
foo ("abc");
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment