Core 1232

Core 1232
	* call.c (build_array_conv): New.
	(implicit_conversion): Use it.

From-SVN: r171614
This commit is contained in:
Jason Merrill 2011-03-28 12:14:22 -04:00 committed by Jason Merrill
parent 159177a154
commit dd35aac798
4 changed files with 67 additions and 0 deletions

View File

@ -1,5 +1,9 @@
2011-03-28 Jason Merrill <jason@redhat.com>
Core 1232
* call.c (build_array_conv): New.
(implicit_conversion): Use it.
* call.c (reference_binding): Allow direct binding to an array
rvalue.

View File

@ -801,6 +801,53 @@ build_aggr_conv (tree type, tree ctor, int flags)
return c;
}
/* Represent a conversion from CTOR, a braced-init-list, to TYPE, an
array type, if such a conversion is possible. */
static conversion *
build_array_conv (tree type, tree ctor, int flags)
{
conversion *c;
unsigned HOST_WIDE_INT len = CONSTRUCTOR_NELTS (ctor);
tree elttype = TREE_TYPE (type);
unsigned i;
tree val;
bool bad = false;
bool user = false;
enum conversion_rank rank = cr_exact;
if (TYPE_DOMAIN (type))
{
unsigned HOST_WIDE_INT alen = tree_low_cst (array_type_nelts_top (type), 1);
if (alen < len)
return NULL;
}
FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (ctor), i, val)
{
conversion *sub
= implicit_conversion (elttype, TREE_TYPE (val), val,
false, flags);
if (sub == NULL)
return NULL;
if (sub->rank > rank)
rank = sub->rank;
if (sub->user_conv_p)
user = true;
if (sub->bad_p)
bad = true;
}
c = alloc_conversion (ck_aggr);
c->type = type;
c->rank = rank;
c->user_conv_p = user;
c->bad_p = bad;
c->u.next = NULL;
return c;
}
/* Build a representation of the identity conversion from EXPR to
itself. The TYPE should match the type of EXPR, if EXPR is non-NULL. */
@ -1623,6 +1670,8 @@ implicit_conversion (tree to, tree from, tree expr, bool c_cast_p,
return conv;
}
}
else if (TREE_CODE (to) == ARRAY_TYPE)
return build_array_conv (to, expr, flags);
}
if (expr != NULL_TREE

View File

@ -1,5 +1,7 @@
2011-03-28 Jason Merrill <jason@redhat.com>
* g++.dg/cpp0x/initlist-array2.C: New.
* g++.dg/cpp0x/initlist-array1.C: New.
* g++.dg/cpp0x/constexpr-compound.C: New.

View File

@ -0,0 +1,12 @@
// { dg-options -std=c++0x }
typedef int IA[2];
typedef double DA[2];
void f(const IA&) { }
void f(const DA&);
int main()
{
f({1,2});
}