| /* PR tree-optimization/97027 - missing warning on buffer overflow storing |
| a larger scalar into a smaller array |
| Verify overflow by vector stores. |
| { dg-do compile } |
| { dg-options "-O2 -Wno-psabi" } */ |
| |
| #define V(N) __attribute__ ((vector_size (N))) |
| #define C1 (VC1){ 0 } |
| #define C2 (VC2){ 0, 1 } |
| #define C4 (VC4){ 0, 1, 2, 3 } |
| #define C8 (VC8){ 0, 1, 2, 3, 4, 5, 6, 7 } |
| #define C16 (VC16){ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 } |
| |
| typedef V (1) char VC1; |
| typedef V (2) char VC2; |
| typedef V (4) char VC4; |
| typedef V (8) char VC8; |
| typedef V (16) char VC16; |
| |
| extern char a1[1], a2[2], a3[3], a4[4], a5[5], a6[6], a7[7], a8[8], a15[15]; |
| |
| extern VC1 c1; |
| extern VC2 c2; |
| extern VC4 c4; |
| extern VC8 c8; |
| extern VC16 c16; |
| |
| extern VC1 fc1 (void); |
| extern VC2 fc2 (void); |
| extern VC4 fc4 (void); |
| extern VC8 fc8 (void); |
| extern VC16 fc16 (void); |
| |
| void nowarn (void) |
| { |
| *(VC1*)a1 = C1; |
| *(VC2*)a2 = C2; |
| *(VC4*)a4 = C4; |
| *(VC4*)a5 = C4; |
| *(VC4*)a6 = C4; |
| *(VC4*)a7 = C4; |
| *(VC8*)a8 = C8; |
| *(VC8*)a15 = C8; |
| } |
| |
| void warn_vec_lit (void) |
| { |
| *(VC2*)a1 = C2; // { dg-warning "writing 2 bytes into a region of size 1" } |
| *(VC4*)a2 = C4; // { dg-warning "writing 4 bytes into a region of size 2" } |
| *(VC4*)a3 = C4; // { dg-warning "writing 4 bytes into a region of size 3" } |
| *(VC8*)a4 = C8; // { dg-warning "writing 8 bytes into a region of size 4" } |
| *(VC8*)a7 = C8; // { dg-warning "writing 8 bytes into a region of size 7" } |
| *(VC16*)a15 = C16; // { dg-warning "writing 16 bytes into a region of size 15" } |
| } |
| |
| void warn_vec_decl (void) |
| { |
| *(VC2*)a1 = c2; // { dg-warning "writing 2 bytes into a region of size 1" } |
| *(VC4*)a2 = c4; // { dg-warning "writing 4 bytes into a region of size 2" } |
| *(VC4*)a3 = c4; // { dg-warning "writing 4 bytes into a region of size 3" } |
| *(VC8*)a4 = c8; // { dg-warning "writing 8 bytes into a region of size 4" } |
| *(VC8*)a7 = c8; // { dg-warning "writing 8 bytes into a region of size 7" } |
| *(VC16*)a15 = c16; // { dg-warning "writing 16 bytes into a region of size 15" } |
| } |
| |
| void warn_vec_parm (VC2 pc2, VC4 pc4, VC8 pc8, VC16 pc16) |
| { |
| *(VC2*)a1 = pc2; // { dg-warning "writing 2 bytes into a region of size 1" } |
| *(VC4*)a2 = pc4; // { dg-warning "writing 4 bytes into a region of size 2" } |
| *(VC4*)a3 = pc4; // { dg-warning "writing 4 bytes into a region of size 3" } |
| *(VC8*)a4 = pc8; // { dg-warning "writing 8 bytes into a region of size 4" } |
| *(VC8*)a7 = pc8; // { dg-warning "writing 8 bytes into a region of size 7" } |
| *(VC16*)a15 = pc16; // { dg-warning "writing 16 bytes into a region of size 15" } |
| } |
| |
| void warn_vec_func (void) |
| { |
| *(VC2*)a1 = fc2 (); // { dg-warning "writing 2 bytes into a region of size 1" } |
| *(VC4*)a2 = fc4 (); // { dg-warning "writing 4 bytes into a region of size 2" } |
| *(VC4*)a3 = fc4 (); // { dg-warning "writing 4 bytes into a region of size 3" } |
| *(VC8*)a4 = fc8 (); // { dg-warning "writing 8 bytes into a region of size 4" } |
| *(VC8*)a7 = fc8 (); // { dg-warning "writing 8 bytes into a region of size 7" } |
| *(VC16*)a15 = fc16 ();// { dg-warning "writing 16 bytes into a region of size 15" } |
| } |