| /* PR middle-end/91458 - inconsistent warning for writing past the end |
| of an array member |
| { dg-do compile } |
| { dg-options "-O2 -fno-tree-vectorize -Wall -Wno-array-bounds -fno-ipa-icf" } */ |
| |
| void sink (void*); |
| |
| // Exercise trailing one-element array members. |
| |
| struct A1 |
| { |
| char n; |
| char a[1]; // { dg-message "destination object" "note" } |
| }; |
| |
| // Verify warning for access to a definition with an initializer that doesn't |
| // initialize the one-element array member. |
| struct A1 a1__ = { 0 }; |
| |
| void ga1__ (void) |
| { |
| a1__.a[0] = 0; |
| a1__.a[1] = 1; // { dg-warning "\\\[-Wstringop-overflow" } |
| a1__.a[2] = 2; // { dg-warning "\\\[-Wstringop-overflow" } |
| |
| struct A1 a = { 1 }; |
| a.a[0] = 0; |
| a.a[1] = 1; // { dg-warning "\\\[-Wstringop-overflow" } |
| a.a[2] = 2; // { dg-warning "\\\[-Wstringop-overflow" } |
| sink (&a); |
| } |
| |
| // Verify warning for access to a definition with an initializer that |
| // initializes the one-element array member to empty. |
| struct A1 a1_0 = { 0, { } }; |
| |
| void ga1_0_ (void) |
| { |
| a1_0.a[0] = 0; |
| a1_0.a[1] = 1; // { dg-warning "\\\[-Wstringop-overflow" } |
| a1_0.a[2] = 2; // { dg-warning "\\\[-Wstringop-overflow" } |
| |
| struct A1 a = { 1, { } }; |
| a.a[0] = 0; |
| a.a[1] = 1; // { dg-warning "\\\[-Wstringop-overflow" } |
| a.a[2] = 2; // { dg-warning "\\\[-Wstringop-overflow" } |
| sink (&a); |
| } |
| |
| // Verify warning for access to a definition with an initializer that |
| // initializes the one-element array member. |
| struct A1 a1_1 = { 0, { 1 } }; |
| |
| void ga1_1 (void) |
| { |
| a1_1.a[0] = 0; |
| a1_1.a[1] = 1; // { dg-warning "\\\[-Wstringop-overflow" } |
| a1_1.a[2] = 2; // { dg-warning "\\\[-Wstringop-overflow" } |
| |
| struct A1 a = { 0, { 1 } }; |
| a.a[0] = 0; |
| a.a[1] = 1; // { dg-warning "\\\[-Wstringop-overflow" } |
| a.a[2] = 2; // { dg-warning "\\\[-Wstringop-overflow" } |
| sink (&a); |
| } |
| |
| // Exercise interior one-element array members (verify they're not |
| // treated as trailing. |
| |
| struct A1i |
| { |
| char n; |
| char a[1]; // { dg-message "destination object" } |
| char x; |
| }; |
| |
| // Verify warning for access to a definition with an initializer that doesn't |
| // initialize the one-element array member. |
| struct A1i a1i__ = { 0 }; |
| |
| void ga1i__ (void) |
| { |
| a1i__.a[0] = 0; |
| a1i__.a[1] = 1; // { dg-warning "\\\[-Wstringop-overflow" } |
| a1i__.a[2] = 2; // { dg-warning "\\\[-Wstringop-overflow" } |
| |
| struct A1i a = { 0 }; |
| a.a[0] = 0; |
| a.a[1] = 1; // { dg-warning "\\\[-Wstringop-overflow" } |
| a.a[2] = 2; // { dg-warning "\\\[-Wstringop-overflow" } |
| sink (&a); |
| } |
| |
| // Verify warning for access to a definition with an initializer that |
| // initializes the one-element array member to empty. |
| struct A1 a1i_0 = { 0, { } }; |
| |
| void ga1i_0_ (void) |
| { |
| a1i_0.a[0] = 0; |
| a1i_0.a[1] = 1; // { dg-warning "\\\[-Wstringop-overflow" } |
| a1i_0.a[2] = 2; // { dg-warning "\\\[-Wstringop-overflow" } |
| |
| struct A1 a = { 0, { } }; |
| a.a[0] = 0; |
| a.a[1] = 1; // { dg-warning "\\\[-Wstringop-overflow" } |
| a.a[2] = 2; // { dg-warning "\\\[-Wstringop-overflow" } |
| sink (&a); |
| } |
| |
| // Verify warning for access to a definition with an initializer that |
| // initializes the one-element array member. |
| struct A1 a1i_1 = { 0, { 1 } }; |
| |
| void ga1i_1 (void) |
| { |
| a1i_1.a[0] = 0; |
| a1i_1.a[1] = 1; // { dg-warning "\\\[-Wstringop-overflow" } |
| a1i_1.a[2] = 2; // { dg-warning "\\\[-Wstringop-overflow" } |
| |
| struct A1 a = { 0, { 1 } }; |
| a.a[0] = 1; |
| a.a[1] = 2; // { dg-warning "\\\[-Wstringop-overflow" } |
| a.a[2] = 3; // { dg-warning "\\\[-Wstringop-overflow" } |
| sink (&a); |
| } |