Commit 0ad2cde8 by Jason Merrill Committed by Jason Merrill

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
parent fd3faf2b
2011-09-04 Jason Merrill <jason@redhat.com> 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 * class.c (trivial_default_constructor_is_constexpr): Rename from
synthesized_default_constructor_is_constexpr. synthesized_default_constructor_is_constexpr.
(type_has_constexpr_default_constructor): Adjust. (type_has_constexpr_default_constructor): Adjust.
......
...@@ -1652,6 +1652,10 @@ reference_binding (tree rto, tree rfrom, tree expr, bool c_cast_p, int flags) ...@@ -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 /* The top-level caller requested that we pretend that the lvalue
be treated as an rvalue. */ be treated as an rvalue. */
conv->rvaluedness_matches_p = TYPE_REF_IS_RVALUE (rto); 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 else
conv->rvaluedness_matches_p conv->rvaluedness_matches_p
= (TYPE_REF_IS_RVALUE (rto) == !is_lvalue); = (TYPE_REF_IS_RVALUE (rto) == !is_lvalue);
...@@ -7960,13 +7964,13 @@ compare_ics (conversion *ics1, conversion *ics2) ...@@ -7960,13 +7964,13 @@ compare_ics (conversion *ics1, conversion *ics2)
if (ref_conv1 && ref_conv2) if (ref_conv1 && ref_conv2)
{ {
if (!ref_conv1->this_p && !ref_conv2->this_p 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->rvaluedness_matches_p) if (ref_conv1->rvaluedness_matches_p
> ref_conv2->rvaluedness_matches_p)
return 1; return 1;
if (ref_conv2->rvaluedness_matches_p) if (ref_conv2->rvaluedness_matches_p
> ref_conv1->rvaluedness_matches_p)
return -1; return -1;
} }
......
2011-09-04 Jason Merrill <jason@redhat.com> 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. * g++.dg/cpp0x/constexpr-default-ctor.C: New.
PR c++/50248 PR c++/50248
......
// PR c++/49267
// { dg-options -std=c++0x }
struct X {
operator int&();
operator int&&();
};
int&&x = X();
// 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;
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