Patchwork [Fortran] PR57093 - fix to-small malloc size with scalar coarrays of type character

login
register
mail settings
Submitter Tobias Burnus
Date April 28, 2013, 8:02 p.m.
Message ID <517D8060.2050400@net-b.de>
Download mbox | patch
Permalink /patch/240305/
State New
Headers show

Comments

Tobias Burnus - April 28, 2013, 8:02 p.m.
The problem is a bit nested but the solution is obvious:

The type (TREE_TYPE) of an array is an array type - and one needs to 
drill one level deeper to get the element type. For allocatable scalar 
coarrays, one has an array descriptor to handle the bounds (and, with 
-fcoarray=lib, to store the coarray token) but the type is a scalar. 
gfc_get_element_type by default applies TREE_TYPE twice - which is once 
to much for coarrays. There was a check that this is not done for 
arrays. Unfortunately, character strings are internally arrays as well. 
Thus, the second TREE_TYPE didn't give the array (with the proper string 
length) but an element of the string, which only had size 1 (for kind=1 
characters). The solution is obvious, see patch.

Committed as Rev. 198379 after bootstrapping and regtesting on 
x86-64-gnu-linux.

Tobias

Patch

Index: gcc/fortran/ChangeLog
===================================================================
--- gcc/fortran/ChangeLog	(Revision 198378)
+++ gcc/fortran/ChangeLog	(Arbeitskopie)
@@ -1,3 +1,10 @@ 
+2013-04-28  Tobias Burnus  <burnus@net-b.de>
+
+	PR fortran/57093
+	* trans-types.c (gfc_get_element_type): Fix handling
+	of scalar coarrays of type character.
+	* intrinsic.texi (PACK): Add missing ")".
+
 2013-04-28  Thomas Koenig  <tkoenig@gcc.gnu.org>
 
 	PR fortran/57071
@@ -6,9 +13,9 @@ 
 
 2013-04-25  Janne Blomqvist  <jb@gcc.gnu.org>
 
-        PR bootstrap/57028
-        * Make-lang.in (f951): Link in ZLIB.
-        (CFLAGS-fortran/module.o): Add zlib include directory.
+	PR bootstrap/57028
+	* Make-lang.in (f951): Link in ZLIB.
+	(CFLAGS-fortran/module.o): Add zlib include directory.
 
 2013-04-22  Janus Weil  <janus@gcc.gnu.org>
 
Index: gcc/fortran/intrinsic.texi
===================================================================
--- gcc/fortran/intrinsic.texi	(Revision 198378)
+++ gcc/fortran/intrinsic.texi	(Arbeitskopie)
@@ -9619,7 +9619,7 @@  Fortran 95 and later
 Transformational function
 
 @item @emph{Syntax}:
-@code{RESULT = PACK(ARRAY, MASK[,VECTOR]}
+@code{RESULT = PACK(ARRAY, MASK[,VECTOR])}
 
 @item @emph{Arguments}:
 @multitable @columnfractions .15 .70
Index: gcc/fortran/trans-types.c
===================================================================
--- gcc/fortran/trans-types.c	(Revision 198378)
+++ gcc/fortran/trans-types.c	(Arbeitskopie)
@@ -1179,7 +1179,7 @@  gfc_get_element_type (tree type)
       element = TREE_TYPE (element);
 
       /* For arrays, which are not scalar coarrays.  */
-      if (TREE_CODE (element) == ARRAY_TYPE)
+      if (TREE_CODE (element) == ARRAY_TYPE && !TYPE_STRING_FLAG (element))
 	element = TREE_TYPE (element);
     }
 
Index: gcc/testsuite/ChangeLog
===================================================================
--- gcc/testsuite/ChangeLog	(Revision 198378)
+++ gcc/testsuite/ChangeLog	(Arbeitskopie)
@@ -1,3 +1,8 @@ 
+2013-04-28  Tobias Burnus  <burnus@net-b.de>
+
+	PR fortran/57093
+	* gfortran.dg/coarray_30.f90: New.
+
 2013-04-28  Thomas Koenig  <tkoenig@gcc.gnu.org>
 
 	PR fortran/57071
@@ -43,7 +48,7 @@ 
 2013-04-25  Marek Polacek  <polacek@redhat.com>
 
 	PR tree-optimization/57066
-        * gcc.dg/torture/builtin-logb-1.c: Adjust testcase.
+	* gcc.dg/torture/builtin-logb-1.c: Adjust testcase.
 
 2013-04-25  James Greenhalgh  <james.greenhalgh@arm.com>
 	    Tejas Belagod  <tejas.belagod@arm.com>
Index: gcc/testsuite/gfortran.dg/coarray_30.f90
===================================================================
--- gcc/testsuite/gfortran.dg/coarray_30.f90	(Revision 0)
+++ gcc/testsuite/gfortran.dg/coarray_30.f90	(Arbeitskopie)
@@ -0,0 +1,15 @@ 
+! { dg-do compile }
+! { dg-options "-fcoarray=single -fdump-tree-original" }
+!
+! PR fortran/57093
+!
+! Contributed by Damian Rouson
+!
+program main
+  character(len=25), allocatable :: greeting[:]
+  allocate(greeting[*])
+  write(greeting,"(a)") "z"
+end
+
+! { dg-final { scan-tree-dump-times "greeting.data = \\(void . restrict\\) __builtin_malloc \\(25\\);" 1 "original" } }
+! { dg-final { cleanup-tree-dump "original" } }