This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug fortran/31683] bogus warnings with optional arguments
- From: "tkoenig at gcc dot gnu dot org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 24 Apr 2007 20:06:02 -0000
- Subject: [Bug fortran/31683] bogus warnings with optional arguments
- References: <bug-31683-6642@http.gcc.gnu.org/bugzilla/>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
------- Comment #4 from tkoenig at gcc dot gnu dot org 2007-04-24 21:06 -------
There is a questionable practice with the original code: It uses
pab without a check whether it is present.
The compiler tries to guard against this, partially by generating
(from the *.original dump):
if (pab != 0B)
{
{
int4 D.1054;
D.1054 = pab->dim[0].stride;
stride.1 = D.1054 == 0 ? 1 : D.1054;
pab.0 = (real8[0:D.1055] *) pab->data;
ubound.0 = (pab->dim[0].ubound - pab->dim[0].lbound) + 1;
stride.3 = pab->dim[1].stride;
ubound.2 = (pab->dim[1].ubound - pab->dim[1].lbound) + 1;
size.5 = stride.3 * NON_LVALUE_EXPR <ubound.2>;
offset.4 = -stride.1 - NON_LVALUE_EXPR <stride.3>;
D.1055 = size.5 - 1;
D.1056 = (bit_size_type) (<unnamed-unsigned:32>) size.5 * 64;
D.1057 = (<unnamed-unsigned:32>) size.5 * 8;
}
}
All these variables are initialized in this block, and nowhere
else. Later in the loop, they are used, which generates the warnings.
The if(pab) above doesn't really help because the code will crash, or produce
strange results, if pab isn't present.
This is a very misleading diagnostic, but not a wrong-code as far as I can see.
--
tkoenig at gcc dot gnu dot org changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |NEW
Ever Confirmed|0 |1
Keywords| |diagnostic
Last reconfirmed|0000-00-00 00:00:00 |2007-04-24 21:06:01
date| |
Summary|bogus warnings / |bogus warnings with optional
|miscompilation |arguments
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31683