aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@airs.com>2005-08-16 22:07:44 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2005-08-16 22:07:44 +0000
commitcf0efa6a7633deb6a80e7219575b2fdfb69e2c27 (patch)
treea61d00d65e5140666f1fdfd18aab7570654f4aea
parent3a69437a558c349d1ddfbf8a38a91b914bcb092b (diff)
downloadgcc-cf0efa6a7633deb6a80e7219575b2fdfb69e2c27.zip
gcc-cf0efa6a7633deb6a80e7219575b2fdfb69e2c27.tar.gz
gcc-cf0efa6a7633deb6a80e7219575b2fdfb69e2c27.tar.bz2
re PR c++/23337 (ICE initializing array of vectors in C++)
./ PR c++/23337 * gimplify.c (gimplify_init_ctor_eval): If we see an element of vector type, don't try to construct it element by element. Add an assertion that we use a FIELD_DECL when building a COMPONENT_REF. testsuite/ PR c++/23337 * g++.dg/ext/vector2.C: New. From-SVN: r103177
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/gimplify.c10
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/ext/vector2.C12
4 files changed, 31 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2b40c63..e010e78 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2005-08-16 Ian Lance Taylor <ian@airs.com>
+
+ PR c++/23337
+ * gimplify.c (gimplify_init_ctor_eval): If we see an element of
+ vector type, don't try to construct it element by element. Add an
+ assertion that we use a FIELD_DECL when building a COMPONENT_REF.
+
2005-08-16 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
* fold-const.c (fold_ternary): Simplify folding of a CALL_EXPR.
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index a1ef22e..41ca3b3 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -2593,10 +2593,14 @@ gimplify_init_ctor_eval (tree object, VEC(constructor_elt,gc) *elts,
purpose, NULL_TREE, NULL_TREE);
}
else
- cref = build (COMPONENT_REF, TREE_TYPE (purpose),
- unshare_expr (object), purpose, NULL_TREE);
+ {
+ gcc_assert (TREE_CODE (purpose) == FIELD_DECL);
+ cref = build (COMPONENT_REF, TREE_TYPE (purpose),
+ unshare_expr (object), purpose, NULL_TREE);
+ }
- if (TREE_CODE (value) == CONSTRUCTOR)
+ if (TREE_CODE (value) == CONSTRUCTOR
+ && TREE_CODE (TREE_TYPE (value)) != VECTOR_TYPE)
gimplify_init_ctor_eval (cref, CONSTRUCTOR_ELTS (value),
pre_p, cleared);
else
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 179e2dc..043d4c7 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2005-08-16 Ian Lance Taylor <ian@airs.com>
+
+ PR c++/23337
+ * g++.dg/ext/vector2.C: New.
+
2005-08-16 Thomas Koenig <Thomas.Koenig@online.de>
PR libfortran/23428
diff --git a/gcc/testsuite/g++.dg/ext/vector2.C b/gcc/testsuite/g++.dg/ext/vector2.C
new file mode 100644
index 0000000..d93257b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/vector2.C
@@ -0,0 +1,12 @@
+// PR c++/23337; caused an ICE in component_ref_field_offset
+// { dg-options "" }
+// { dg-options "-mmmx" { target { i?86-*-* && ilp32 } } } */
+// { dg-options "-mmmx" { target { x86_64-*-* && ilp32 } } } */
+typedef int vec __attribute__ ((vector_size (8)));
+extern int bar (vec);
+int
+foo (int i)
+{
+ vec a[] = { (vec) { 0, i }, (vec) { 4, 5 } };
+ return bar (a[0]) + bar (a[1]);
+}