| /* PR middle-end/97391 - bogus -Warray-bounds accessing a multidimensional |
| array parameter |
| { dg-do compile } |
| { dg-options "-O2 -Wall" } */ |
| |
| |
| void nowarn_access_loop_idx (char a[3][5]) |
| { |
| for (int i = 0; i < 3; i++) |
| for (int j = 0; j < 5; j++) |
| a[i][j] = 0; |
| } |
| |
| void warn_access_loop_idx (char a[3][5]) |
| { |
| for (int i = 0; i < 3; i++) |
| for (int j = 0; j < 5; j++) |
| a[j][i] = 0; // { dg-warning "\\\[-Warray-bounds" } |
| } |
| |
| |
| void nowarn_access_cst_idx (int a[5][7][9]) |
| { |
| a[0][0][0] = __LINE__; |
| a[0][0][8] = __LINE__; |
| |
| a[0][6][0] = __LINE__; |
| a[0][6][8] = __LINE__; |
| |
| a[4][0][0] = __LINE__; |
| a[4][0][8] = __LINE__; |
| a[4][6][8] = __LINE__; |
| } |
| |
| |
| void test_ptr_access_cst_idx (int a[5][7][9]) |
| { |
| int *p = &a[0][0][0]; |
| |
| p[0] = __LINE__; |
| p[8] = __LINE__; |
| |
| /* The following access should trigger a warning but it's represented |
| the same as the valid access in |
| p = a[0][1][0]; |
| p[1] = __LINE__; |
| both as |
| MEM[(int *)a_1(D) + 36B] = __LINE__; */ |
| |
| p[9] = __LINE__; // { dg-warning "\\\[-Warray-bounds" "pr?????" { xfail *-*-* } } |
| |
| p[315] = __LINE__; |
| // { dg-warning "subscript 315 is outside array bounds of 'int\\\[5]\\\[7]\\\[9]'" "pr97425" { xfail *-*-* } .-1 } |
| // { dg-warning "subscript 315 is outside array bounds " "" { target *-*-* } .-2 } |
| |
| p = &a[0][6][0]; |
| p[0] = __LINE__; |
| p[8] = __LINE__; |
| |
| p = &a[4][6][0]; |
| p[0] = __LINE__; |
| p[8] = __LINE__; |
| } |
| |
| |
| void warn_access_cst_idx (int a[5][7][9]) |
| { |
| a[0][0][9] = __LINE__; // { dg-warning "subscript 9 is above array bounds of 'int\\\[9]'" } |
| a[0][7][0] = __LINE__; // { dg-warning "subscript 7 is above array bounds of 'int\\\[7]\\\[9]'" } |
| a[5][0][0] = __LINE__; |
| // { dg-warning "subscript 5 is outside array bounds of 'int\\\[5]\\\[7]\\\[9]'" "pr97425" { xfail *-*-* } .-1 } |
| // { dg-warning "subscript \\d+ is outside array bounds" "" { target *-*-* } .-2 } |
| } |
| |
| |
| void test_ptrarray_access_cst_idx (int (*pa)[5][7][9]) |
| { |
| (*pa)[0][0][0] = __LINE__; |
| (*pa)[0][0][8] = __LINE__; |
| (*pa)[0][0][9] = __LINE__; // { dg-warning "subscript 9 is above array bounds of 'int\\\[9]'" } |
| |
| (*pa)[0][6][0] = __LINE__; |
| (*pa)[0][7][0] = __LINE__; // { dg-warning "subscript 7 is above array bounds of 'int\\\[7]\\\[9]'" } |
| (*pa)[0][8][0] = __LINE__; // { dg-warning "subscript 8 is above array bounds of 'int\\\[7]\\\[9]'" } |
| |
| (*pa)[4][6][8] = __LINE__; |
| (*pa)[5][0][0] = __LINE__; // { dg-warning "subscript 5 is above array bounds of 'int\\\[5]\\\[7]\\\[9]'" } |
| } |
| |
| |
| void test_ptr_ptrarray_access_cst_idx (int (*pa)[5][7][9]) |
| { |
| int *p = &(*pa)[0][0][0]; |
| |
| p[0] = __LINE__; |
| p[8] = __LINE__; |
| |
| /* The following access should trigger a warning but it's represented |
| the same as the valid access in |
| p = a[0][1][0]; |
| p[1] = __LINE__; |
| both as |
| MEM[(int *)a_1(D) + 36B] = __LINE__; */ |
| |
| p[9] = __LINE__; // { dg-warning "\\\[-Warray-bounds" "pr?????" { xfail *-*-* } } |
| |
| p[315] = __LINE__; // { dg-warning "\\\[-Warray-bounds" "pr97429" { xfail *-*-* } } |
| |
| p = &(*pa)[0][6][0]; |
| p[0] = __LINE__; |
| p[8] = __LINE__; |
| |
| p = &(*pa)[4][6][0]; |
| p[0] = __LINE__; |
| p[8] = __LINE__; |
| } |
| |
| |