diff mbox

[Fortran,committed] PR58579 - fix allocation of string temporaries: Avoid overallocation

Message ID 524C89FF.6060900@net-b.de
State New
Headers show

Commit Message

Tobias Burnus Oct. 2, 2013, 9:02 p.m. UTC
Tobias Burnus wrote:
> In gfc_conv_string_tmp, gfortran allocates temporary strings. However, 
> using "TYPE_SIZE (type)" didn't yield one byte as intended but 64 - 
> which means that gfortran allocated 64 times as much memory as needed.
>
> Committed (Rev. ) after building and regtesting on x86-64-gnu-linux. I 
> didn't see a simple way to generate a test case - but the dump of the 
> PR's test case looks fine both for kind=1 and kind=4 strings.

It turned out - see PR58593 - that one sometimes doesn't have an array 
type but a simple single-character type. Fixed by the attached patch.

Committed as Rev.  203135 after build+regtesting on x86-64-gnu-linux.

Tobias
diff mbox

Patch

Index: gcc/fortran/ChangeLog
===================================================================
--- gcc/fortran/ChangeLog	(Revision 203134)
+++ gcc/fortran/ChangeLog	(Arbeitskopie)
@@ -1,3 +1,9 @@ 
+2013-10-02  Tobias Burnus  <burnus@net-b.de>
+
+	PR fortran/58593
+	* trans-expr.c (gfc_conv_string_tmp): Fix obtaining
+	the byte size of a single character.
+
 2013-10-01  Tobias Burnus  <burnus@net-b.de>
 
 	PR fortran/58579
Index: gcc/fortran/trans-expr.c
===================================================================
--- gcc/fortran/trans-expr.c	(Revision 203134)
+++ gcc/fortran/trans-expr.c	(Arbeitskopie)
@@ -2357,8 +2357,9 @@  gfc_conv_string_tmp (gfc_se * se, tree type, tree
       var = gfc_create_var (type, "pstr");
       gcc_assert (POINTER_TYPE_P (type));
       tmp = TREE_TYPE (type);
-      gcc_assert (TREE_CODE (tmp) == ARRAY_TYPE);
-      tmp = TYPE_SIZE_UNIT (TREE_TYPE (tmp));
+      if (TREE_CODE (tmp) == ARRAY_TYPE)
+        tmp = TREE_TYPE (tmp);
+      tmp = TYPE_SIZE_UNIT (tmp);
       tmp = fold_build2_loc (input_location, MULT_EXPR, size_type_node,
 			    fold_convert (size_type_node, len),
 			    fold_convert (size_type_node, tmp));
Index: gcc/testsuite/ChangeLog
===================================================================
--- gcc/testsuite/ChangeLog	(Revision 203134)
+++ gcc/testsuite/ChangeLog	(Arbeitskopie)
@@ -1,3 +1,8 @@ 
+2013-10-02  Tobias Burnus  <burnus@net-b.de>
+
+	PR fortran/58593
+	* gfortran.dg/char_length_19.f90: New.
+
 2013-10-02  Paolo Carlini  <paolo.carlini@oracle.com>
 
 	PR c++/58535
Index: gcc/testsuite/gfortran.dg/char_length_19.f90
===================================================================
--- gcc/testsuite/gfortran.dg/char_length_19.f90	(Revision 0)
+++ gcc/testsuite/gfortran.dg/char_length_19.f90	(Arbeitskopie)
@@ -0,0 +1,44 @@ 
+! { dg-do compile }
+!
+! PR fortran/58579
+!
+! Contributed by Joost VandeVondele
+!
+! Was ICEing before due to the patch for PR 58593
+!
+  subroutine test
+    CHARACTER(len=20)                        :: tmpStr
+    CHARACTER(len=20, kind=4)                :: tmpStr4
+    INTEGER :: output_unit=6
+       WRITE (UNIT=output_unit,FMT="(T2,A,T61,A20)")&
+         "DFT| Self-interaction correction (SIC)",ADJUSTR(TRIM(tmpstr))
+       WRITE (UNIT=output_unit,FMT="(T2,A,T61,A20)")&
+         4_"DFT| Self-interaction correction (SIC)",ADJUSTR(TRIM(tmpstr4))
+   END
+
+!
+! PR fortran/58593
+! Contributed by Albert Bartok
+!
+! The PR was overallocating memory. I placed it here to check for a
+! variant of the test case above, which takes a slightly differnt code
+! patch. Thus, its purpose is just to ensure that it won't ICE.
+!
+program test_char
+
+   implicit none
+   integer :: i
+
+   read*, i
+   print*, trim(test(i))
+
+   contains
+
+      function test(i)
+         integer, intent(in) :: i
+         character(len=i) :: test
+
+         test(1:1) = "A"
+      endfunction test
+
+endprogram test_char