https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84095
Jakub Jelinek <jakub at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |NEW
Last reconfirmed| |2018-01-29
CC| |jakub at gcc dot gnu.org
Ever confirmed|0 |1
--- Comment #1 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
This warning at least in its current shape doesn't belong into either -Wall or
-W IMNSHO.
if (TREE_CODE (expr) == ADDR_EXPR)
{
poly_int64 off;
tree op = TREE_OPERAND (expr, 0);
/* Determine the base object or pointer of the reference
and its constant offset from the beginning of the base. */
base = get_addr_base_and_unit_offset (op, &off);
HOST_WIDE_INT const_off;
if (base && off.is_constant (&const_off))
{
offrange[0] += const_off;
offrange[1] += const_off;
/* Stash the reference for offset validation. */
ref = op;
/* Also stash the constant offset for offset validation. */
if (TREE_CODE (op) == COMPONENT_REF)
refoff = const_off;
}
else
{
size = NULL_TREE;
base = get_base_address (TREE_OPERAND (expr, 0));
}
}
is plain wrong. get_addr_base_and_unit_offset is solely for computation of a
constant offset (or these days poly_int64 offset). Here you need to do
get_inner_reference instead, and treat the poly_int64 bit offset (rather than
byte offset) as the constant part and for the variable part try to use
value ranges and handle casts/extensions in the expression too properly.
I don't see how this warning can be enabled at all at -O0/-O1/-Og, unless you
warn solely about cases where you can prove overalap, rather than warning just
in case. And the general case of the warning should be, if I don't understand
something (such as the base = get_base_address (TREE_OPERAND (expr, 0)); above,
I punt on the warning, rather than just giving false positives. That is only a
sure way to add the warning to the kill-list of projects that -Wno-* broken
warnings, and for some users to stop using GCC.