/* 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]); } }