Commit 6eb208a6 by Jason Merrill Committed by Jason Merrill

call.c (compare_ics): Do lvalue/rvalue reference binding comparison for ck_list, too.

	* call.c (compare_ics): Do lvalue/rvalue reference binding
	comparison for ck_list, too.

From-SVN: r164401
parent 6a78fd06
2010-09-18 Jason Merrill <jason@redhat.com>
* call.c (compare_ics): Do lvalue/rvalue reference binding
comparison for ck_list, too.
2010-09-15 Jason Merrill <jason@redhat.com> 2010-09-15 Jason Merrill <jason@redhat.com>
* semantics.c (finish_id_expression): Diagnose use of function * semantics.c (finish_id_expression): Diagnose use of function
......
...@@ -6859,9 +6859,8 @@ compare_ics (conversion *ics1, conversion *ics2) ...@@ -6859,9 +6859,8 @@ compare_ics (conversion *ics1, conversion *ics2)
/* We couldn't make up our minds; try to figure it out below. */ /* We couldn't make up our minds; try to figure it out below. */
} }
if (ics1->ellipsis_p || ics1->kind == ck_list) if (ics1->ellipsis_p)
/* Both conversions are ellipsis conversions or both are building a /* Both conversions are ellipsis conversions. */
std::initializer_list. */
return 0; return 0;
/* User-defined conversion sequence U1 is a better conversion sequence /* User-defined conversion sequence U1 is a better conversion sequence
...@@ -6870,16 +6869,24 @@ compare_ics (conversion *ics1, conversion *ics2) ...@@ -6870,16 +6869,24 @@ compare_ics (conversion *ics1, conversion *ics2)
ond standard conversion sequence of U1 is better than the second ond standard conversion sequence of U1 is better than the second
standard conversion sequence of U2. */ standard conversion sequence of U2. */
if (ics1->user_conv_p) /* Handle list-conversion with the same code even though it isn't always
ranked as a user-defined conversion and it doesn't have a second
standard conversion sequence; it will still have the desired effect.
Specifically, we need to do the reference binding comparison at the
end of this function. */
if (ics1->user_conv_p || ics1->kind == ck_list)
{ {
conversion *t1; conversion *t1;
conversion *t2; conversion *t2;
for (t1 = ics1; t1->kind != ck_user; t1 = t1->u.next) for (t1 = ics1; t1->kind != ck_user; t1 = t1->u.next)
if (t1->kind == ck_ambig || t1->kind == ck_aggr) if (t1->kind == ck_ambig || t1->kind == ck_aggr
|| t1->kind == ck_list)
break; break;
for (t2 = ics2; t2->kind != ck_user; t2 = t2->u.next) for (t2 = ics2; t2->kind != ck_user; t2 = t2->u.next)
if (t2->kind == ck_ambig || t2->kind == ck_aggr) if (t2->kind == ck_ambig || t2->kind == ck_aggr
|| t2->kind == ck_list)
break; break;
if (t1->kind != t2->kind) if (t1->kind != t2->kind)
......
2010-09-18 Jason Merrill <jason@redhat.com>
* g++.dg/cpp0x/initlist44.C: New.
2010-09-18 Richard Guenther <rguenther@suse.de> 2010-09-18 Richard Guenther <rguenther@suse.de>
PR tree-optimization/45709 PR tree-optimization/45709
......
// { dg-options -std=c++0x }
#include <initializer_list>
auto value = std::initializer_list<int>{ 1, 2, 3 };
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