diff options
Diffstat (limited to 'toolchain-layer/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99308.patch')
-rw-r--r-- | toolchain-layer/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99308.patch | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/toolchain-layer/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99308.patch b/toolchain-layer/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99308.patch new file mode 100644 index 0000000000..bf35a2ed4e --- /dev/null +++ b/toolchain-layer/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99308.patch @@ -0,0 +1,112 @@ +2010-07-15 Jie Zhang <jie@codesourcery.com> + + Backport from mainline (originally from Sourcery G++ 4.4): + + gcc/cp/ + 2010-04-07 Jie Zhang <jie@codesourcery.com> + + PR c++/42556 + * typeck2.c (split_nonconstant_init_1): Drop empty CONSTRUCTOR + when all of its elements are non-constant and have been split out. + + gcc/testsuite/ + 2010-04-07 Jie Zhang <jie@codesourcery.com> + + PR c++/42556 + * g++.dg/init/pr42556.C: New test. + + 2010-07-12 Yao Qi <yao@codesourcery.com> + + Merge from Sourcery G++ 4.4: + +=== modified file 'gcc/cp/typeck2.c' +--- old/gcc/cp/typeck2.c 2010-02-23 18:32:20 +0000 ++++ new/gcc/cp/typeck2.c 2010-07-30 14:05:57 +0000 +@@ -549,13 +549,15 @@ + expression to which INIT should be assigned. INIT is a CONSTRUCTOR. */ + + static void +-split_nonconstant_init_1 (tree dest, tree init) ++split_nonconstant_init_1 (tree dest, tree *initp) + { + unsigned HOST_WIDE_INT idx; ++ tree init = *initp; + tree field_index, value; + tree type = TREE_TYPE (dest); + tree inner_type = NULL; + bool array_type_p = false; ++ HOST_WIDE_INT num_type_elements, num_initialized_elements; + + switch (TREE_CODE (type)) + { +@@ -567,6 +569,7 @@ + case RECORD_TYPE: + case UNION_TYPE: + case QUAL_UNION_TYPE: ++ num_initialized_elements = 0; + FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (init), idx, + field_index, value) + { +@@ -589,12 +592,13 @@ + sub = build3 (COMPONENT_REF, inner_type, dest, field_index, + NULL_TREE); + +- split_nonconstant_init_1 (sub, value); ++ split_nonconstant_init_1 (sub, &value); + } + else if (!initializer_constant_valid_p (value, inner_type)) + { + tree code; + tree sub; ++ HOST_WIDE_INT inner_elements; + + /* FIXME: Ordered removal is O(1) so the whole function is + worst-case quadratic. This could be fixed using an aside +@@ -617,9 +621,22 @@ + code = build2 (INIT_EXPR, inner_type, sub, value); + code = build_stmt (input_location, EXPR_STMT, code); + add_stmt (code); ++ ++ inner_elements = count_type_elements (inner_type, true); ++ if (inner_elements < 0) ++ num_initialized_elements = -1; ++ else if (num_initialized_elements >= 0) ++ num_initialized_elements += inner_elements; + continue; + } + } ++ ++ num_type_elements = count_type_elements (type, true); ++ /* If all elements of the initializer are non-constant and ++ have been split out, we don't need the empty CONSTRUCTOR. */ ++ if (num_type_elements > 0 ++ && num_type_elements == num_initialized_elements) ++ *initp = NULL; + break; + + case VECTOR_TYPE: +@@ -655,7 +672,7 @@ + if (TREE_CODE (init) == CONSTRUCTOR) + { + code = push_stmt_list (); +- split_nonconstant_init_1 (dest, init); ++ split_nonconstant_init_1 (dest, &init); + code = pop_stmt_list (code); + DECL_INITIAL (dest) = init; + TREE_READONLY (dest) = 0; + +=== added file 'gcc/testsuite/g++.dg/init/pr42556.C' +--- old/gcc/testsuite/g++.dg/init/pr42556.C 1970-01-01 00:00:00 +0000 ++++ new/gcc/testsuite/g++.dg/init/pr42556.C 2010-07-30 14:05:57 +0000 +@@ -0,0 +1,10 @@ ++// { dg-do compile } ++// { dg-options "-fdump-tree-gimple" } ++ ++void foo (int a, int b, int c, int d) ++{ ++ int v[4] = {a, b, c, d}; ++} ++ ++// { dg-final { scan-tree-dump-not "v = {}" "gimple" } } ++// { dg-final { cleanup-tree-dump "gimple" } } + |