[Bug tree-optimization/92765] [10 Regression] Wrong code caused by folding of -Wstring-compare since r276773
jakub at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Tue Dec 3 11:01:00 GMT 2019
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92765
--- Comment #6 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
(In reply to Andrew Pinski from comment #3)
> But isn't the case magic could be considered a variable length field since
> it is st the end of the struct?
At end of struct or not doesn't really matter.
Consider another testcase that is miscompiled because of this:
union U { struct S { char a[2]; char b[2]; char c[2]; } s; char d[6]; } u;
__attribute__((noipa)) void
bar (char *p)
{
asm volatile ("" : : "g" (p) : "memory");
}
__attribute__((noipa)) void
foo (union U *x)
{
char *p = (char *) &x->s.b;
bar (p);
if (__builtin_strcmp (&x->d[2], "cde"))
__builtin_abort ();
}
int
main ()
{
__builtin_strcpy (u.d, "abcde");
foo (&u);
return 0;
}
Note, it works if instead of using (char *) &x->s.b it uses &x->s.b[0], because
determine_min_objsize has a hack to ignore sizes of one and zero, guess it
failed too often that way.
More information about the Gcc-bugs
mailing list