https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87363
--- Comment #5 from Bernd Edlinger <bernd.edlinger at hotmail dot de> ---
Using named struct members does not make a difference.
Of course it is possible that converting address of u.b.z
to const char *, makes the example undefined, as strlen is
not really accessing the bytes thru a union member.
$ cat pr87053.c
/* PR middle-end/87053 */
const union
{ struct {
char x[4];
char y[4];
} a;
struct {
char z[8];
} b;
} u = {{"1234", "567"}};
int main ()
{
if (__builtin_strlen (u.b.z) != 7)
__builtin_abort ();
}
$ gcc pr87053.c
gcc -O3 -S pr87053.c
pr87053.c: In function ‘main’:
pr87053.c:15:28: warning: ‘strlen’ argument missing terminating nul
[-Wstringop-overflow=]
15 | if (__builtin_strlen (u.b.z) != 7)
| ~~~^~
pr87053.c:11:3: note: referenced argument declared here
11 | } u = {{"1234", "567"}};
| ^
pr87053.c:15:28: warning: ‘strlen’ argument missing terminating nul
[-Wstringop-overflow=]
15 | if (__builtin_strlen (u.b.z) != 7)
| ~~~^~
pr87053.c:11:3: note: referenced argument declared here
11 | } u = {{"1234", "567"}};
| ^