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
This commit is contained in:
parent
31fd727b4d
commit
6cb1ef5143
4 changed files with 30 additions and 8 deletions
|
@ -1,5 +1,9 @@
|
|||
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))
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
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.
|
||||
|
||||
|
|
8
gcc/testsuite/g++.dg/overload/rvalue3.C
Normal file
8
gcc/testsuite/g++.dg/overload/rvalue3.C
Normal file
|
@ -0,0 +1,8 @@
|
|||
// PR c++/50512
|
||||
|
||||
void foo (const char *const& s);
|
||||
template<typename C> void foo (const C& x) { x.a; }
|
||||
|
||||
void f () {
|
||||
foo ("abc");
|
||||
}
|
Loading…
Add table
Reference in a new issue