While looking at the use of gfc_free() in the front-end when discussing its 
removal, I noticed one instance where gfc_free_expr() should be used instead. 
The patch that fixes it is:


2011-03-12  Francois-Xavier Coudert  <fxcoud...@gcc.gnu.org>

        * arith.c (arith_power): Plug memory leak.


Index: arith.c
===================================================================
--- arith.c     (revision 170612)
+++ arith.c     (working copy)
@@ -912,7 +912,7 @@
        {
          gfc_error ("Raising a negative REAL at %L to "
                     "a REAL power is prohibited", &op1->where);
-         gfc_free (result);
+         gfc_free_expr (result);
          return ARITH_PROHIBIT;
        }
 


Without it, the following testcase :

  print *, (-2.0)**(1.3)
  end

leaks memory, as evidenced by valgrind:

==26601== 16 bytes in 1 blocks are definitely lost in loss record 6 of 287
==26601==    at 0x4A05E1C: malloc (vg_replace_malloc.c:195)
==26601==    by 0xD86668: __gmp_default_allocate (in /large/gcc/ibin/gcc/f951)
==26601==    by 0xD4912C: mpfr_init2 (in /large/gcc/ibin/gcc/f951)
==26601==    by 0x4B48D0: gfc_get_constant_expr (expr.c:165)
==26601==    by 0x48FEFC: arith_power (arith.c:791)
==26601==    by 0x48EB73: reduce_binary (arith.c:1387)
==26601==    by 0x48EF2D: eval_intrinsic (arith.c:1568)
==26601==    by 0x48F5C7: eval_intrinsic_f3 (arith.c:1701)
==26601==    by 0x4B94C5: gfc_simplify_expr (expr.c:1048)
==26601==    by 0x501E2A: gfc_resolve_expr (resolve.c:3977)
==26601==    by 0x50BA26: resolve_code (resolve.c:8997)
==26601==    by 0x50CFDB: gfc_resolve_blocks (resolve.c:8725)


With the patch, the leak disappears. It was regtested on x86_64-linux. OK to 
commit to trunk?

FX

Reply via email to