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

Vincent Lefèvre <vincent-gcc at vinc17 dot net> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|RESOLVED                    |NEW
         Resolution|INVALID                     |---

--- Comment #3 from Vincent Lefèvre <vincent-gcc at vinc17 dot net> ---
(In reply to Manuel López-Ibáñez from comment #2)
> Because "is-used" is given before optimization, while may-be-used are given
> after optimization. I don't think this is a bug, but expected behaviour
> given that optimization should allow more precise warnings (hence,
> discarding a false positive).

No, this is not a false positive. Even though f1 doesn't use its parameter, the
argument is evaluated, and if the value is a trap representation (which is
possible for some architectures), the behavior is undefined (6.2.6.1#5). Thus
the calls f1(i1) and f1(j1) are possibly incorrect.

Or even on common architectures... Consider the following code:

void f (int b)
{
  double x, y;
  (void) (x * x);
  if (b)
    (void) (y * y);
}

If x or y is a signaling NaN, this could raise the invalid exception, which
could mean a possible trap. But the warnings are always missing.

Same issue with:

void f (int b)
{
  int x, y;
  (void) (x / x);
  if (b)
    (void) (y / y);
}

Clang 4.0 gives warnings as expected.

Reply via email to