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" } }