This patch is relatively trivial. This initialization of the string
length was not being done.

Bootstraps and regtests on FC28/x86_64. OK for trunk?

Paul


2018-09-17  Paul Thomas  <pa...@gcc.gnu.org>

    PR fortran/64120
    * trans-decl.c (gfc_get_symbol_decl): Flag allocatable, scalar
    characters with a variable length expression for deferred init.
    (gfc_trans_deferred_vars): Perform the assignment for these
    symbols by calling gfc_conv_string_length.

2018-09-17  Paul Thomas  <pa...@gcc.gnu.org>

    PR fortran/64120
    * gfortran.dg/allocatable_scalar_14.f90 : New test.
Index: gcc/fortran/trans-decl.c
===================================================================
*** gcc/fortran/trans-decl.c	(revision 264358)
--- gcc/fortran/trans-decl.c	(working copy)
*************** gfc_get_symbol_decl (gfc_symbol * sym)
*** 1745,1750 ****
--- 1745,1757 ----
  	  && !(sym->attr.use_assoc && !intrinsic_array_parameter)))
      gfc_defer_symbol_init (sym);
  
+   if (sym->ts.type == BT_CHARACTER
+       && sym->attr.allocatable
+       && !sym->attr.dimension
+       && sym->ts.u.cl && sym->ts.u.cl->length
+       && sym->ts.u.cl->length->expr_type == EXPR_VARIABLE)
+     gfc_defer_symbol_init (sym);
+ 
    /* Associate names can use the hidden string length variable
       of their associated target.  */
    if (sym->ts.type == BT_CHARACTER
*************** gfc_trans_deferred_vars (gfc_symbol * pr
*** 4603,4608 ****
--- 4610,4622 ----
  	      gfc_set_backend_locus (&sym->declared_at);
  	      gfc_start_block (&init);
  
+ 	      if (sym->ts.type == BT_CHARACTER
+ 		  && sym->attr.allocatable
+ 		  && !sym->attr.dimension
+ 		  && sym->ts.u.cl && sym->ts.u.cl->length
+ 		  && sym->ts.u.cl->length->expr_type == EXPR_VARIABLE)
+ 		gfc_conv_string_length (sym->ts.u.cl, NULL, &init);
+ 
  	      if (!sym->attr.pointer)
  		{
  		  /* Nullify and automatic deallocation of allocatable
Index: gcc/testsuite/gfortran.dg/allocatable_scalar_14.f90
===================================================================
*** gcc/testsuite/gfortran.dg/allocatable_scalar_14.f90	(nonexistent)
--- gcc/testsuite/gfortran.dg/allocatable_scalar_14.f90	(working copy)
***************
*** 0 ****
--- 1,17 ----
+ ! { dg-do run }
+ !
+ ! Test the fix for PR64120 in which the initialisation of the
+ ! string length of 's' was not being done.
+ !
+ ! Contributed by Francois-Xavier Coudert  <fxcoud...@gcc.gnu.org>
+ !
+    call g(1)
+    call g(2)
+ contains
+   subroutine g(x)
+       integer :: x
+       character(len=x), allocatable :: s
+       allocate(s)
+       if (len(s) .ne. x) stop x
+   end subroutine
+ end

Reply via email to