------- Comment #16 from fxcoudert at gcc dot gnu dot org  2009-05-03 16:28 
-------
Many new warnings:

../../../trunk/libgfortran/runtime/string.c: In function ‘compare0’:
../../../trunk/libgfortran/runtime/string.c:39: warning: comparison between
signed and unsigned integer expressions

Fixed by:

Index: runtime/string.c
===================================================================
--- runtime/string.c    (revision 147057)
+++ runtime/string.c    (working copy)
@@ -36,7 +36,10 @@

   /* Strip trailing blanks from the Fortran string.  */
   len = fstrlen (s1, s1_len);
-  if (len != strlen(s2)) return 0; /* don't match */
+
+  if ((size_t) len != strlen(s2))
+    return 0; /* don't match */
+
   return strncasecmp (s1, s2, len) == 0;
 }


../../../trunk/libgfortran/io/transfer.c: In function ‘read_block_direct’:
../../../trunk/libgfortran/io/transfer.c:468: warning: comparison between
signed and unsigned integer expressions

Fixed by:

Index: io/transfer.c
===================================================================
--- io/transfer.c       (revision 147057)
+++ io/transfer.c       (working copy)
@@ -465,7 +465,7 @@
   /* Check whether we exceed the total record length.  */

   if (dtp->u.p.current_unit->flags.has_recl
-      && (nbytes > dtp->u.p.current_unit->bytes_left))
+      && ((gfc_offset) nbytes > dtp->u.p.current_unit->bytes_left))
     {
       to_read_record = dtp->u.p.current_unit->bytes_left;
       short_record = 1;



../../../trunk/libgfortran/io/list_read.c: In function ‘nml_read_obj’:
../../../trunk/libgfortran/io/list_read.c:2464: warning: comparison between
‘bt’ and ‘enum <anonymous>’
../../../trunk/libgfortran/io/list_read.c: In function ‘nml_get_obj_data’:
../../../trunk/libgfortran/io/list_read.c:2712: warning: comparison between
‘bt’ and ‘enum <anonymous>’
../../../trunk/libgfortran/io/list_read.c:2734: warning: comparison between
‘bt’ and ‘enum <anonymous>’
../../../trunk/libgfortran/io/list_read.c:2768: warning: comparison between
‘bt’ and ‘enum <anonymous>’
../../../trunk/libgfortran/io/write.c: In function ‘nml_write_obj’:
../../../trunk/libgfortran/io/write.c:1261: warning: comparison between ‘bt’
and ‘enum <anonymous>’
../../../trunk/libgfortran/io/write.c:1339: warning: comparison between ‘bt’
and ‘enum <anonymous>’

All these come from the use of two different enums for one purpose: the bt enum
in libgfortran/io/io.h and the anonymous enum containing GFC_DTYPE_UNKNOWN,
GFC_DTYPE_INTEGER and friends in gcc/fortran/libgfortran.h. I'm not sure at all
why there are two different enums, why their constants are sometimes used as if
they were interchangeable (all the warnings above come from such uses), but
what I know is that they shouldn't: the constants don't even come in the same
order!

Compare:

  GFC_DTYPE_UNKNOWN = 0,        
  GFC_DTYPE_INTEGER,            
  GFC_DTYPE_LOGICAL,            
  GFC_DTYPE_REAL,
  GFC_DTYPE_COMPLEX,
  GFC_DTYPE_DERIVED,
  GFC_DTYPE_CHARACTER

with

  BT_NULL, /* ok, null and unknown are close enough */
  BT_INTEGER,
  BT_LOGICAL,
  BT_CHARACTER, /* oops */
  BT_REAL, /* re-oops */
  BT_COMPLEX /* final oops */
  /* and where is "derived"? */


-- 

fxcoudert at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
   Last reconfirmed|2007-10-18 13:22:40         |2009-05-03 16:28:50
               date|                            |
            Version|4.0.2                       |4.5.0


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

Reply via email to