[Bug middle-end/56748] Bogus uninitialized warning with nested if condition

burnus at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Wed Mar 27 08:26:00 GMT 2013


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56748

Tobias Burnus <burnus at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |diagnostic
                 CC|                            |burnus at gcc dot gnu.org
          Component|fortran                     |middle-end
            Summary|STOP statement + array      |Bogus uninitialized warning
                   |optional variable causes    |with nested if condition
                   |bogus uninitialized warning |

--- Comment #1 from Tobias Burnus <burnus at gcc dot gnu.org> 2013-03-27 08:26:31 UTC ---
First remark: Bogus uninitialized warnings can not always be prevented. - It is
a extremely complex problem, where a few false warnings (and many missed
warnings) are unavoidable. Still, one should do better.



If one looks at the dump (-fdump-tree-original, i.e. a C-like output of the
internal representation), one sees:


mysub (struct array1_integer(kind=4) & restrict a,
       struct array1_integer(kind=4) * b)
{
...

  if (b != 0B && (integer(kind=4)[0:] * restrict) b->data != 0B)
        b.0 = (integer(kind=4)[0:D.1925] * restrict) b->data;
...
  if (b != 0B && (integer(kind=4)[0:] * restrict) b->data != 0B)
...
              if (b != 0B && (integer(kind=4)[0:] * restrict) b->data != 0B)
                {
                  // Here are some run-time checks, enabled by -fcheck=all
                }
...
          parm.10.data = (void *) &(*b.0)[0];
          _gfortran_transfer_array_write (&dt_parm.9, &parm.10, 4, 0);



As all "if" conditions are the same, b.0 is never uninitialized. However,
nesting the same "b != NULL" seems to confuse the uninitialized diagnostic.



More information about the Gcc-bugs mailing list