1 /* { dg-do compile } */
2 /* { dg-options "-O3 -Warray-bounds=2" } */
3 
4 typedef __SIZE_TYPE__ size_t;
5 extern void* malloc(size_t x);
6 
7 int e[3];
8 
9 struct f { int f[3]; };
10 
11 extern void bar(int v[]);
12 
13 struct h {
14 
15 	int i;
16 	int j[];
17 };
18 
19 struct h0 {
20 
21 	int i;
22 	int j[0];
23 };
24 
25 struct h0b {
26 
27 	int i;
28 	int j[0];
29 	int k;
30 };
31 
32 struct h1 {
33 
34 	int i;
35 	int j[1];
36 };
37 
38 struct h1b {
39 
40 	int i;
41 	int j[1];
42 	int k;
43 };
44 
45 struct h3 {
46 
47 	int i;
48 	int j[3];
49 };
50 
51 struct h3b {
52 
53 	int i;
54 	int j[3];
55 	int k;
56 };
57 
foo(int (* a)[3])58 void foo(int (*a)[3])
59 {
60 	(*a)[4] = 1;	/* { dg-warning "subscript 4 is above array bound" } */
61 	a[0][0] = 1;	// ok
62 	a[1][0] = 1;	// ok
63 	a[1][4] = 1;	/* { dg-warning "subscript 4 is above array bound" } */
64 
65 	int c[3] = { 0 };
66 
67 	c[4] = 1;	/* { dg-warning "subscript 4 is above array bound" } */
68 
69 	e[4] = 1;	/* { dg-warning "subscript 4 is above array bound" } */
70 
71 	struct f f;
72 	f.f[4] = 1;	/* { dg-warning "subscript 4 is above array bound" } */
73 
74 	struct h* h = malloc(sizeof(struct h) + 3 * sizeof(int));
75 	struct h0* h0 = malloc(sizeof(struct h0) + 3 * sizeof(int));
76 	struct h1* h1 = malloc(sizeof(struct h1) + 3 * sizeof(int));
77 	struct h3* h3 = malloc(sizeof(struct h3));
78 
79 	h->j[4] = 1;	// flexible array member
80 	h0->j[4] = 1;	// zero-sized array extension
81 	h1->j[4] = 1;	/* { dg-warning "subscript 4 is above array bound" } */
82 	h3->j[4] = 1;	/* { dg-warning "subscript 4 is above array bound" } */
83 
84 	struct h0b* h0b = malloc(sizeof(struct h) + 3 * sizeof(int));
85 	struct h1b* h1b = malloc(sizeof(struct h1b) + 3 * sizeof(int));
86 	struct h3b* h3b = malloc(sizeof(struct h3b));
87 //	h0b->j[4] = 1;
88 	h1b->j[4] = 1;;	/* { dg-warning "subscript 4 is above array bound" } */
89 	h3b->j[4] = 1;;	/* { dg-warning "subscript 4 is above array bound" } */
90 
91 	// make sure nothing gets optimized away
92 	bar(*a);
93 	bar(c);
94 	bar(e);
95 	bar(f.f);
96 	bar(h1->j);
97 	bar(h3->j);
98 	bar(h3b->j);
99 	bar(h1b->j);
100 	bar(h->j);
101 	bar(h0->j);
102 }
103 
104