diff options
author | Ian Lance Taylor <ian@airs.com> | 2005-08-16 22:07:44 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2005-08-16 22:07:44 +0000 |
commit | cf0efa6a7633deb6a80e7219575b2fdfb69e2c27 (patch) | |
tree | a61d00d65e5140666f1fdfd18aab7570654f4aea | |
parent | 3a69437a558c349d1ddfbf8a38a91b914bcb092b (diff) | |
download | gcc-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/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/gimplify.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/vector2.C | 12 |
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]); +} |