blob: 907dd80ccd79e4a9792c147e342d50792bb77387 [file] [log] [blame]
/* Various examples of safe array access for which -Warray-bounds
shouldn't issue a warning at any optimization level
(PR tree-optimization/83510). */
/* { dg-options "-Warray-bounds" } */
extern int get_flag (void);
unsigned int arr[10];
struct xyz {
unsigned int a0;
};
extern void wfm(struct xyz *, int, unsigned int);
static unsigned int f(struct xyz * ctx, unsigned int number)
{
switch (number) {
case 0x9:
return ctx->a0;
case 0xA: case 0xB:
case 0xC: case 0xD: case 0xE: case 0xF:
case 0x10: case 0x11: case 0x12: case 0x13:
return arr[number - 0xa];
}
return 0;
}
int g(struct xyz * ctx) {
int i;
for (i = 0; i < 10; i++) {
wfm(ctx, i, f(ctx, i));
}
return 0;
}
static unsigned int f_signed(struct xyz * ctx, int number)
{
switch (number) {
case 0x9:
return ctx->a0;
case 0xA: case 0xB:
case 0xC: case 0xD: case 0xE: case 0xF:
case 0x10: case 0x11: case 0x12: case 0x13:
return arr[number];
}
return 0;
}
int g_signed(struct xyz * ctx) {
int i;
for (i = 0; i < 10; i++) {
wfm(ctx, i, f(ctx, i));
}
return 0;
}
void test_2 (struct xyz * ctx)
{
int i;
for (i = 0; i < 10; i++) {
if (get_flag ())
wfm(ctx, i, f(ctx, i));
}
}
void test_2_signed (struct xyz * ctx)
{
int i;
for (i = 0; i < 10; i++) {
if (get_flag ())
wfm(ctx, i, f_signed(ctx, i));
}
}
void test_3 (struct xyz * ctx)
{
unsigned int i;
for (i = 0; i < 10; i++) {
switch (i) {
case 0x9:
wfm(ctx, i, ctx->a0);
break;
case 0xA: case 0xB:
case 0xC: case 0xD: case 0xE: case 0xF:
case 0x10: case 0x11: case 0x12: case 0x13:
if (get_flag ())
wfm(ctx, i, arr[i - 0xa]);
break;
}
}
}
void test_3_signed (struct xyz * ctx)
{
int i;
for (i = 0; i < 10; i++) {
switch (i) {
case 0x9:
wfm(ctx, i, ctx->a0);
break;
case 0xA: case 0xB:
case 0xC: case 0xD: case 0xE: case 0xF:
case 0x10: case 0x11: case 0x12: case 0x13:
if (get_flag ())
wfm(ctx, i, arr[i]);
break;
}
}
}
void test_4 (struct xyz * ctx)
{
unsigned int i, j;
for (i = 0; i < 10; i++) {
switch (i) {
case 0x9:
wfm(ctx, i, ctx->a0);
break;
case 0xA: case 0xB:
case 0xC: case 0xD: case 0xE: case 0xF:
case 0x10: case 0x11: case 0x12: case 0x13:
for (j = 0; j < 5; j++)
wfm(ctx, i, arr[i - 0xa]);
break;
}
}
}
void test_4_signed (struct xyz * ctx)
{
int i, j;
for (i = 0; i < 10; i++) {
switch (i) {
case 0x9:
wfm(ctx, i, ctx->a0);
break;
case 0xA: case 0xB:
case 0xC: case 0xD: case 0xE: case 0xF:
case 0x10: case 0x11: case 0x12: case 0x13:
for (j = 0; j < 5; j++)
wfm(ctx, i, arr[i]);
break;
}
}
}
void test_5 (struct xyz * ctx)
{
unsigned int i;
for (i = 10; i < 20; i++) {
wfm(ctx, i, arr[i - 10]);
}
}
void test_5_signed (struct xyz * ctx)
{
int i;
for (i = 10; i < 20; i++) {
wfm(ctx, i, arr[i - 10]);
}
}