aboutsummaryrefslogtreecommitdiffstats
path: root/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0032-Core-1232.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0032-Core-1232.patch')
-rw-r--r--meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0032-Core-1232.patch95
1 files changed, 95 insertions, 0 deletions
diff --git a/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0032-Core-1232.patch b/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0032-Core-1232.patch
new file mode 100644
index 0000000000..484d2014b5
--- /dev/null
+++ b/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0032-Core-1232.patch
@@ -0,0 +1,95 @@
+From 1370bfdaf3735fc1038436cfc86b7cfe43d3eaf0 Mon Sep 17 00:00:00 2001
+From: jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
+Date: Tue, 29 Mar 2011 14:26:10 +0000
+Subject: [PATCH 032/200] Core 1232
+ * call.c (build_array_conv): New.
+ (implicit_conversion): Use it.
+
+git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_6-branch@171673 138bc75d-0d04-0410-961f-82ee72b054a4
+
+index 2ff3745..c84e6fc 100644
+--- a/gcc/cp/call.c
++++ b/gcc/cp/call.c
+@@ -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
+new file mode 100644
+index 0000000..19eec33
+--- /dev/null
++++ b/gcc/testsuite/g++.dg/cpp0x/initlist-array2.C
+@@ -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});
++}
+--
+1.7.0.4
+