On 04/24/2017 03:35 PM, Jeff Law wrote:
On 04/11/2017 12:57 PM, Martin Sebor wrote:
In a review of my fix for bug 80364 Jakub pointed out that to
determine whether an argument to an integer directive is of
an integer type the gimple-ssa-sprintf pass tests the type code
for equality to INTEGER_TYPE when it should instead be using
INTEGRAL_TYPE_P().  This has the effect of the pass being unable
to use the available range of arguments of enumerated types,
resulting in both false positives and false negatives, and in
some cases, in emitting suboptimal code.

The attached patch replaces those tests with INTEGRAL_TYPE_P().

Since this is not a regression I submit it for GCC 8.
You might consider using POINTER_TYPE_P as well.

You mean rather than (TREE_CODE (type) == POINTER_TYPE)?  Those
I believe are vestiges of the %p handling that was removed sometime
last year, and (unless you are recommending I remove them as part
of this patch) should probably be removed during the next cleanup.


It's also worth noting that an enum object can have values that aren't
part of the enum.  It's a long standing language wart that I don't
expect to ever be fixed.  As a result enums often don't have as good of
range data as you might expect.

Yes, it's a common source of bugs.  Unfortunately, unlike Clang,
GCC doesn't have a warning for assigning a constant to an emum
variable that doesn't match one of its enumerators.  I'm testing
a patch to add the same warning.

Martin

Reply via email to