https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93514
--- Comment #3 from Martin Sebor <msebor at gcc dot gnu.org> ---
There is no tail padding at ax2.a + 3, it's just past the end of the the
four-byte object because ax2.a is at offset 1.
-Warray-bounds takes tail padding into consideration by calling
component_ref_size(). That can be seen on a test case like this:
$ cat a.c && gcc -O2 -S -Wall -Wextra a.c
struct Ax { int i; char j, a[]; };
struct Ax ax = { 1, 2, { 3 } };
void f (void)
{
ax.a[0] = 3;
ax.a[1] = 2;
ax.a[2] = 1;
ax.a[3] = 0; // -Warray-bounds
}
int g (void)
{
return __builtin_strlen (&ax.a[3]); // missing -Warray-bounds
}
a.c: In function ‘f’:
a.c:10:7: warning: array subscript 3 is above array bounds of ‘char[0]’
[-Warray-bounds]
10 | ax.a[3] = 0; // -Warray-bounds
| ~~~~^~~
a.c:1:28: note: while referencing ‘a’
1 | struct Ax { int i; char j, a[]; };
| ^
a.c:3:11: note: defined here ‘ax’
3 | struct Ax ax = { 1, 2, { 3 } };
| ^~
(The reference to 'char[0]' in the warning isn't quite correct: it should be
'char[]'. This is the subject of pr92326.)