1 /* PR tree-optimization/82588 - missing -Warray-bounds on an excessively
4 { dg-require-effective-target alloca }
5 { dg-options "-O2 -Warray-bounds -ftrack-macro-expansion=0" } */
7 #include "../gcc.dg/range.h"
9 #define offsetof(T, m) __builtin_offsetof (T, m)
11 typedef struct AX
{ int n
; char ax
[]; } AX
;
13 typedef struct A1
{ int i
; char a1
[1]; } A1
;
14 typedef struct B
{ int i
; struct A1 a1x
[]; } B
;
18 #define R(min, max) signed_range (min, max)
19 #define T(expr) sink (0, expr)
21 struct __attribute__ ((packed
)) S16
{ unsigned i
: 16; };
27 T (ac
[DIFF_MIN
]); /* { dg-warning "array subscript -\[0-9\]+ is below array bounds of .char *\\\[]." } */
28 T (ac
[-1]); /* { dg-warning "array subscript -1 is below array bounds" } */
32 T (ac
[DIFF_MAX
]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
33 T (ac
[DIFF_MAX
+ (size_t)1]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
34 T (ac
[SIZE_MAX
]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
35 T (ac
[R (DIFF_MAX
- 1, DIFF_MAX
)]);
36 T (ac
[R (DIFF_MIN
+ 1, -1)]); /* { dg-warning "array subscript -1 is below array bounds" } */
37 T (ac
[R (DIFF_MIN
+ 1, 0)]);
44 extern struct S16 ax
[];
46 T (ax
[DIFF_MIN
]); /* { dg-warning "array subscript -\[0-9\]+ is below array bounds of .(struct )?S16 *\\\[]." } */
47 T (ax
[-1]); /* { dg-warning "array subscript -1 is below array bounds" } */
50 T (ax
[DIFF_MAX
/ 2 - 1]);
51 T (ax
[DIFF_MAX
/ 2]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
52 T (ax
[DIFF_MAX
/ 2 + (size_t)1]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
53 T (ax
[SIZE_MAX
]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
54 T (ax
[R (DIFF_MIN
, -1)]); /* { dg-warning "array subscript -1 is below array bounds" } */
55 T (ax
[R (DIFF_MAX
/ 2 - 1, DIFF_MAX
)]);
56 T (ax
[R (DIFF_MAX
/ 2, DIFF_MAX
)]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
59 void farr_s16_7 (void)
61 extern struct S16 ax_7
[][7];
63 T (ax_7
[0][DIFF_MIN
]); /* { dg-warning "array subscript -\[0-9\]+ is below array bounds of .(struct )?S16 *\\\[7]." } */
64 T (ax_7
[0][-1]); /* { dg-warning "array subscript -1 is below array bounds" } */
66 T (ax_7
[0][7]); /* { dg-warning "array subscript 7 is above array bounds of .(struct )?S16 *\\\[7]." } */
67 T (ax_7
[0][8]); /* { dg-warning "array subscript 8 is above array bounds of .(struct )?S16 *\\\[7]." } */
69 T (ax_7
[0][DIFF_MAX
/ 2]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
70 T (ax_7
[0][SIZE_MAX
]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
72 T (ax_7
[DIFF_MIN
][0]); /* { dg-warning "array subscript -\[0-9\]+ is below array bounds of .(struct )?S16 *\\\[]\\\[7]." } */
73 T (ax_7
[-1][0]); /* { dg-warning "array subscript -1 is below array bounds" } */
75 T (ax_7
[DIFF_MAX
/ 2][0]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
76 T (ax_7
[SIZE_MAX
][0]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
78 ptrdiff_t i
= R (DIFF_MIN
, -1);
79 T (ax_7
[i
][0]); /* { dg-warning "array subscript -1 is below array bounds" } */
81 T (ax_7
[R (DIFF_MIN
, -1)][0]); /* { dg-warning "array subscript -1 is below array bounds" } */
82 T (ax_7
[R (DIFF_MIN
, 0)][0]);
83 T (ax_7
[R (-2, -1)][0]); /* { dg-warning "array subscript -1 is below array bounds" } */
84 T (ax_7
[R (-1, 0)][0]);
85 T (ax_7
[R (-1, 1)][0]);
86 T (ax_7
[R (-1, 7)][0]);
87 T (ax_7
[R (-1, DIFF_MAX
)][0]);
89 T (ax_7
[R ( 1, DIFF_MAX
)][0]);
90 T (ax_7
[R (DIFF_MAX
/ 14 - 1, DIFF_MAX
)][0]);
92 i
= R (DIFF_MAX
/ 14, DIFF_MAX
);
93 T (ax_7
[i
][0]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
95 T (ax_7
[0][R (DIFF_MIN
, 0)]);
96 T (ax_7
[0][R (-1, 0)]);
97 T (ax_7
[0][R (-1, 1)]);
98 T (ax_7
[0][R (-1, 7)]);
99 T (ax_7
[0][R (-1, DIFF_MAX
)]);
100 T (ax_7
[0][R (-1, DIFF_MAX
)]);
102 T (ax_7
[0][R (1, DIFF_MAX
)]);
103 T (ax_7
[0][R (7, DIFF_MAX
)]); /* { dg-warning "array subscript 7 is above array bounds" } */
107 void farr_x_5_7 (void)
109 extern struct S16 a
[][5][7];
111 T (a
[0][0][-3]); /* { dg-warning "array subscript -3 is below array bounds of .(struct )?S16 *\\\[7]." } */
112 T (a
[0][-2][0]); /* { dg-warning "array subscript -2 is below array bounds of .(struct )?S16 *\\\[5]\\\[7]." } */
113 T (a
[-1][0][0]); /* { dg-warning "array subscript -1 is below array bounds of .(struct )?S16 *\\\[]\\\[5]\\\[7]." } */
114 T (a
[R (-4, -3)][0][0]); /* { dg-warning "array subscript -3 is below array bounds" } */
115 T (a
[0][R (-3, -2)][0]); /* { dg-warning "array subscript -2 is below array bounds" } */
116 T (a
[0][0][R (-2, -1)]); /* { dg-warning "array subscript -1 is below array bounds" } */
120 void fax (struct AX
*p
)
122 T (p
->ax
[DIFF_MIN
]); /* { dg-warning "array subscript -\[0-9\]+ is below array bounds" } */
123 T (p
->ax
[-1]); /* { dg-warning "array subscript -1 is below array bounds" } */
125 T (p
->ax
[DIFF_MAX
- sizeof *p
- 1]);
126 T (p
->ax
[DIFF_MAX
- sizeof *p
]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
127 T (p
->ax
[DIFF_MAX
- sizeof *p
+ 1]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
128 T (p
->ax
[SIZE_MAX
]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
129 T (p
->ax
[R (DIFF_MIN
, -1)]); /* { dg-warning "array subscript -1 is below array bounds" } */
130 T (p
->ax
[R (-1, 1)]);
131 T (p
->ax
[R (0, DIFF_MAX
- 1)]);
132 T (p
->ax
[R (DIFF_MAX
- 1, DIFF_MAX
)]);/* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
135 void fa1 (struct A1
*p
)
137 T (p
->a1
[DIFF_MIN
]); /* { dg-warning "array subscript -\[0-9\]+ is below array bounds" } */
138 T (p
->a1
[-1]); /* { dg-warning "array subscript -1 is below array bounds" } */
141 T (p
->a1
[DIFF_MAX
- offsetof (A1
, a1
) - 1]);
142 T (p
->a1
[DIFF_MAX
- offsetof (A1
, a1
)]);/* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
143 T (p
->a1
[DIFF_MAX
- offsetof (A1
, a1
) + 1]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
144 T (p
->a1
[SIZE_MAX
]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
147 void fb (struct B
*p
)
149 T (p
->a1x
->a1
[DIFF_MIN
]); /* { dg-warning "array subscript -\[0-9\]+ is below array bounds" } */
150 T (p
->a1x
->a1
[-1]); /* { dg-warning "array subscript -1 is below array bounds" } */
152 T (p
->a1x
->a1
[9]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
153 T (p
->a1x
->a1
[DIFF_MAX
- sizeof *p
]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
154 T (p
->a1x
->a1
[DIFF_MAX
- sizeof *p
+ 1]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
155 T (p
->a1x
->a1
[SIZE_MAX
]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
157 T (p
->a1x
[1].a1
[DIFF_MIN
]); /* { dg-warning "array subscript -\[0-9\]+ is below array bounds" } */
158 T (p
->a1x
[1].a1
[-1]); /* { dg-warning "array subscript -1 is below array bounds" } */
160 T (p
->a1x
[1].a1
[9]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
161 T (p
->a1x
[1].a1
[DIFF_MAX
- sizeof *p
]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
162 T (p
->a1x
[1].a1
[DIFF_MAX
- sizeof *p
+ 1]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
163 T (p
->a1x
[1].a1
[SIZE_MAX
]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
165 T (p
->a1x
[2].a1
[DIFF_MIN
]); /* { dg-warning "array subscript -\[0-9\]+ is below array bounds" } */
166 T (p
->a1x
[2].a1
[-1]); /* { dg-warning "array subscript -1 is below array bounds" } */
168 T (p
->a1x
[2].a1
[9]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
169 T (p
->a1x
[2].a1
[DIFF_MAX
- sizeof *p
]);/* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
170 T (p
->a1x
[2].a1
[DIFF_MAX
- sizeof *p
+ 1]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
171 T (p
->a1x
[2].a1
[SIZE_MAX
]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
173 T (p
->a1x
[3].a1
[DIFF_MIN
]); /* { dg-warning "array subscript -\[0-9\]+ is below array bounds" } */
174 T (p
->a1x
[3].a1
[-1]); /* { dg-warning "array subscript -1 is below array bounds" } */
176 T (p
->a1x
[3].a1
[9]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
180 enum { MAX
= (DIFF_MAX
- sizeof *p
) / sizeof *p
->a1x
};
182 T (p
->a1x
[DIFF_MIN
].a1
); /* { dg-warning "array subscript -\[0-9\]+ is below array bounds" } */
183 T (p
->a1x
[-1].a1
); /* { dg-warning "array subscript -1 is below array bounds" } */
185 T (p
->a1x
[MAX
+ 2].a1
); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
187 T (p
->a1x
[DIFF_MAX
].a1
); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
188 T (p
->a1x
[SIZE_MAX
].a1
); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
190 T (p
->a1x
[DIFF_MIN
].a1
[0]); /* { dg-warning "array subscript -\[0-9\]+ is below array bounds" } */
191 T (p
->a1x
[-1].a1
[0]) /* { dg-warning "array subscript -1 is below array bounds" } */;
192 T (p
->a1x
[MAX
- 1].a1
[0]);
193 T (p
->a1x
[MAX
].a1
[0]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
194 T (p
->a1x
[MAX
+ 1].a1
[0]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
196 T (p
->a1x
[DIFF_MAX
].a1
[0]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
197 T (p
->a1x
[SIZE_MAX
].a1
[0]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" } */
200 void f_cststring (int i
)
202 T (""[DIFF_MIN
]); /* { dg-warning "array subscript -\[0-9\]+ is below array bounds of .(const )?char *\\\[1]" "string" { xfail lp64 } } */
203 T (""[DIFF_MIN
+ 1]); /* { dg-warning "array subscript -\[0-9\]+ is below array bounds of .(const )?char *\\\[1]" "string" } */
204 T (""[-1]); /* { dg-warning "array subscript -1 is below array bounds of .(const )?char *\\\[1]" "string" } */
206 T (""[1]); /* { dg-warning "array subscript 1 is above array bounds of .(const )?char *\\\[1]" "string" } */
207 T ("0"[2]); /* { dg-warning "array subscript 2 is above array bounds of .(const )?char *\\\[2]" "string" } */
210 T ("012"[4]); /* { dg-warning "array subscript 4 is above array bounds of .(const )?char *\\\[4]" "string" } */
211 T ("0123"[DIFF_MAX
]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds of .(const )?char *\\\[5]" "string" } */
212 T ("0123"[SIZE_MAX
]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds of .(const )?char *\\\[5]" "string" } */
215 void fb_strlen (struct B
*p
)
217 #define strlen __builtin_strlen
219 T (strlen (&p
->a1x
[0].a1
[2])); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" "strlen" } */
220 T (strlen (p
->a1x
[0].a1
+ 2)); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" "strlen" { xfail *-*-* } } */
224 void f_vla (unsigned n
)
228 T (vla
[DIFF_MIN
]); /* { dg-warning "array subscript -\[0-9\]+ is below array bounds" "vla" } */
229 T (vla
[-1]); /* { dg-warning "array subscript -1 is below array bounds" "vla" } */
233 /* It would be nice to diagnose this. */
234 T (vla
[n
]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" "bug 82608" { xfail *-*-*} } */
235 T (vla
[DIFF_MAX
]); /* { dg-warning "array subscript \[0-9\]+ is above array bounds" "vla" } */