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
Index: gcc/fortran/ChangeLog
===================================================================
--- gcc/fortran/ChangeLog	(Revision 198378)
+++ gcc/fortran/ChangeLog	(Arbeitskopie)
@@ -1,3 +1,10 @@
+2013-04-28  Tobias Burnus  <bur...@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  <tkoe...@gcc.gnu.org>
 
 	PR fortran/57071
@@ -6,9 +13,9 @@
 
 2013-04-25  Janne Blomqvist  <j...@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  <ja...@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  <bur...@net-b.de>
+
+	PR fortran/57093
+	* gfortran.dg/coarray_30.f90: New.
+
 2013-04-28  Thomas Koenig  <tkoe...@gcc.gnu.org>
 
 	PR fortran/57071
@@ -43,7 +48,7 @@
 2013-04-25  Marek Polacek  <pola...@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.greenha...@arm.com>
 	    Tejas Belagod  <tejas.bela...@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" } }

Reply via email to