re PR c++/49267 (Ambiguity with conversion functions "T&" and "T&&", initializing a "T&&")
PR c++/49267 PR c++/49458 DR 1328 * call.c (reference_binding): Set rvaluedness_matches_p properly for reference to function conversion ops. (compare_ics): Adjust. From-SVN: r178520
This commit is contained in:
parent
fd3faf2b21
commit
0ad2cde83d
@ -1,5 +1,12 @@
|
||||
2011-09-04 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/49267
|
||||
PR c++/49458
|
||||
DR 1328
|
||||
* call.c (reference_binding): Set rvaluedness_matches_p properly
|
||||
for reference to function conversion ops.
|
||||
(compare_ics): Adjust.
|
||||
|
||||
* class.c (trivial_default_constructor_is_constexpr): Rename from
|
||||
synthesized_default_constructor_is_constexpr.
|
||||
(type_has_constexpr_default_constructor): Adjust.
|
||||
|
@ -1652,6 +1652,10 @@ reference_binding (tree rto, tree rfrom, tree expr, bool c_cast_p, int flags)
|
||||
/* The top-level caller requested that we pretend that the lvalue
|
||||
be treated as an rvalue. */
|
||||
conv->rvaluedness_matches_p = TYPE_REF_IS_RVALUE (rto);
|
||||
else if (TREE_CODE (rfrom) == REFERENCE_TYPE)
|
||||
/* Handle rvalue reference to function properly. */
|
||||
conv->rvaluedness_matches_p
|
||||
= (TYPE_REF_IS_RVALUE (rto) == TYPE_REF_IS_RVALUE (rfrom));
|
||||
else
|
||||
conv->rvaluedness_matches_p
|
||||
= (TYPE_REF_IS_RVALUE (rto) == !is_lvalue);
|
||||
@ -7960,13 +7964,13 @@ compare_ics (conversion *ics1, conversion *ics2)
|
||||
|
||||
if (ref_conv1 && ref_conv2)
|
||||
{
|
||||
if (!ref_conv1->this_p && !ref_conv2->this_p
|
||||
&& (TYPE_REF_IS_RVALUE (ref_conv1->type)
|
||||
!= TYPE_REF_IS_RVALUE (ref_conv2->type)))
|
||||
if (!ref_conv1->this_p && !ref_conv2->this_p)
|
||||
{
|
||||
if (ref_conv1->rvaluedness_matches_p)
|
||||
if (ref_conv1->rvaluedness_matches_p
|
||||
> ref_conv2->rvaluedness_matches_p)
|
||||
return 1;
|
||||
if (ref_conv2->rvaluedness_matches_p)
|
||||
if (ref_conv2->rvaluedness_matches_p
|
||||
> ref_conv1->rvaluedness_matches_p)
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,11 @@
|
||||
2011-09-04 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/49267
|
||||
* g++.dg/cpp0x/rv-conv1.C: New.
|
||||
|
||||
DR 1328
|
||||
* g++.dg/cpp0x/rv-func3.C: New.
|
||||
|
||||
* g++.dg/cpp0x/constexpr-default-ctor.C: New.
|
||||
|
||||
PR c++/50248
|
||||
|
9
gcc/testsuite/g++.dg/cpp0x/rv-conv1.C
Normal file
9
gcc/testsuite/g++.dg/cpp0x/rv-conv1.C
Normal file
@ -0,0 +1,9 @@
|
||||
// PR c++/49267
|
||||
// { dg-options -std=c++0x }
|
||||
|
||||
struct X {
|
||||
operator int&();
|
||||
operator int&&();
|
||||
};
|
||||
|
||||
int&&x = X();
|
10
gcc/testsuite/g++.dg/cpp0x/rv-func3.C
Normal file
10
gcc/testsuite/g++.dg/cpp0x/rv-func3.C
Normal file
@ -0,0 +1,10 @@
|
||||
// DR 1328
|
||||
// { dg-options -std=c++0x }
|
||||
|
||||
template <class T> struct A {
|
||||
operator T&(); // #1
|
||||
operator T&&(); // #2
|
||||
};
|
||||
typedef int Fn();
|
||||
A<Fn> a;
|
||||
Fn&& f = a;
|
Loading…
Reference in New Issue
Block a user