| // PR c++/19263 |
| // { dg-do run } |
| // { dg-options "-O2 -fpermissive" } |
| // { dg-prune-output "narrowing" } |
| |
| 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 (); |
| return 0; |
| baz (); |
| if (cnt != 4) |
| abort (); |
| for (i = 0; i < 16; ++i) |
| if (S[i] != 5 + (i / 4)) |
| abort (); |
| return 0; |
| } |