https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97261

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |msebor at gcc dot gnu.org

--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> ---

    const ab_t* ab = (ab_t*)(pb - 1);

note that this invokes undefined behavior as you are producing the address
of one-before the start of an object.  You are also violating strict aliasing
rules with the access in g() which accesses a ab_t object but there's only
a double where you point to (well, there's nothing actually).

While the particular warning isn't very useful:

tst.c:21:17: warning: array subscript -1 is outside array bounds of 'double[1]'
[-Warray-bounds]
   21 |     const ab_t* ab = (ab_t*)(pb - 1);
      |                 ^~

it does point to the offending statement.  It probably should read
'warning: computing the address one element before the object 'double' invokes
undefined behavior'
or so.  Mentioning double[1] when there's just a 'double' is likely also more
confusing than it helps.  Maybe spelling out 'non-array object X' would be
better here.

All in all the bug for the testcase is invalid but I'm leaving it open to
eventually improve the actual diagnostic message.

Reply via email to