re PR fortran/64120 ([F03] Wrong handling of allocatable character string)
authorPaul Thomas <pault@gcc.gnu.org>
Mon, 17 Sep 2018 11:22:27 +0000 (11:22 +0000)
committerPaul Thomas <pault@gcc.gnu.org>
Mon, 17 Sep 2018 11:22:27 +0000 (11:22 +0000)
2018-09-17  Paul Thomas  <pault@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  <pault@gcc.gnu.org>

PR fortran/64120
* gfortran.dg/allocatable_scalar_14.f90 : New test.

From-SVN: r264365

gcc/fortran/ChangeLog
gcc/fortran/trans-decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/allocatable_scalar_14.f90 [new file with mode: 0644]

index 22435d3..3980146 100644 (file)
@@ -1,5 +1,13 @@
 2018-09-17  Paul Thomas  <pault@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  <pault@gcc.gnu.org>
+
        PR fortran/85954
        * resolve.c (resolve_assoc_var): If the target expression is a
        deferred charlen dummy and the associate name shares the
index e54d098..06066eb 100644 (file)
@@ -1745,6 +1745,13 @@ gfc_get_symbol_decl (gfc_symbol * sym)
          && !(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
@@ -4603,6 +4610,13 @@ gfc_trans_deferred_vars (gfc_symbol * proc_sym, gfc_wrapped_block * block)
              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 bcb851a..bf18605 100644 (file)
@@ -1,3 +1,8 @@
+2018-09-17  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/64120
+       * gfortran.dg/allocatable_scalar_14.f90 : New test.
+
 2018-09-17  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/87301
diff --git a/gcc/testsuite/gfortran.dg/allocatable_scalar_14.f90 b/gcc/testsuite/gfortran.dg/allocatable_scalar_14.f90
new file mode 100644 (file)
index 0000000..23f6bbf
--- /dev/null
@@ -0,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  <fxcoudert@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