aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.dg/Wstringop-overflow-69.c
blob: be361fe620d34bc610a98bf1edf7f6c04dd262ad (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
/* 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" }
}