[PR c/84293] Unexpected strict-alias warning
Nathan Sidwell
nathan@acm.org
Fri Feb 9 12:50:00 GMT 2018
This bug comes from python sources. It has some type-punning macros to
switch between representation, but these can cause unexpected
strict-alias warnings, even though the punning's context is a system
header file. (I guess that without macro expansion location information
we'd've thought the context was user code.)
As shown in the bug report, if the pun is spelt '(struct X *)&obj' we do
not warn, but if it is '(X_t *)&obj' we do. We also don't warn in
either case if we go via -save-temps. The patch changes things to not
warn in either spelling.
The problem is that strict_aliasing_warning uses input_location to
identifier the current code point. But that's not necessarily the
location of the above pun -- it can be the point where we use the pun.
We cannot just use the incoming EXPR's location, because we may well
have peeled some pieces off it, and we end up with the '&obj' fragment,
which in this case is located in the user source. It also turns out
that strict_aliasing_warning no longer uses the incoming 'otype'
argument, immediately doing:
STRIP_NOPS (expr);
otype = TREE_TYPE (expr);
So we may as well drop that arg, substituting a location_t from the caller.
That's what this patch does. The callers in the C & C++ FEs pass the
EXPR_LOCATION of the pointer being dereferenced, or converted, as
appropriate.
Joseph, are the C bits ok?
nathan
--
Nathan Sidwell
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 84293.diff
Type: text/x-patch
Size: 7992 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20180209/92aaafc3/attachment.bin>
More information about the Gcc-patches
mailing list