------- Additional Comments From jakub at gcc dot gnu dot org 2005-01-12 18:30 ------- Tested to also test static initializers: typedef signed char v8qi __attribute__ ((vector_size (8)));
extern "C" void abort (void); static unsigned char S[16]; struct A { int i; v8qi j, k; int l; }; void foo (unsigned char v) { A a = { 1, { v, v, v, v, v, v, v, v }, { v + 1, v + 1, v + 1, v + 1, v + 1, v + 1, v + 1, v + 1 }, 3 }; v8qi *s = (v8qi *) &S[0]; *s = a.j; s[1] = a.k; } void bar (unsigned char v) { v8qi val8 = { v, v, v, v, v, v, v, v }; v8qi *s = (v8qi *) &S[0]; *s = val8; } int n = 5, cnt; int num (void) { ++cnt; return n; } void baz (void) { static A a = { 0, { num (), num (), num (), num (), 6, 6, 6, 6 }, { 7, 7, 7, 7, 8, 8, 8, 8 }, 0 }; v8qi *s = (v8qi *) &S[0]; *s = a.j; s[1] = a.k; } int main () { int i; foo (1); for (i = 0; i < 8; ++i) if (S[i] != 1) abort (); for (; i < 16; ++i) if (S[i] != 2) abort (); bar (3); for (i = 0; i < 8; ++i) if (S[i] != 3) abort (); baz (); if (cnt != 4) abort (); for (i = 0; i < 16; ++i) if (S[i] != 5 + (i / 4)) abort (); return 0; } Works with G++ 3.2.x, fails with 3.4.x and mainline, even with: --- typeck2.c.jj 2005-01-12 18:34:32.000000000 +0100 +++ typeck2.c 2005-01-12 19:19:28.602047217 +0100 @@ -348,8 +348,9 @@ split_nonconstant_init_1 (tree dest, tre case VECTOR_TYPE: if (!initializer_constant_valid_p (init, type)) { + tree cons = copy_node (init); CONSTRUCTOR_ELTS (init) = NULL; - code = build (MODIFY_EXPR, type, dest, init); + code = build (MODIFY_EXPR, type, dest, cons); code = build_stmt (EXPR_STMT, code); pcode = &TREE_CHAIN (code); } patch. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19263