This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug fortran/35093] [4.3 Regression] gfortran.dg/data_constraints_1.f90



------- Comment #3 from burnus at gcc dot gnu dot org  2008-02-05 17:13 -------
==25387== Invalid free() / delete / delete[]
==25387==    at 0x4C2430F: free (in
/usr/lib64/valgrind/amd64-linux/vgpreload_memcheck.so)
==25387==    by 0x414BE9: gfc_assign_data_value (data.c:332)
==25387==    by 0x460C48: traverse_data_var (resolve.c:8253)
==25387==    by 0x46264D: resolve_types (resolve.c:8435)

That is the last mpz_clear in:

              mpz_t size;
              if (spec_size (ref->u.ar.as, &size) == SUCCESS
                   && mpz_cmp (offset, size) >= 0)
                {
                  mpz_clear (size);
                  gfc_error ("Data element above array upper bound at %L",
                             &lvalue->where);
                  return FAILURE;
                }
              mpz_clear (size);

The problem is that array.c's spec_size clears "size" (or "result" as it is
called there) if it returns FAILURE.

Patch (ignoring needed white-space changes):

Index: data.c
===================================================================
--- data.c      (Revision 132124)
+++ data.c      (Arbeitskopie)
@@ -321,8 +321,9 @@ gfc_assign_data_value (gfc_expr *lvalue,
          else
            {
              mpz_t size;
-             if (spec_size (ref->u.ar.as, &size) == SUCCESS
-                  && mpz_cmp (offset, size) >= 0)
+             if (spec_size (ref->u.ar.as, &size) == SUCCESS)
+               {
+                 if (mpz_cmp (offset, size) >= 0)
                {
                  mpz_clear (size);
                  gfc_error ("Data element above array upper bound at %L",
@@ -331,6 +332,7 @@ gfc_assign_data_value (gfc_expr *lvalue,
                }
              mpz_clear (size);
            }
+           }

          /* Splay tree containing offset and gfc_constructor.  */
          spt = expr->con_by_offset;


-- 

burnus at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |burnus at gcc dot gnu dot
                   |                            |org


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]