Commit dd35aac7 by Jason Merrill Committed by Jason Merrill

Core 1232

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

From-SVN: r171614
parent 159177a1
2011-03-28 Jason Merrill <jason@redhat.com> 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 * call.c (reference_binding): Allow direct binding to an array
rvalue. rvalue.
......
...@@ -801,6 +801,53 @@ build_aggr_conv (tree type, tree ctor, int flags) ...@@ -801,6 +801,53 @@ build_aggr_conv (tree type, tree ctor, int flags)
return c; 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 /* Build a representation of the identity conversion from EXPR to
itself. The TYPE should match the type of EXPR, if EXPR is non-NULL. */ 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, ...@@ -1623,6 +1670,8 @@ implicit_conversion (tree to, tree from, tree expr, bool c_cast_p,
return conv; return conv;
} }
} }
else if (TREE_CODE (to) == ARRAY_TYPE)
return build_array_conv (to, expr, flags);
} }
if (expr != NULL_TREE if (expr != NULL_TREE
......
2011-03-28 Jason Merrill <jason@redhat.com> 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/initlist-array1.C: New.
* g++.dg/cpp0x/constexpr-compound.C: New. * g++.dg/cpp0x/constexpr-compound.C: New.
......
// { 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});
}
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